我的项目结构是这样的,
现在,我需要对外提供一个sdk (moudleA),但是我的 sdk 又需要依赖其他团队的 sdk 和一些只能发布在内网的依赖库,所以我需要将 moudleA、moudleB、moudleC 的 aar 合并成一个 aar 对外提供。
这个不难,已经有了现成的插件 fat-aar-android , 关于 fat-aar 的使用,我从 github 文档里摘了一些,放在了后面,可以看下。
我说下遇到的问题吧:因为 moudleB 和 moudleC 都支持 arm 、v7a 、v8a 、x86 、86_64,但我 moudleA 只想对外提供 v7a、v8a 这两种架构,所以我在 moudleA 中配置了:
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
复制代码
但很遗憾,使用 fat-aar 合并后,发现 abiFilters 不生效。网上找了一圈,也没啥好用的方法,最后只能修改插件源码,在打包合并任务后,就直接删掉了不支持的架构。
源码直接在 github copy 就可以了,要注意命名 buildSrc 和 gradle 版本,
修改的类 VariantProcessor , 在 processArtifacts 方法内添加 doLast:
其中 AndroidArchiveLibrary#getJniFolder86_64 方法见下:
就ok啦。
下面的接入文档 摘自 github :
该插件提供了将library以及它依赖的library一起打包成一个完整aar的解决方案,支持AGP 3.0及以上。(目前测试的版本范围是AGP 3.0 - 4.2.0,Gradle 4.9 - 6.8)
如何使用
第一步: Apply classpath
添加以下代码到你工程根目录下的build.gradle
文件中:
buildscript {
repositories {
mavenCentral()
}
dependencies { // 如引用源码,就不需要这个classpath了
classpath 'com.github.kezong:fat-aar:1.3.6'
}
}
复制代码
第二步: Add plugin
添加以下代码到你的主library的build.gradle
中:
apply plugin: 'com.kezong.fat-aar'
复制代码
第三步: Embed dependencies
embed
你所需要的工程, 用法类似implementation
代码所示:
dependencies {
implementation fileTree(dir: 'libs', include: '*.jar')
// java dependency
embed project(path: ':lib-java', configuration: 'default')
// aar dependency
embed project(path: ':lib-aar', configuration: 'default')
// aar dependency
embed project(path: ':lib-aar2', configuration: 'default')
// local full aar dependency, just build in flavor1
flavor1Embed project(path: ':lib-aar-local', configuration: 'default')
// local full aar dependency, just build in debug
debugEmbed(name: 'lib-aar-local2', ext: 'aar')
// remote jar dependency
embed 'com.google.guava:guava:20.0'
// remote aar dependency
embed 'com.facebook.fresco:fresco:1.12.0'
// don't want to embed in
implementation('androidx.appcompat:appcompat:1.2.0')
}
复制代码
第四步: 执行assemble命令
- 在你的工程目录下执行assemble指令,其中lib-main为你主library的工程名称,你可以根据不同的flavor以及不同的buildType来决定执行具体的assemble指令
# assemble all
./gradlew :lib-main:assemble
# assemble debug
./gradlew :lib-main:assembleDebug
# assemble flavor
./gradlew :lib-main:assembleFlavor1Debug
复制代码
最终合并产物会覆盖原有aar,同时路径会打印在log信息中.
多级依赖
本地依赖
如果你想将本地所有相关的依赖项全部包含在最终产物中,你需要在你主library中对所有依赖都加上embed
关键字
比如,mainLib依赖lib1,lib1依赖lib2,如果你想将所有依赖都打入最终产物,你必须在mainLib的build.gradle
中对lib1以及lib2都加上embed
关键字
远程依赖
如果你想将所有远程依赖在pom中声明的依赖项同时打入在最终产物里的话,你需要在build.gradle
中将transitive值改为true,例如:
fataar {
/**
* If transitive is true, local jar module and remote library's dependencies will be embed.
* If transitive is false, just embed first level dependency
* Local aar project does not support transitive, always embed first level
* Default value is false
* @since 1.3.0
*/
transitive = true
}
复制代码
如果你将transitive的值改成了true,并且想忽略pom文件中的某一个依赖项,你可以添加exclude
关键字,例如:
embed('com.facebook.fresco:fresco:1.11.0') {
// exclude any group or module
exclude(group:'com.facebook.soloader', module:'soloader')
// exclude all dependencies
transitive = false
}
复制代码