该插件提供了将library以及它依赖的module一起打包成一个完整aar的解决方案,支持gradle plugin 3.0.1及以上。(目前测试的版本范围是gradle plugin 3.0.1 - 3.6.2,gradle 4.6 - 6.0.1)
添加以下代码到你工程根目录下的build.gradle
文件中:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:xxx'
classpath 'com.kezong:fat-aar:1.2.12'
}
}
添加以下代码到你的主library的build.gradle
中:
apply plugin: 'com.kezong.fat-aar'
- 将
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'
}
如果你想将本地所有相关的依赖项全部包含在最终产物中,你需要在你主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')
}
更多使用方式可参考 example.
AAR是Android提供的一种官方文件形式; 该文件本身是一个Zip文件,并且包含Android里所有的元素; 可以参考 aar文件详解.
支持功能列表:
- 支持library以及module中含有flavor
- AndroidManifest合并
- classes以及jar合并
- res合并
- assets合并
- jni合并
- R.txt合并
- R.class合并
- proguard合并(混淆合并现在看来有些问题,建议将所有混淆文件都写在主Library中)
Version | Gradle Plugin | Gradle |
---|---|---|
1.0.1 | 3.1.0 - 3.2.1 | 4.4-6.0 |
1.1.6 | 3.1.0 - 3.4.1 | 4.4-6.0 |
1.1.10 | 3.0.1 - 3.4.1 | 4.1-6.0 |
1.2.6 | 3.0.1 - 3.5.0 | 4.1-6.0 |
1.2.8 | 3.0.1+ | 4.1+ |
1.2.11+ | 3.6.0+ | 5.4.1+ |
Gradle Plugin和所需求的Gradle版本官方文档
- 1.2.12
- 1.2.11
- 修复在gradle plugin 3.6.0下编译variants会error的情况 #126
- 修复在gradle plugin 3.6.0下编译出来的aar,在编译apk时会出现资源符号对象找不到的问题
- 1.2.9
- 适配gradle plugin 3.6.1 #120
- 1.2.8
- 适配gradle6.0+版本 #97
- 1.2.7
- 1.2.6
- 1.2.5
- 修复任务名称重复导致编译错误的问题 #48
- 如果开启minifyEnabled,所有的jar包将合入classes.jar文件
- 1.2.4
- 1.2.3
- 1.1.11
- 1.1.10
- 1.1.8
- 1.1.7
- 修复直接publish至maven时,aar的R文件未合并的问题 #7
- 1.1.6
- 1.0.3
- 修复assets未合并的问题
- 1.0.1
- 支持gradle plugin 3.1.0 - 3.2.1
- 支持资源合并,R文件合并
- 混淆日志: 当开启proguard时,可能会产生大量的
Note: duplicate definition of library class
日志,如果你想忽略这些日志,你可以在proguard-rules.pro
中加上-dontnote
关键字; - 资源冲突: 如果library和module中含有同名的资源(比如
string/app_name
),编译将会报duplication resources
的相关错误,有两种方法可以解决这个问题:- 考虑将library以及module中的资源都加一个前缀来避免资源冲突;
- 在
gradle.properties
中添加android.disableResourceValidation=true
可以忽略资源冲突的编译错误,程序会采用第一个找到的同名资源作为实际资源,不建议这样做,如果资源同名但实际资源不一样会造成不可预期的问题。