将一些项目中的一些独立功能打包成aar,不只能于项目解耦,还可以提供给其它项目使用相同的功能,可谓是为项目开发带来了很大的便利。最近第一次作sdk,碰到一些问题,花了很多时间才解决,因此这里作一下简单的记录,方便之后参考,也但愿可以给碰到一样问题的朋友提供一些便利。android
本篇包含以下两种打包场景:git
(1)Module中不含有其它aargithub
(2)Module中嵌套第三方aarapp
一、Module中不含有也不依赖其它第三方aargradle
(1)在Project中新建Module,这里以默认名为app的Module来举例,在app中实现须要封装的功能。ui
(2)进入到app的build.gradle文件xml
在①处,将 apply plugin: 'com.android.application' 修改成 apply plugin: 'com.android.library',该Module会变成了一个library。blog
在②处,注释掉applicationId这一行。因为打包后该Module再也不是一个独立的应用,而是一个其它项目的附属,因此它不配拥有独立的applicationId!(开个玩笑,但愿这个aar不要生气罢工哈-_-)。开发
(3)进入到AnroidManifest.xml中部署
在③处,若是有自定义的Application类,把这行删掉。由于打包成aar并被其它项目引用后,该AnroidManifest.xml会和所在项目的AnroidManifest.xml合并,所谓“一山不容二虎”,因此这里必须删除掉。
在④处,icon这一行也要去掉。道理和上面同样,否者aar被引入到项目中并安装后,桌面上会出现两个图标,其中一个还不能运行。
(4)进入到Gradle界面
点击⑤处,等上几秒钟,就可以生成aar了,aar路径以下图:
二、该Module中包含有其它aar
Module依赖其它aar的场景,多是该aar在Module的libs目录中,也可能在某个独立的Module中,只是主Module依赖了该aar所在的Module。这里我碰到的是第一中状况,也就是该aar在Module的libs目录中的状况,这里我们要用到fataar方案。
(1)先看看总体Project的部署状况,A处是嵌套的aar
(2)进入到B处的build.gradle文件
文件中要加上D处这一行,应用fat-aar。因为是libs中的aar是嵌套的,因此在E处须要用embed。
(3)进入到C处的build.gradle,也就是整个Project的build.gradle文件
按照上图中的,添加F、G、H处的代码。
结合场景1的操做,再根据上述的3个步骤,这个嵌套了第三方aar的目标aar就生成了。
三、答疑
问:若是咱们只采用(1)中的步骤,而不是使用fataar的方式来打包嵌套第三方aar包的aar,那会出现什么问题呢?
答:若是只采用(1)中的方式,也能生成aar。可是咱们的项目在使用时就须要依赖咱们生成的aar,还要在项目中依赖这个第三方aar,可见这并非咱们想要看到的。固然,还有其它的打包方式来解决aar嵌套aar问题的方案,fataar方式只是其中一种,至于其它方式笔者没有研究过,读者能够本身尝试一下。
四、推荐阅读
以下连接中包含了更多使用fataar打包复杂aar的场景,碰到相同场景的朋友能够参考该连接:https://github.com/kezong/fat-aar-android 。