惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
A
About on SuperTechFans
量子位
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
U
Unit 42
D
DataBreaches.Net
博客园 - Franky
D
Docker
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hugging Face - Blog
Hugging Face - Blog

博客园 - 灰色飘零

Hilt 依赖注入实战指南 Android R8适配全流程详解 AI Coding逐步引导式开发,从零到一生成完整技术方案 AI 时代的新项目技术最佳选型 如何建立人类与 AI 的协作习惯 【实战】用 AI 吃透 Git Commit:从代码修改到原理拆解 + 学习规划 端侧大模型实践 - 生成预测模型&模型轻量化&端侧部署 端侧大模型实践-ESC上实现大模型轻量化功能 端侧大模型实践 - Hadoop + Spark 配置方案 端侧大模型实践 - 端侧大模型极简版Demo版落地概述 Agent 会重构数字服务入口与分发逻辑,但不会彻底消灭 APP 解构 AICoding 底层逻辑:人的能力定义 AI 边界 告别AI概念混乱!一次性讲透 Agent Skills、Rules、Prompt、MCP AI编程的实践场景与未来可能:一场开发范式的演进 移动端 SDK 开发经验总结及梳理 Android WebView不显示Mixed Content的问题解决方案 【工信部】App违法违规收集使用个人信息行为认定方法 Git 远程删除分支后,本地 git branch -a 依然能看到的解决办法 Java 安全密码学 Android使用ContentProvider初始化SDK库方案总结
Android SDK 组件化 AAR 打包集成
灰色飘零 · 2021-08-27 · via 博客园 - 灰色飘零

在 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)