前文说过,最近在做SDK的工作。遇到一个问题,我拆分了本地的项目,分离出两个android module出来,期望打包是只打出一个AAR包出来的。但是实际上,打出来的包却缺手缺脚。
这里的问题就是,有多个本地的aar项目应该怎么合并成一个aar?
这个问题许多人遇到过,查了一下,有一个fat-aar的概念。有许多开源的实现。如果你需要的话:
上面最成熟的应该是Mobbeel的插件,看起来也专业一点。
build.gradle
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.mobbeel.plugin:fat-aar:2.0.3"
}
}
xxxlibrary/build.gradle
apply plugin: "com.mobbeel.plugin"
dependencies {
api "com.mobbeel:my-lib:1.0.0" // <- Embed external dependency from any repository
api project(':My-lib-module') // <- Embed internal dependency on workspace
...
}
aarPlugin {
includeAllInnerDependencies true // It's false for default
}
但是这个实现有BUG,AndroidMainfest的资源没有合并进去。困扰了一个上午,我以为是我自己的打开方式不对,也找了其他类似的gradle插件去试试,结果都一样。就是没按照我的期望去合并。
我期望的是什么效果呢?
- jvm(class)代码全部合并到classes.jar
- android AndroidMainfest能自动合并
回到问题本身,gradle打包是不是完全不能满足要求呢?
不是的。有个关键的方法 minifyEnabled
android{
buildTypes{
release {
minifyEnabled true
}
}
}
输出的aar包时,jar是被自动合并进classses.jar。
最后我是这样解决的(用了python做了一点搬运工作)
- 编译模块A,解开模块A,获得其中的classes.jar
- 把classes.jar放到模块B中的libs中。复制模块A中的AndroidMainfest中内容到模块B
- 编译模块B,输出目标aar
- 删除模块B中的classes.jar,回退AndroidMainfest的修改
再问一个问题,直接把模块A的aar包放到模块B的libs中作为应用来编译是否可行?
可以的,打包出来的classes.jar包含了模块A的aar。android-studio能解开依赖,也可以工作。但是在eclipse中报错,报AndroidMainfest资源冲突。
这里就不放具体实现代码了。:)