一、核心概念理解
1. JAR (Java Archive)
-
定义 :JAR 是 Java 平台 的标准打包格式,并非 Android 独有。它本质上是一个 ZIP 压缩文件,使用
.jar
作为扩展名。 -
包含文件:
-
编译后的
.class
文件(核心) -
资源文件(如
.properties
配置文件) -
META-INF/MANIFEST.MF
清单文件(包含元数据,如主类、版本信息)
-
-
目的 :主要用于打包和分发 纯 Java 代码库。它只包含代码逻辑,不包含任何 Android 平台相关的资源(如布局、图片、清单文件等)。
2. AAR (Android Archive)
-
定义 :AAR 是 Android 系统特有 的库项目打包格式,可以看作是 Android 版的 JAR。它同样是一个 ZIP 文件,使用
.aar
作为扩展名。 -
包含文件:
-
/classes.jar
:编译后的 Java 代码(相当于一个 JAR 包) -
/res/
目录:资源文件(布局 layout、drawable、values 等) -
/AndroidManifest.xml
:清单文件(可以定义组件、权限等) -
/R.txt
:编译时生成的 R 资源映射表 -
/assets/
目录:原始资源文件 -
/jni/
目录:预编译的 so 库(用于 NDK 原生代码) -
proguard.txt
:该库专用的混淆规则
-
-
目的 :用于打包和分发一个完整的 Android 库模块,包含代码、资源和清单文件。这是分发 Android UI 组件、自定义 View、第三方 SDK(如广告、登录 SDK)的首选格式。
二、核心区别与对比
特性 | JAR (Java Archive) | AAR (Android Archive) |
---|---|---|
格式来源 | Java 平台标准格式 | Android 特有格式 |
包含内容 | 仅 编译后的 .class 文件和 Java 资源 |
所有 Android 模块内容 :代码、资源 、清单、so库等 |
Android 资源 | 不支持 (无法包含 res/ , layout/ 等) |
支持(核心优势) |
AndroidManifest.xml |
不包含 | 包含,并可与其他清单合并 |
使用场景 | 分发纯 Java 工具库、算法库 | 分发 Android UI 组件、自定义 View、完整功能 SDK |
Gradle 依赖 | implementation files('libs/xxx.jar') |
implementation files('libs/xxx.aar') 或 implementation project(':library') |
依赖传递 | 如果 JAR 依赖了其他库,需要手动添加 | 可以自动传递 其自身的依赖(在 pom.xml 中定义) |
三、工作流程与实战
1. 如何生成?
-
生成 JAR:
-
在 Android Studio 中,通常需要专门配置 Gradle Task 来打 JAR 包,因为它不是 Android 模块的标准输出。
-
一个简单的 JAR 打包 Task 示例:
Groovy// 在 Module 的 build.gradle 中 task makeJar(type: Copy) { from('build/intermediates/aar_main_jar/release/') // 来源路径可能随Gradle版本变化 into('../libs/') include('classes.jar') rename('classes.jar', 'my-library.jar') } makeJar.dependsOn(build)
-
-
生成 AAR:
-
这是 Android 库模块 (
apply plugin: 'com.android.library'
) 的标准构建输出。 -
只需在 Android Studio 右侧的 Gradle 面板 -> 找到你的库模块 ->
Tasks
->build
-> 双击assembleRelease
。 -
生成的 AAR 文件在
module目录/build/outputs/aar/
下。
-
2. 如何使用?
-
使用本地 JAR/AAR:
-
将
xxx.jar
或xxx.aar
文件复制到项目的app/libs/
目录下。 -
在
app/build.gradle
文件中添加依赖:Groovydependencies { implementation files('libs/xxx.jar') // 引入JAR implementation files('libs/xxx.aar') // 引入AAR // 或者批量引入libs目录下所有jar包 implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs') }
-
-
使用远程仓库中的 AAR (主流方式):
绝大多数第三方 Android 库都通过 Maven 仓库分发(如 JCenter, Maven Central, Google's Maven Repo)。Gradle 会根据依赖项自动下载对应的 AAR(或 JAR)。
Groovydependencies { implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 这其实下载的是一个.aar文件 implementation 'com.google.code.gson:gson:2.8.6' // 这是一个.jar文件 }
3. AAR 的依赖传递机制
这是理解大型项目依赖管理的关键。流程如下:

这意味着 :当你添加一个 AAR 依赖时,你很可能也悄悄地引入了它所依赖的其他库。这有时会导致依赖冲突 (如两个不同版本的同一个库),需要通过 exclude
或强制统一版本来解决。
四、总结
Q:"谈谈对 Android 中 JAR 和 AAR 的理解,它们有什么区别?"
A:
"JAR 和 AAR 都是 Android 开发中常用的依赖包格式,但它们的定位和用途有本质区别。
-
JAR 是 Java 平台的标准打包格式 ,它里面主要包含编译后的
.class
文件和一些 Java 资源。它在 Android 中主要用于引入纯 Java 的工具库或算法库,比如 Gson、OkHttp 的核心逻辑库。因为它不包含任何 Android 相关的资源或清单文件。 -
AAR 是 Android 特有的库项目打包格式 ,它可以看作是 JAR 的超集。一个 AAR 文件内部不仅包含编译后的代码(其实内部就有一个 classes.jar),还包含了 Android 资源文件(res/)、清单文件(AndroidManifest.xml)、原生 so 库等。这使得它能够打包一个完整的 Android 模块。我们日常引入的绝大多数第三方 UI 组件或 SDK(如 Glide、Retrofit 的完整包)都是以 AAR 格式分发的。