需求
当一个功能模块特别庞大的时候,业务功能的耦合也会特别严重。耦合度增高,会导致维护成本越来越高。这时候需要对改功能模块进程进一步的拆解,降低业务功能的耦合。
merge_aar_picture_1.png拆分之前,所有的业务功能再同一个模块之中,无意间会调用其他业务的功能。拆分以后每个业务功能在单独的一个模块,只要控制不要互相依赖关系,就可以隔绝模块之间互相调用。
问题
拆分之前我们输出的是一个 aar 文件(即便你使用了 module 依赖,也可以看成是 aar 文件依赖),拆分以后我们需要输出 N 个 aar 文件。那么多的 aar 文件,管理起来也是一个麻烦的问题。
merge_aar_picture_2.png解决方案
使用 maven
我们可以把每个模块输出的 aar 长传到 maven 仓库进行管理,可以用使用 Nexus 搭建私有仓库或者使用 jcenter 之类的公共仓库托管。
合并 aar
merge_aar_picture_3.png如上图所示,我们把拆分模块后输出的 N 个 aar 文件进行合并,这样原来使用 A 模块的调用者依旧保持就的方式不变,A 模块本身又可以进行模块解耦。
Android 专用开发工具 AndroidStudio 不提供 aar 合并的功能。 经过一番 Google 以后找到一个 android-fat-aar 开源项目可以做到合并 aar 。
由于 aar 文件本身是一个 zip 压缩包参考Android官方解释 ,fat-aar 利用 gradle 对外暴露的一些方法,讲 aar 文件进行合并。
使用方式
在 module 的目录放置一份 fat-aar.gradle 文件,然后在 module 的 build.gradle 文件中如下配置
apply from: 'fat-aar.gradle'
//repositories {
// flatDir {
// dirs "libs"
// }
//}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// embedded(name: 'moudleA', ext: 'aar')
// embedded(name: 'moudleB', ext: 'aar')
// compile rootProject.libSupportAppcompatV7
// compile project(':moudleA')
// compile project(':moudleB')
embedded project(':moudleA')
embedded project(':moudleC')
}
embedded 是 fat-aar 定义的一个属性,表示把对应的 module、aar 文件或者 maven仓库的 aar 合并到当前(test module之中)。
然后执行代码
gradlew :module-export:assembleRelease
module-export 的 build 目录下回多出一个 fat-aar 目录,outputs/aar 目录下输入的 test-release.aar 已经把 moduleA 和 moduleB 的aar 合并到 test-release.aar 之中。
merge_aar_picture_4.png使用说明
-
fat-aar 在 gradle 2.3.1 使用的时候会报错(fat-aar 的github issue 里面已经有人提出),这里建议使用 gradle 2.2.3 进行编译(其他版本也可以试一下)。
-
fat-aar 合并 aar 的时候注意不要把一些公用库合并进去(比如 v7、v4)之类的。如果 test、moduleA、moduleB 这三个模块之中有重复的依赖,fat-aar会报错提示你某些类或者资源文件冲突。
-
fat-aar 最好只用来合并 aar 使用,embedded 属性不等同 compile,开发和调试模块时最好使用 compile 属性,打包时使用 embedded 合并 aar 。
-
查看 aar ,可以使用ClassyShark
网友评论
只能使用gradle plugin 2.2.3