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

推荐订阅源

I
InfoQ
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
罗磊的独立博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
L
LINUX DO - 最新话题
T
Threatpost
Cisco Talos Blog
Cisco Talos Blog
The GitHub Blog
The GitHub Blog
V
V2EX
SecWiki News
SecWiki News
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
T
Troy Hunt's Blog
S
Security @ Cisco Blogs
Martin Fowler
Martin Fowler
Attack and Defense Labs
Attack and Defense Labs
A
Arctic Wolf
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Register - Security
The Register - Security
Blog — PlanetScale
Blog — PlanetScale
The Last Watchdog
The Last Watchdog
T
Tor Project blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
P
Proofpoint News Feed
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
小众软件
小众软件
雷峰网
雷峰网
H
Heimdal Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
Engineering at Meta
Engineering at Meta
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
C
Cyber Attacks, Cyber Crime and Cyber Security
Webroot Blog
Webroot Blog
C
Check Point Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
人人都是产品经理
人人都是产品经理
Hacker News: Ask HN
Hacker News: Ask HN
The Hacker News
The Hacker News
V
Vulnerabilities – Threatpost
Microsoft Security Blog
Microsoft Security 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)