Android模块化到组件化方案分享(2)

上篇文章笔者分享的组件化主要是项目内组件化,毕竟在一个项目中,组件间也是有一定的耦合性。例如跳转不用Arouter依然可以跳转,每个组件不单独开放接口,也不影响使用。所以项目内组件化和项目外组件还是有一定的差别。

组件化不是将大的工程拆分成几个子工程就叫组件化,组件化的本质,就是组件在没有依赖或者很少依赖的情况下和其他组件通信,可以独立存在的。独立存在的基础上,在让其他组件能正确且便捷的使用它。

这篇文章介绍下,将项目的各个组件单独抽出,然后单独扯一个git分支,独立开发。然后根据各个成型的组件,去开发定制产品。

组件的划分

要想单独开发每一个分支,就必须合理的拆分组件。笔者是给项目拆分了3类组件。分别是业务组件、公共业务组件、功能组件。

业务组件

不同业务的功能模块,具体和公司业务相关。例如我司的业务开门模块,论坛模块、新闻广告模块、电商模块、金豆集卡模块、物管模块等,每一个业务模块都可以划分成一个业务组件。

公共业务组件

公共的业务逻辑、公共的工具类,以及公共的ui,和通用的自定义view,能被放到这里面的代码,共性就是至少有2个组件都需要的。

功能组件

例如基础框架,网络组件,缓存组件,支付组件等,这些都是和公司业务没有关系,每一个项目如果需要都可以直接引入并且使用。

如何引入组件

本地aar引入

在项目使用aar时候,不管是否使用implementation或者api关键字,其相关依赖都不会被编译到aar文件中,导致aar自身需要的远程依赖查找不到。解决方法就是将aar需要的自身依赖在引入aar工程项目中再手动声明一遍,供aar使用,这样太不方便了,而且有额外工作量。

经过一番查找,发现码友们为了解决此问题,有人开发出来了一个 Gradle 插件 android-fat-aar(https://github.com/adwiv/android-fat-aar ), 这种方式是抛弃 Android Studio 自带的打包 AAR 的方法,而是自己编写一个生成 AAR 的脚本。的确没有难道的程序员,但是唯一不好的就是,需要降低gradle版本,这一点也是我pass掉这种做法的原因,毕竟gradle的版本紧随谷歌爸爸有利无害。

远端仓库引入

如果将library打成aar上传到远端仓库呢?例如jitpack、jcenter、私服等。在尝试之后可以发现将aar传到远端仓库,之后远程依赖引用,项目引入aar之后也可以获取aar自身需要的远程依赖。为什么呢?因为aar在上传私服的时候,他会传一个.pom文件,而这个pom文件会有记录它的远程依赖库,所以在引入私服的aar时候就会将它的远程依赖库随着下载,供aar使用。私用远端仓库无疑是一个不错的选择。

但是仓库这么多,用哪个比较合适呢?jitpack的确方便,毕竟是github登录,个人账户,不适合公司项目。jcenter上传流程复杂,而且需要审核时间,这如果要上线岂不是还要等各组件审核通过,没比较把时间浪费在这。公司内部搭建nexus私服,上传简单,而且添加权限无需审核。具体如何通过Jcenter,或者私服可以参考笔者这两篇文章。

如何将Android studio中Library发布到Jcenter
https://blog.csdn.net/f917386389/article/details/52121809
如何将Android studio中Library发布到私服Nexus仓库
https://blog.csdn.net/f917386389/article/details/87741281

私服上传问题

1>嵌套依赖问题

如果被打成aar的library,自身除了有三方远程依赖库外,还有本地library依赖的外,上传私服就会报另外一种错误,就是查到不到依赖的本地library,奇怪不是pom文件都记录了它所依赖库吗,打开远端pom文件看到,相应的library的version为unspecified。

<dependency>
<groupId>shopcomponent</groupId>
<artifactId>mylibrary</artifactId>
<version>unspecified</version>
<scope>compile</scope>
</dependency>
</dependencies>

因为maven是通过在进行对库的管理,上传时候并没有版本,所以它也无法设置版本号。所以如果使用私服maven管理aar的时候,你需要将aar依赖的本地library先上传到私服maven,然后这个library在gradle去依赖,在将这个library打成aar传私服maven,然后通过方式去引入。

2>不同仓库类型使用

每一次修改代码都需要aar重新打包,上传,如果你没有变更版本号,就会报次错,因为release版本不运行相同版本存在。nexus私服为了解决这个不便,新增了不同类型的仓库。一个是release,一个是snapshot。其中snapshot适合我们平时开发时候,每次修改代码无须修改版本号,直接打包提交,也能成功上传,并且可以下载使用。

需要注意的是,要使用snapshot仓库不仅仅是更换仓库地址,而且需要将上传的aar的版本信息后面添加-SNAPSHOT才可以,切记!

3>Android Studio引入的External Libraries存放在本地什么地方?

有时间我们需要更新新的library版本,由于本地有缓存,点击同步不能下载下来,我们可以找到本地library手动删除,在去同步下载。

Mac系统默认下载到:

/Users/(用户名)/.gradle/caches/modules-2/files-2.1

Windows系统默认下载到:

C:\Users\(用户名)\.gradle\caches\modules-2\files-2.1

组件的整合

在做定制产品时候,需要将不同的业务组件整合到一块,不同的业务组件里面会包含相同的公共业务组件以及功能组件。之前想着用implementation取代api引入,因为在android studio3.0之后,implementation和api取代了compile,而且implementation不可以向上传递依赖。但是这个是有前提的,前提是都是本地引入,对于远端仓库引入library时,无论是implementation还是api依旧可以传递依赖。例如引入不同的业务组件,它们都包含公共业务组件以及功能组件,这时候gradle引入的私服仓库时候,它会自动去重,优先取第一个引入的。如果你强行要过滤某个组件,可以使用exclude关键字。

implementation ('com.zzti.fyg:logincomponent:0.0.1-SNAPSHOT',{
exclude group: 'com.zzti.fyg',module: 'basebusiness'
})

统一不同业务组件的buildTypes

每一个library 中的 build.gradle 文件设置都可以设置 buildTypes 代码,但通过 要上传到私服上的 aar 包只能是 release 版本,自然也无法获取到那些动态配置的常量值。例如切换线上线下地址,毕竟我们最后更换Build Variants是要手动切换,所以我的做法是由壳添加变量,然后传入basebusiness组件中,然后每一个业务组件接口请求都需要baseurl,这个baseurl都通过basebusiness组件中去获取。这样就可以通过更改壳的buildTypes,来更换所有业务组件的buildTypes变量。

上一篇Android模块化到组件化方案分享(1)

https://www.jianshu.com/p/41835fefbfc0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353