Android中AAR、JAR文件
一、核心概念理解
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 示例:
// 在 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
文件中添加依赖:dependencies {implementation files('libs/xxx.jar') // 引入JARimplementation 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)。dependencies {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 格式分发的。