AS

合并 aar 文件

2017-04-19  本文已影响770人  看我眼前007

需求

当一个功能模块特别庞大的时候,业务功能的耦合也会特别严重。耦合度增高,会导致维护成本越来越高。这时候需要对改功能模块进程进一步的拆解,降低业务功能的耦合。

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
使用说明
  1. fat-aar 在 gradle 2.3.1 使用的时候会报错(fat-aar 的github issue 里面已经有人提出),这里建议使用 gradle 2.2.3 进行编译(其他版本也可以试一下)。

  2. fat-aar 合并 aar 的时候注意不要把一些公用库合并进去(比如 v7、v4)之类的。如果 test、moduleA、moduleB 这三个模块之中有重复的依赖,fat-aar会报错提示你某些类或者资源文件冲突。

  3. fat-aar 最好只用来合并 aar 使用,embedded 属性不等同 compile,开发和调试模块时最好使用 compile 属性,打包时使用 embedded 合并 aar 。

  4. 查看 aar ,可以使用ClassyShark

参考资料

Android多模块构建合并aar解决方案

android-fat-aar

创建 Android 库

上一篇 下一篇

猜你喜欢

热点阅读