【前言】
一般Android Studio 的library module,点击build或者assemble,会在该module的
build/outputs/aar
目录下生成.aar文件,但是这aar文件只会把依赖的jar包打进去,依赖的aar或者project是不会打包进去,这样有时候提供给别人项目时候就比较麻烦,还得复制一堆的aar过去给别人,后来,发现一个Android Studio的插件:fat-aar-android支持合并依赖的aar以及依赖的project,咱们来看看怎么用
1、fat-aar-android
该插件提供了将library以及它依赖的module一起打包成一个完整aar的解决方案,支持gradle plugin 3.0.1及以上
。(目前测试的版本范围是gradle plugin 3.0.1 - 4.1.0,gradle 4.9 - 6.5)
2、如何使用
第一步: Apply plugin
添加以下代码到你工程根目录下的build.gradle
文件中:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:xxx'
classpath 'com.kezong:fat-aar:1.2.18'
}
}
添加以下代码到你的主library的build.gradle中:
apply plugin: 'com.kezong.fat-aar'
第二步: Embed dependencies
将implementation或者api改成embed
代码所示:
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.11.0'
// don't want to embed in
// 不建议使用implementation,因为该依赖可能与application的依赖版本不一致,使用implementation可能会导致R类找不到的问题
compileOnly 'com.android.support:appcompat-v7:27.1.1'
}
3、多级依赖
本地依赖
如果你想将本地所有相关的依赖项全部包含在最终产物中,你需要在你主library
中对所有依赖
都加上embed
关键字
比如,mainLib依赖lib1,lib1依赖lib2,如果你想将所有依赖都打入最终产物,你必须在mainLib的build.gradle中对lib1以及lib2都加上embed关键字
远程依赖
如果你想将所有远程依赖
在pom中声明的依赖项
同时打入在最终产物里的话,你需要在build.gradle中将embed的transitive值改为true
,例如:
// the default value is false
// invalid for local aar dependency
configurations.embed.transitive = true
如果你将transitive的值改成了true,并且想忽略pom文件中的某一个依赖项,你可以添加exclude关键字
,例如:
embed('com.facebook.fresco:fresco:1.11.0') {
exclude(group:'com.facebook.soloader', module:'soloader')
}