在 Android SDK 开发中,构建项目时我们常常会看到生成两个不同的文件:一个是 build/outputs/aar/*.aar
,另一个是 build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
。很多初学者会疑惑:它们之间有什么区别?为什么构建会生成两个包?本篇博客将从生成路径、结构内容和使用场景三个角度,系统解释 AAR 和 JAR 的差异。
一、生成路径解析
-
AAR 路径:
build/outputs/aar/*.aar
- 这是最终用于发布的 Android 库包,是你写的 SDK 的对外依赖形式。
-
JAR 路径:
build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
- 这是 AAR 构建过程中的中间产物,只包含编译后的
.class
字节码文件,供内部依赖合并、同步等使用。
二、结构内容区别
内容 | .aar |
classes.jar |
---|---|---|
Java 编译后的 .class 文件 |
✅ | ✅ |
AndroidManifest.xml | ✅ | ❌ |
res/ 资源文件(布局、drawable 等) | ✅ | ❌ |
assets 目录 | ✅ | ❌ |
原生库(.so 文件) |
✅ | ❌ |
ProGuard 混淆配置文件 | ✅ | ❌ |
AIDL 文件、R 文件 | ✅ | ❌ |
classes.jar
可以看作是 AAR 包中的 Java 部分,它是构建 AAR 时被打包进去的一部分。
三、使用场景区别
✅ 使用 AAR 的情况:
- 你的库中包含资源文件(如 layout、drawable、string)
- 你声明了组件(Activity、Service、Provider)
- 你打算作为 Android SDK 发布给其他开发者
✅ 使用 JAR 的情况:
- 你开发的是一个纯 Java 工具类库
- 没有任何资源或 Android 相关特性
- 可以跨平台使用,例如在 Kotlin/Java 控制台项目中
四、示意图说明
AAR 文件结构:
my-sdk.aar
├── AndroidManifest.xml
├── classes.jar ← 编译后的 Java 类
├── res/ ← 资源文件
├── assets/ ← 资产文件
├── jni/ ← .so 库文件
├── R.txt ← R 文件映射表
├── proguard.txt ← 混淆配置文件
classes.jar
是其中的一部分,只包含 Java 类,缺失资源、Manifest 等信息,因此不能单独用于 Android 项目。
五、总结
项目 | AAR | JAR |
---|---|---|
是否可直接用于 Android | ✅ | ❌(除非是纯 Java) |
是否包含资源文件 | ✅ | ❌ |
是否包含 manifest | ✅ | ❌ |
是否是最终产物 | ✅ | ❌(是中间产物) |
一句话总结: AAR 是完整的 Android 库包,包含 Java 字节码和资源;JAR 是纯 Java 字节码的封装,是构建过程中临时生成的部分内容。