在 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 字節碼的封裝,是構建過程中臨時生成的部分內容。