/fat-aar-android

The solution of merging aar works with the gradle plugin's version of the development is 3.0.1 and higher. (3.1.x 3.2.x)

Primary LanguageGroovyApache License 2.0Apache-2.0

fat-aar-android

license Download

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.

Getting Started

Step 1: Apply plugin

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.0.3'
    }
}

Add snippet below to the build.gradle of your android library:

apply plugin: 'com.kezong.fat-aar'

Step 2: Embed dependencies

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.

About AAR File

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:

  • manifest merge
  • classes jar and external jars merge
  • res merge
  • R.txt merge
  • assets merge
  • jni libs merge
  • proguard.txt merge
  • lint.jar merge
  • aidl merge?
  • public.txt merge?

Known Defects or Issues

  • Proguard note. Produce lots of(maybe) Note: duplicate definition of library class, while proguard is on. A workaround is to add -dontnote in proguard-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.

Thanks