The solution of merging aar works with the android gradle plugin, the android plugin's version of the development is 3.0.1
and higher. (Tested in gradle plugin 3.0.1 - 3.4.1, and gradle 4.6 - 5.1.1)
Add snippet below to your root build script file:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:xxx'
classpath 'com.kezong:fat-aar:1.1.7'
}
}
Add snippet below to the build.gradle
of your android library:
apply plugin: 'com.kezong.fat-aar'
change implementation
or api
to embed
and add compileOnly
while you want to embed the dependency in the library. Like this:
dependencies {
implementation fileTree(dir: 'libs', include: '*.jar')
// java dependency
embed project(path: ':lib-java', configuration:'default')
compileOnly project(path: ':lib-java')
// aar dependency
embed project(path: ':lib-aar', configuration:'default')
compileOnly project(path: ':lib-aar')
// aar dependency
embed project(path: ':lib-aar2', configuration:'default')
compileOnly project(path: ':lib-aar2')
// aar dependency
embed 'com.facebook.fresco:fresco:1.11.0'
compileOnly 'com.facebook.fresco:fresco:1.11.0'
// local aar dependency, you need add the flatDir first.
embed (name:'lib-aar-local2',ext:'aar')
compileOnly (name:'lib-aar-local2',ext:'aar')
// local aar dependency
embed project(path: ':lib-aar-local', configuration:'default')
compileOnly project(path: ':lib-aar-local')
// other dependencies you don't want to embed in
implementation 'com.android.support:appcompat-v7:27.1.1'
}
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:
- productFlavors
- manifest merge
- classes jar and external jars merge
- res merge
- assets merge
- jni libs merge
- proguard.txt merge
- R.txt merge
- R.class merge
- Proguard note. Produce lots of(maybe)
Note: duplicate definition of library class
, while proguard is on. A workaround is to add-dontnote
inproguard-rules.pro
. - The overlay order of res merge is changed: Embedded dependency has higher priority than other dependencies.
- 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:- consider using a prefix to each res Id, both in library res and aar dependencies if possible.
- Adding "android.disableResourceValidation=true" to "gradle.properties" can do a trick to skip the exception, but is not recommended.