AAR(Android Archive)是 Android 开发中的库分发格式,本质上是把可复用的代码和资源打包成模块,供其他应用集成。
核心本质
AAR 是一个ZIP 压缩包,包含编译后的代码(DEX/Class)、资源文件、AndroidManifest、原生库(SO 文件)等。它类似于 JAR,但额外支持 Android 特有的资源(res/、assets/、AndroidManifest.xml)。
作用与场景
| 场景 | 说明 |
|---|---|
| SDK 分发 | 第三方服务(推送、统计、支付)以 AAR 形式提供 |
| 模块化开发 | 把业务拆分为独立模块(如登录模块、支付模块),团队并行开发 |
| 代码复用 | 公司内多个 App 共用基础组件(网络库、UI 组件) |
| 闭源保护 | 只暴露接口,不暴露源码 |
AAR 内部结构
解压后典型目录如下:
mylib.aar
├── AndroidManifest.xml # 库的清单文件(合并到主 APK)
├── classes.jar # 编译后的 Java/Kotlin 代码
├── res/ # 资源文件(布局、图片、字符串等)
├── assets/ # 原始资源文件
├── jni/ # 原生库(.so 文件,按 ABI 分目录)
├── libs/ # 依赖的第三方 JAR
├── proguard.txt # 混淆规则(可选)
├── lint.jar # Lint 检查规则(可选)
└── R.txt # 资源索引符号表
如何集成到 APK 中
构建时(Gradle/Android Studio)的处理流程:
- 合并清单:AAR 的
AndroidManifest.xml与主模块合并 - 资源合并:
res/和assets/合并到主 APK 的资源池中 - 代码编译:
classes.jar参与编译,最终打包成 DEX - 原生库合并:
jni/下的 SO 文件按 ABI 放入 APK 的lib/目录 - 依赖传递:
libs/中的 JAR 和 AAR 声明的依赖自动引入
最终 AAR 的内容被扁平化进 APK,用户无感知。
引入和使用方式
1. 本地 AAR 依赖
把 AAR 放到 libs/ 目录,在模块级 build.gradle 中:
dependencies {
implementation(files("libs/mylibrary.aar"))
}
2. 远程 Maven 依赖(最常见)
dependencies {
implementation("com.example:mylibrary:1.0.0")
}
Gradle 自动从仓库下载 AAR 并完成集成。
3. 作为模块导入
File → New → New Module → Import .JAR/.AAR Package,会生成一个模块依赖。
4. 使用
集成后直接在代码中调用 AAR 暴露的 API:
import com.example.mylibrary.MySDK
// 初始化
MySDK.init(context, "app_key")
// 调用功能
MySDK.doSomething()
资源也可以直接通过 R 文件引用(如 R.layout.library_layout),前提是资源名不与主项目冲突。
与 JAR 的关键区别
| 特性 | JAR | AAR |
|---|---|---|
| 资源文件 | 不支持 | 完整支持 |
| AndroidManifest | 不支持 | 支持合并 |
| 原生库(SO) | 需手动处理 | 自动打包 |
| 适用场景 | 纯 Java/Kotlin 库 | Android 专用库 |
简单说:AAR 是 Android 世界的"即插即用"模块,让代码和资源的复用变得标准化。