A gradle plugin that merge dependencies into the final aar file works with AGP 3.+
I am no longer engaged in research and development, so the project will not be updated and maintained.
You can try to use the following steps to reference the remote plugin. If it doesn't work on the new version of gradle, you can fork or download this project to modify it, the code of this project is not very complex.P.S. Hope Google can support this damn feature as soon as possible.
The solution of merging aar works with AGP 3.0
and higher. (Tested in AGP 3.0 - 7.1.0, and Gradle 4.9 - 7.3)
For Maven Central (The lastest release is available on Maven Central):
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.github.kezong:fat-aar:1.3.8'
}
}
Add snippet below to the build.gradle
of your main android library:
apply plugin: 'com.kezong.fat-aar'
Declare embed
for the dependencies you want to merge in build.gradle
.
The usage is similar to implementation
, like this:
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')
}
If you want to include local transitive dependencies in final artifact, you must add embed
for transitive dependencies in your main library.
For example, mainLib depend on subLib1, subLib1 depend on subLib2, If you want include all dependencies in the final artifact, you must add embed
for subLib1 and subLib2 in mainLib build.gradle
If you want to inlcude all of the remote transitive dependencies which are in POM file, you need change the transitive
value to true in your build.gradle
, like this:
fataar {
/**
* If transitive is true, local jar module and remote library's dependencies will be embed. (local aar module does not support)
* If transitive is false, just embed first level dependency
* Default value is false
* @since 1.3.0
*/
transitive = true
}
If you change the transitive value to true,and want to ignore a dependency in its POM file, you can add exclude keywords, like this:
embed('com.facebook.fresco:fresco:1.11.0') {
// exclude all dependencies
transitive = false
// exclude any group or module
exclude(group:'com.facebook.soloader', module:'soloader')
}
More usage see example.
AAR is a file format for android library. The file itself is a zip file that containing useful stuff in android. See anatomy of an aar file here.
support list for now:
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 - 1.3.5 | 3.0.0 - 4.1.0 | 4.9+ |
1.3.6 | 3.0.0 - 4.2.0 | 4.9+ |
1.3.8 | 3.0.0+ | 4.9+ |
The following link which version of Gradle is required for each version of the Android Gradle plugin. For the best performance, you should use the latest possible version of both Gradle and the plugin.
Plugin version and Required Gradle version
Application cannot directly rely on embedded project: application cannot directly rely on your embedded project. It must rely on the AAR file compiled by your embedded project
embed
in the main library project when you choose to package aar. When you need to run the app directly, you can use implementation
or api
Res merge conflicts. If the library res folder and embedded dependencies res have the same res Id(mostly string/app_name
). A duplicate resources build exception will be thrown. To avoid res conflicts:
android.disableResourceValidation=true
to gradle.properties
can do a trick to skip the exception.Proguard
minifyEnabled
is set to true, classes not referenced in the project will be filtered according to Proguard rules during compile, resulting in ClassNotFound during app compile.
Most AAR is SDK that provide interfaces. It is recommended that you carefully comb Proguard files and add keep rules.