该插件提供了将library以及它依赖的library一起打包成一个完整aar的解决方案,支持AGP 3.0及以上。(目前测试的版本范围是AGP 3.0 - 4.2.0,Gradle 4.9 - 6.8)
build.gradle
文件中:JCenter于2021.5.1不再提供服务, 如果你使用了JCenter中的版本,建议更改一下包名切换至Maven central, 比如: 'com.kezong:fat-aar:x.x.x' => 'com.github.kezong:fat-aar:x.x.x'
For Maven Central (The lastest release is available on Maven Central):
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.github.kezong:fat-aar:1.3.6'
}
}
For JCenter (Deprecated, before 1.3.4):
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.kezong:fat-aar:1.3.3'
}
}
添加以下代码到你的主library的build.gradle
中:
apply plugin: 'com.kezong.fat-aar'
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 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
}
更多使用方式可参考 example.
AAR是Android提供的一种官方文件形式; 该文件本身是一个Zip文件,并且包含Android里所有的元素; 可以参考 aar文件详解.
支持功能列表:
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.0 - 3.4.1 | 4.1 - 6.0 |
1.2.6 | 3.0.0 - 3.5.0 | 4.1 - 6.0 |
1.2.8 | 3.0.0 - 3.5.9 | 4.1 - 6.8 |
1.2.11 - 1.2.14 | 3.0.0 - 3.6.9 | 4.1 - 6.8 |
1.2.15 - 1.2.16 | 3.0.0 - 4.0.2 | 4.1 - 6.8 |
1.2.17 | 3.0.0 - 4.0.2 | 4.9 - 6.8 |
1.2.18+ | 3.0.0 - 4.1.0 | 4.9 - 6.8 |
1.3.+ | 3.0.0 - 4.1.0 | 4.9 - 6.8 |
1.3.4 | 3.0.0 - 4.1.0 | 4.9+ |
Gradle Plugin和所需求的Gradle版本官方文档
Application无法直接依赖embed工程: application无法直接依赖你的embed工程,必须依赖你embed工程所编译生成的aar文件
embed
,需要直接运行app时,采用implementation
或者api
资源冲突: 如果library和module中含有同名的资源(比如 string/app_name
),编译将会报duplication resources
的相关错误,有两种方法可以解决这个问题:
gradle.properties
中添加android.disableResourceValidation=true
可以忽略资源冲突的编译错误,程序会采用第一个找到的同名资源作为实际资源.关于混淆
minifyEnabled
设置为true,编译时会根据proguard规则过滤工程中没有引用到的类,导致App集成时找不到对象,因为大多数AAR都是提供接口的SDK,建议大家仔细梳理proguard文件。此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。