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

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

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

      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)。

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

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

posted @ 2025-09-04 14:05  yfceshi  阅读(8)  评论(0)    收藏  举报