利用fat-aar融合aar文件

Posted by Toeii on December 29, 2018

前言

因为之前公司的聚合支付SDK分离了支付业务模块。由于业务需要(菠菜网用到),所以把之前的微信支付宝聚合的aar与银联的aar进行融合。在这里记录分享一下。注:文章代码并非线上代码,而是之后我重新写过的demo代码。

fat-aar的项目地址点我

介绍

aar文件是一种Android归档包,这种归档包是由Gradle构建库的Android Library插件产出的,它本质是一个压缩包。

合并前需要先确定到底需要合并哪些子模块。我们通过定义一个dependency configuration: emeded来标记需要被合并的模块,然后在gradle构建的afterEvaluate阶段收集被emeded依赖的模块信息。

afterEvaluate {
    def dependencies = new ArrayList(configurations.embedded.resolvedConfiguration.firstLevelModuleDependencies)
    dependencies.reverseEach {
        ...
        it.moduleArtifacts.each {
            artifact ->
                if (artifact.type == 'aar') {
                    if (!embeddedAarFiles.contains(artifact)) {
                        //要合并的AAR文件
                        embeddedAarFiles.add(artifact)
                    }
                    if (!embeddedAarDirs.contains(modulePath)) {
                        ...
                        //每个AAR的解压目录
                        embeddedAarDirs.add(modulePath)
                    }
                } else if (artifact.type == 'jar') {
                    ...
                    //要合并的JAR文件
                    embeddedJars.add(artifactPath)
                } 
                ...
        }
    }
}

可以看出,这里收集了三个集合:

1,要合并的aar文件 2,每个aar的解压目录 3,要合并的jar文件

aar和jar分开收集是因为合并这两种文件的操作不同,jar只需纳入将其Class文件,而aar需要合并更多内容。

过程

导入fat-aar.gradle

1,将fat-aar.gradle文件放入sdk/目录下

sdk
    > build
        libs
    > src
        .gitignore
        build.gradle
        fat-aar.gradle
        ...

2,修改sdk/build.gradle脚本如下

apply plugin: 'com.android.library'
apply from: 'fat-aar.gradle'

android {
    ...
}

dependencies {
    if (rootProject.ext.debug) {
        compile project(':base')
    } else {
        embedded project(':base')
    }
    ...
}

3,修改工程下build.gradle脚本添加依赖于:sdk:build的main task

buildscript {
    ext {
        debug = false
        ...
    }
    ...
}
...
task main(dependsOn: ':sdk:build') {

}

4,执行gradle命令合并aar包

gradle clean main

5,命令执行成功后,将sdk/build/outputs/aar/sdk-release.aar文件复制到app/libs目录

app
    > build
        libs
        sdk-release.aar
...

6,修改app/build.gradle脚本

apply plugin: 'com.android.application'

android {
    ...
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    if (rootProject.ext.debug) {
        compile project(':sdk')
    } else {
        compile(name: 'sdk-release', ext: 'aar')
    }
    ...
}

最后,运行app查看结果。没有报错切功能已经集成完成,代表融合成功。

总结

这里的aar融合方式只支持单渠道的SDK,如果业务需要多渠道则不推荐这样的方式进行融合操作。