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)

posted @ 2021-08-27 15:56  灰色飘零  阅读(3974)  评论(0编辑  收藏  举报