1、概述
在Android项目开发过程中,为了达到解耦的目的,组件化是一个非常好的思路,并且技术比较成熟,实现起来投入的人力成本和时间成本不是很高。是一个投入产出比比较高的方案。
但是,在组件化工程中,却面临着一个非常尴尬的问题,组件化的作用是将功能解耦,打包的时候可以选择需要的组件进行,在apk项目中这是一个非常大的优势。但是对于开发SDK来说,这引起了另外一个问题:SDK本身就是一个Library,打包的时候会自动打成一个aar包,但是对于SDK依赖的组件,也都是一个个的Library,这样就导致为了编译一个SDK,会生成多个aar文件(每个组件都会打包成一个独立的aar)。另外如果SDK本身又集成了第三方的aar包,此时项目对接的时候,就必须集成多个aar。集成非常不方便且不便于管理。
这就需要我们对多个aar进行合并。但是非常遗憾,AndroidStudio本身并没有提供类似的方法。好在github上有个大神开源了一种方案合并方案fat-aar,但是该方案对于2.3以上版本的gradle支持不是很好,会有很多意想不到的坑。且作者已经N久没有更新和维护了。
针对上述问题,我们需要对fat-aar.gradle脚本做优化,一个是对gradle2.3以上版本做兼容处理,一个是对合并过程中报错的地方做优化。优化的内容在下面会逐步提到。
下面会详细介绍集成方法和注意事项。
2、集成方法
(1)、将优化后的fat-aar.gradle拷贝到module的根目录下:
(2)、在module的build.gradle脚本中引用fat-aar
(3)、在build.gradle脚本中将compile(name: 'lib-xxx', ext: 'aar')修改为embedded(name: 'lib-xxx', ext: 'aar')
(4)、在dependencies.gradle文件中,使用embedded project方法依赖其它组件。
(5)、编译当前的module
(6)、编译完成后,在build/output/aar目录下,xxx-release.aar即为合并后的aar,可以打开该aar,查看是否合并成功
(7)、将合并后的aar集成到项目中,进行测试。
3、已知问题
(1) 对于集成的第三方aar,如果第三方aar有依赖于自己远程仓库中的资源,合并后的aar集成后,会报运行时异常,报某个类找不到等问题。
解决办法:
方法一:此时需要将第三方aar依赖的远程仓库maven的url配置在build.gradle中,打包时会自动将依赖合并。
方法二:让第三方aar打包时,将远程依赖在本地集成,然后提供新的aar包。
(2) 对于合并过程中,报资源Id找不到,先确认报错的资源Id是否有用,如果对于自己的工程有用,请优先解决资源找不到的问题。如果资源Id对于自己的工程没有用处,可以在fat-aar中优化脚本,将无用的资源Id过滤掉。在合并过程中,对于appcompat_v7资源包或者appcompat_v4资源包,很容易出现资源Id找不到的问题,一般都是由于版本不一致导致的。此时可以在脚本中将引用不到的资源Id过滤掉。
(3) fat-aar目前不支持debug编译,即使用debug编译合并的aar,并没有真正合并,不过脚本可以优化。
4、附录
fat-aar地址:https://github.com/adwiv/android-fat-aar