Android修炼系列(27),fat-aar 下的 arr 合并的坑

我的项目结构是这样的,

a.png

现在,我需要对外提供一个sdk (moudleA),但是我的 sdk 又需要依赖其他团队的 sdk 和一些只能发布在内网的依赖库,所以我需要将 moudleA、moudleB、moudleC 的 aar 合并成一个 aar 对外提供。

这个不难,已经有了现成的插件 fat-aar-android , 关于 fat-aar 的使用,我从 github 文档里摘了一些,放在了后面,可以看下。

我说下遇到的问题吧:因为 moudleB 和 moudleC 都支持 arm 、v7a 、v8a 、x86 、86_64,但我 moudleA 只想对外提供 v7a、v8a 这两种架构,所以我在 moudleA 中配置了:

ndk {
    abiFilters 'armeabi-v7a', 'arm64-v8a'
}
复制代码

但很遗憾,使用 fat-aar 合并后,发现 abiFilters 不生效。网上找了一圈,也没啥好用的方法,最后只能修改插件源码,在打包合并任务后,就直接删掉了不支持的架构。

源码直接在 github copy 就可以了,要注意命名 buildSrc 和 gradle 版本,

image.png

修改的类 VariantProcessor , 在 processArtifacts 方法内添加 doLast:

image.png

其中 AndroidArchiveLibrary#getJniFolder86_64 方法见下:

image.png

就ok啦。

下面的接入文档 摘自 github

该插件提供了将library以及它依赖的library一起打包成一个完整aar的解决方案,支持AGP 3.0及以上。(目前测试的版本范围是AGP 3.0 - 4.2.0,Gradle 4.9 - 6.8)

如何使用

第一步: Apply classpath

添加以下代码到你工程根目录下的build.gradle文件中:
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies { // 如引用源码,就不需要这个classpath了
        classpath 'com.github.kezong:fat-aar:1.3.6'
    }
}
复制代码

第二步: Add plugin

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

apply plugin: 'com.kezong.fat-aar'
复制代码

第三步: Embed dependencies

  • 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命令

  • 在你的工程目录下执行assemble指令,其中lib-main为你主library的工程名称,你可以根据不同的flavor以及不同的buildType来决定执行具体的assemble指令
# 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
}
复制代码

猜你喜欢

转载自juejin.im/post/7038648967244021791
Arr
今日推荐