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 示例:

      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

    1. xxx.jarxxx.aar 文件复制到项目的 app/libs/ 目录下。

    2. app/build.gradle 文件中添加依赖:

      Groovy 复制代码
      dependencies {
          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)。

    Groovy 复制代码
    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 开发中常用的依赖包格式,但它们的定位和用途有本质区别。

  1. JARJava 平台的标准打包格式 ,它里面主要包含编译后的 .class 文件和一些 Java 资源。它在 Android 中主要用于引入纯 Java 的工具库或算法库,比如 Gson、OkHttp 的核心逻辑库。因为它不包含任何 Android 相关的资源或清单文件。

  2. AARAndroid 特有的库项目打包格式 ,它可以看作是 JAR 的超集。一个 AAR 文件内部不仅包含编译后的代码(其实内部就有一个 classes.jar),还包含了 Android 资源文件(res/)、清单文件(AndroidManifest.xml)、原生 so 库等。这使得它能够打包一个完整的 Android 模块。我们日常引入的绝大多数第三方 UI 组件或 SDK(如 Glide、Retrofit 的完整包)都是以 AAR 格式分发的。