AAR 第一性本质理解

6 阅读2分钟

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)的处理流程:

  1. 合并清单:AAR 的 AndroidManifest.xml 与主模块合并
  2. 资源合并res/assets/ 合并到主 APK 的资源池中
  3. 代码编译classes.jar 参与编译,最终打包成 DEX
  4. 原生库合并jni/ 下的 SO 文件按 ABI 放入 APK 的 lib/ 目录
  5. 依赖传递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 的关键区别

特性JARAAR
资源文件不支持完整支持
AndroidManifest不支持支持合并
原生库(SO)需手动处理自动打包
适用场景纯 Java/Kotlin 库Android 专用库

简单说:AAR 是 Android 世界的"即插即用"模块,让代码和资源的复用变得标准化。