当前位置: 首页 > news >正文

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') // 引入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 开发中常用的依赖包格式,但它们的定位和用途有本质区别。

  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 格式分发的。

http://www.dtcms.com/a/353070.html

相关文章:

  • 具身导航助力果园种植!基于模仿学习的果园环境无人机视觉导航
  • Spring Boot项目集成日志系统使用完整指南
  • R-Zero:通过自博弈机制让大语言模型无需外部数据实现自我进化训练
  • Flutter桌面应用实战:Windows系统代理切换工具开发
  • 集成电路学习:什么是SSD单发多框检测器
  • 线性回归原理推导与应用(十一):多重共线性
  • 20250827的学习笔记
  • Kubernetes(k8s) 常用命令
  • 从零开始学习JavaWeb-19
  • 解决跨运营商限速:在飞牛OS系统上启用BBR算法优化网络速度
  • 数据结构:单链表的应用(力扣算法题)第一章
  • 腾讯云人脸识别API技术深度解析:从算法原理到工程实践
  • Diagnosing bias and variance|诊断偏差和方差
  • 文件系统中的核心数据结构
  • 链表-25.k个一组翻转链表-力扣(LeetCode)
  • 镜中万象:论观察即存在的递归拓扑与生命的意识本质
  • FPGA的工作原理
  • AI赋能CRM:纷享销客访销大脑重构快消品销售策略
  • d435i相机读取镜头内参和相对之间的外参
  • 三方相机问题分析八:【返帧异常导致性能卡顿】Snapchat后置使用特效预览出现卡顿
  • Jmeter5.3性能测试:文件下载脚本编写后,导出文件的接收
  • 第五章:Go运行时、内存管理与性能优化之栈与堆内存分配 (逃逸分析)
  • 在语言模型监督式微调(SFT)中的 负对数似然(Negative Log-Likelihood, NLL)等价于最大化似然
  • 开发者如何在 Gitee 上开源一个自己的项目
  • 开源 C++ QT Widget 开发(七)线程--多线程及通讯
  • keepalived mysql 主从复制 容器实现(失败)
  • JVM之【Java对象在内存中的结构】
  • windows下 docker desktop 清理ext4.vhdx文件 并缩小ext4.vhdx文件
  • 二次校验请求源 IP 是否在 WAF 官方 IP 段内” + “校验是否携带 WAF 专属 HTTP 头
  • 基于Spark的白酒行业数据分析与可视化系统的设计与实现