最近公司有个新项目,把原来的一个应用移植到另一个应用上,通过aar的形式。aar嘛,这也没多大事,成功编译,不就会生成aar文件嘛,这有什么难的(理想很美好,现实很骨感),撸起袖子就开始干。
我们公司的项目是多组件,多module嵌套的形式,各种module之间相互依赖,如果是单独的一个module还好办,但是多module的情况下,你就得考虑各种冲突等等问题了。关于多module打包成aar的形式,网上各路大神说的方法都是用的android-fat-aar,这个我也专门研究过了,是可以将多module打包成一个aar,但是它有很多问题:
- 相同名字的资源文件,会覆盖掉
- android-fat-aar只能打包gradle2.2之前的版本(现在大部分都3.0以上了),并且不能打包可运行的module,只能打包Android library和java library
- 库里引用了第三方的库,主工程重新要引用aar中的第三方库
-
合并AndroidManifest的时候,会有各种冲突。
总结:如果你的各种module之间相互嵌套,那就最好别用,会有很多各种各样的问题,一大堆(我就是遇到过,光解决问题,就花了好长时间,傲娇的我,果断拒绝了)
后面我采用了另一种方式,单个module,单个aar的模式,然后把这些aar都拷贝到新项目libs下引用,这样是可行的(这个要先说,避免走坑,亲身实践)。
还有一点要说明的是:Jar包的形式跟aar的形式还是有些不一样的,aar是把资源文件和class文件一起打包。但是aar只支持Android Library,原来的项目是一个应用,所以你得把原来的项目改成一个Android Library。
首先,在该应用的gradle下面,修改如下:
然后,去掉applicationId相关的,毕竟你是一个Android Library,哪来的applicationId呢?把gradle里面,跟应用相关的都可以去掉,比如你原来的项目用到了热修复Tinker(我们项目就用到了),也得注释掉,因为你的Tinker需要用到applicationId。
当前面那些准备工作做完以后,重新编译,这些library,就会在他们的build->outputs中生成一个.aar的文件,并且你可以选择是debug.aar,还是release.aar,都可以,最好是用release.aar。还可以在AS右边gradle选择编译什么类型的
处理完了gradle,接着就是AndroidManifest了,因为是作为module依赖,你也得去掉AndroidManifest中application标签的属性,没错,全去掉,还有记得把Activity的launcher也去掉(这个大家都明白),其他的就不用动了。
最后一步就是application了,因为一个应用只能引用一个application(当然你可以写多个,但是在AndroidManifest中只引用一个),所以原来application中的东西,你得把它移植到新项目的application中,这些准备工作做完,其他module(也包括原来的项目module)的工作就做完了,现在是新项目的工作了,开干!!!
接下来就是在新项目的gradle中引用了
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
//然后就是依赖你所用的aar
compile(name:'your aar name', ext:'aar')
}
你以为这样就算完了?其实并没有,其他module引用到的第三方的库,也要重新添加到新项目中依赖,不然会报找不到的错误的,还有就是前面说的,把原来项目application里面的东西,copy到新项目中(一定要,切记)。
好了,走过了那么多弯,这算是我自己亲身实践总结下来的,比较靠谱的做法,特别是针对多module,相互嵌套依赖的形式,欢迎大家批评指正。