美文网首页AS
合并 aar 文件

合并 aar 文件

作者: 看我眼前007 | 来源:发表于2017-04-19 11:02 被阅读770次

    需求

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

    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 库

    相关文章

      网友评论

      • stefanli:一直报这个错,请问有什么解决方案吗?【Error:Could not get unknown property 'packageReleaseResources' for project ':app' of type org.gradle.api.Project.】
        看我眼前007:命令只能打包,但是无法直接在项目上run 。如果 run 需要把配置改回来,并且清理 build 目录。
        只能使用gradle plugin 2.2.3

      本文标题:合并 aar 文件

      本文链接:https://www.haomeiwen.com/subject/acvczttx.html