android studio支持把一个库工程输出为aar格式,aar格式除了.class文件外,还可以包含资源文件,库文件等,这就在一定程度上弥补了jar的不足。
这样发布一个sdk就可以以aar格式发布一些带界面逻辑的功能。但由于模块化和依赖等原因,项目有时会生产许多个aar,发布多个aar文件显然不是一个好的方案,
并且还有混淆的问题。所以最好的方法是把所有的aar合并为一个,这个最终的aar保护所有的依赖的aar和so文件等。
其实aar本身就是个zip格式的文件,我们生成aar压缩文件里的所有文件,我们就可以合成最终的aar。
一 建一个空的app工程,并且grade编译版本设置为1.3
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
二 在app工作中,应用所有的aar。
2.1 将所以aar文件复制到app工程的libs目录下
2.2 引用所有lib工程
compile(name: '工程名', ext: 'aar')
2.3
repositories {
flatDir {
dirs 'libs'
}
}
三 打开混淆开关,编译release版
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
四 取出编译中生产的文件,合并aar,可以自己写脚本
jar位置: uildintermediatesclasses-proguard
eleaseclasses.jar
R.txt,res等文件都能在intermediates目录下找到相应的所有aar合并后的相应文件。
这些文件都找到后,按aar文件的目录格式放在一起,然后把这个目录压缩为zip包, 这就是最终的合并后的aar文件。
五 这里要特殊处理下:
解析R.txt文件,把里面的所有资源类型,声明一份占位的资源文件aar_res.xml
<resources>
<public id="0x71100110f" name="base_fragment" type="layout" />
<public id="0x71100111f" name="base_bk" type="color" />
<public id="0x71100112f" name="button" type="id" />
</resources>
如果是类型是id,还需要一个id列表声明文件ids.xml
<resources>
<item name="button" type="id" />
</resources>
六 将aar_res.xml和ids.xml 和步骤五生成的.aar文件一起打包给发布,即可。