前言
现在通过Android Studio进行多Module开发已经非常常见了,除了方便我们分离项目业务,还可以很好的实现基础代码的复用
问题
我们在多Module开发后,如果是直接打包apk还好,直接可以通过gradle命令或者通过AS图形化界面就可以实现打包apk;但是如果我们只是为了提供一个功能模块,方便其他开发人员接入呢,我们使用了多个Module,能不能最终只对外提供一个aar呢,而不是每个Module都生成一个aar?
解决方案
在github上有个类似的项目,解决思路大概是在gradle的打包任务不同task中插入一些task,从而实现将多个Module最终打包成一个aar。
项目地址
缺点: Android gradle的版本更新较快,维护成本太大,作者应该也是看着维护成本较大,所以后来不维护了吧
在需求的不断紧逼下,最终我们通过另外一种方式来实现,思路如下:
在打包aar前,先将多个Module合并成一个Module,合并成一个Module后再通过gradle来打包aar,这样打包出来就是一个aar了。
主要需要解决如下两个问题:
- 资源文件的合并
- 多个Module下的Manifest文件中的标签的合并
资源合并还好,只要在复制到同一个Module前,分别将不同Module下的资源文件做重命名即可,最好在开发时对不同Module使用不同的前缀来区分,这样合并会更方便;
Manifest的合并,所依赖的三方不需要我们来合并(接入者依赖后AS会自动将三方合并),主要是我们自己的Module中Manifest的合并,主要有如下几种思路:
- 当前我们也可以将所有的标签统一放到一个Module中,打包aar时指定使用的Manifest即可;
- 按照Android Developers上Manifest合并规则,编写合并脚本
- 使用Android gradle的Manifest合并task
这里主要说第三种思路,相应的task为 processReleaseManifest
,步骤如下:
- 执行每个Module的
assembleRelease
,为每个Module生成一个aar - 新建一个Application的Module,即
apply plugin: 'com.android.application'
可生成apk的Module(因为只有这个Module才会有processReleaseManifest
这个task) - 运行改Module的
processReleaseManifest
,即可在build目录下的文件中找到生成的Manifest文件(这里需要注意下,每次Android gradle大版本升级,生成的Manifest目录会不相同) - 通过这个Manifest和合并好的资源文件/Java源文件,组成一个Module,通过
assembleRelease
来打包成一个aar
以上步骤可以通过gradle脚本在临时目录下进行,打包完成后,再进行删除,只输出最终产物,实现自动化