Android 合并远程库到ARR

第一步: Apply plugin

添加以下代码到你工程根目录下的build.gradle文件中:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:xxx'
        classpath 'com.kezong:fat-aar:1.2.7'
    }
}

添加以下代码到你的主librarybuild.gradle中:

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

第二步: Embed dependencies

  • 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
    embed project(path: ':lib-aar-local', configuration:'default')
    // local full aar dependency
    embed (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依赖lib1lib1依赖lib2,如果你想将所有依赖都打入最终产物,你必须在mainLibbuild.gradle中对lib1以及lib2都加上embed关键字

远程依赖

如果你想将所有远程依赖在pom中声明的依赖项同时打入在最终产物里的话,你需要在build.gradle中将embedtransitive值改为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')
}

常见问题

  • 混淆日志: 当开启proguard时,可能会产生大量的Note: duplicate definition of library class日志,如果你想忽略这些日志,你可以在proguard-rules.pro中加上-dontnote关键字;
  • 资源冲突: 如果librarymodule中含有同名的资源(比如 string/app_name),编译将会报duplication resources的相关错误,有两种方法可以解决这个问题:
    • 考虑将library以及module中的资源都加一个前缀来避免资源冲突;
    • gradle.properties中添加android.disableResourceValidation=true可以忽略资源冲突的编译错误,程序会采用第一个找到的同名资源作为实际资源,不建议这样做,如果资源同名但实际资源不一样会造成不可预期的问题。
  • 本文转载自: http://www.noobdev.cn/?p=782shengruqing 2019年09月29日 于 菜鸟开发 发表)
  •  

猜你喜欢

转载自blog.csdn.net/liranke/article/details/109098854