Android SDK 组件化 AAR 打包集成
在 Android 开发过程中,有些功能是通用的,或者是多个业务方都需要使用的。为了统一功能逻辑及避免重复开发,因此将该功能开发成一个 SDK 是相当有必要的。
那么SDK呈现的方式,都有那些呢? 答:.so、.jar、*.aar、module。
其中,.so是C或C++语言的内容打包成的库,由于本项目是java语言,所以本文不探究so。
一、JAR
JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。 只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件。
jar的优点:安全性、减少下载时间、传输平台扩展、包密封、包版本控制、可移植性。
jar的缺点:打jar包时,项目里的res文件是用不了的,若想用图片文件,可以将图片文件放进assets文件里面打进jar包再进行调用,但必须注意jar里面assets文件夹里面的文件不能和调用项目里面assets文件夹里面的文件重名。
使用jar方式:拷贝到:libs目录, 添加到build.gradle配置文件中,重新编译一次项目既可完成加载。使用时注意混淆问题。
打包jar包的相关资料:《Android Studio 使用gradle导出jar包》
二、AAR
AAR是Android库项目的二进制归档文件,包含所有资源,class以及res资源文件。将aar解压(后缀改为.zip,再解压文件)打开后,可以看到每个aar解压后的内容可能不完全一样,但是都会包含AndroidManifest.xml,classes.jar,res,R.txt。
提供aar的sdk的方式的优缺点:
优点:只需引入一个文件,继承简单。
缺点:如果aar的包需要其他依赖库的时候,如果没依赖进去,会提示 java.lang.NoClassDefFoundError 错误。这是因为在打arr包的时候,只是将module内部的代码及资源打包进去了,并没有将第三方依赖也打包进去。
打包aar文件的相关资料:
《Android Studio 打包 aar》:https://www.jianshu.com/p/baa7976cec09
《AndroidStudio封装SDK的那些事》:https://www.cnblogs.com/endv/p/13823913.html
打aar包时,需要注意混淆问题及第三方库依赖问题。
aar在build.gradle 配置方式为:
repositories {
flatDir {
dirs'libs'
}
}
dependencies {
implementation(name:'genius', ext:'aar')
}
因为aar不会传递第三方依赖,在依赖aark时,如果碰到第三方依赖库问题,一般只需要将arr依赖的第三方库再引入一遍,程序就不报错了。如果在更新aar的时候,发现本地External Library的aar文件中还是之前版本的内容,这时候可以通过下面的命令强制刷新:
./gradlew build --refresh-dependencies
在本文的后面,我们会讲解一下,如何将多个aar文件合并到一起,这样能在一定程度上避免第三方依赖问题。
三、Module
module一般是模块功能代码,这种提供sdk的方式,一般是将核心的jar包、aar包进行更进一步的逻辑封装,然后将整个Demo级别的功能代码提供给别人。
提供moudule的sdk的方式的优缺点为:
优点:集成非常简单,只要测试没问题,一般别人都能够直接拿过来使用,并且能够在Demo的基础上,根据需求调整部分功能。
缺点:后续更新,可能需要代码的全量替换。
这种提供方式,应该是最简单的集成方案,这里就不过多对此进行说明了。
四、Fat—AAR
Fat—AAR出现的核心需求就是:在打包AAR时,将其需要的AAR打入同一个AAR包。
解决这个需求,涉及到三点:
如何确认需要合并的module?
确定需要合并的module后,如何找到相应的文件路径?
不同的文件在Gradle Tasks中的哪个位置插入?
这里根据:https://github.com/kezong/fat-aar-android 开源项目来理解一下。
通过 embed 来确认需要add 的 dependency,这样就能将需要合并的关联起来了。
确认需要合并的module后,如何找到路径?
答:build一个aar的适合会在各个module下生成一个build文件夹,和aar关联的文件夹是exploded-aar,里面的代码结构和我们直接打开aar的时候基本一致。
这样,路径问题我们就解决了。
不同的文件在Gradle Tasks中的哪个位置插入? fat-aar是这样做的,通过不同的task之间的dependsOn ,mustRunAfter 这种方式来插入自定义的task。
参考Demo:https://github.com/renhui/Fat-AAR-Demo (使用Fat-AAR SDK版本:1.3.5)