Android SDK 开发中的 AAR 与 JAR 区别详解

在 Android SDK 开发中,构建项目时我们常常会看到生成两个不同的文件:一个是 build/outputs/aar/*.aar,另一个是 build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar。很多初学者会疑惑:它们之间有什么区别?为什么构建会生成两个包?本篇博客将从生成路径、结构内容和使用场景三个角度,系统解释 AAR 和 JAR 的差异。


一、生成路径解析

  • AAR 路径:

    • build/outputs/aar/*.aar
    • 这是最终用于发布的 Android 库包,是你写的 SDK 的对外依赖形式。
  • JAR 路径:

    • build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar
    • 这是 AAR 构建过程中的中间产物,只包含编译后的 .class 字节码文件,供内部依赖合并、同步等使用。

二、结构内容区别

内容 .aar classes.jar
Java 编译后的 .class 文件
AndroidManifest.xml
res/ 资源文件(布局、drawable 等)
assets 目录
原生库(.so 文件)
ProGuard 混淆配置文件
AIDL 文件、R 文件

classes.jar 可以看作是 AAR 包中的 Java 部分,它是构建 AAR 时被打包进去的一部分。


三、使用场景区别

✅ 使用 AAR 的情况:
  • 你的库中包含资源文件(如 layout、drawable、string)
  • 你声明了组件(Activity、Service、Provider)
  • 你打算作为 Android SDK 发布给其他开发者
✅ 使用 JAR 的情况:
  • 你开发的是一个纯 Java 工具类库
  • 没有任何资源或 Android 相关特性
  • 可以跨平台使用,例如在 Kotlin/Java 控制台项目中

四、示意图说明

复制代码
AAR 文件结构:

my-sdk.aar
├── AndroidManifest.xml
├── classes.jar      ← 编译后的 Java 类
├── res/             ← 资源文件
├── assets/          ← 资产文件
├── jni/             ← .so 库文件
├── R.txt            ← R 文件映射表
├── proguard.txt     ← 混淆配置文件

classes.jar 是其中的一部分,只包含 Java 类,缺失资源、Manifest 等信息,因此不能单独用于 Android 项目。


五、总结

项目 AAR JAR
是否可直接用于 Android ❌(除非是纯 Java)
是否包含资源文件
是否包含 manifest
是否是最终产物 ❌(是中间产物)

一句话总结: AAR 是完整的 Android 库包,包含 Java 字节码和资源;JAR 是纯 Java 字节码的封装,是构建过程中临时生成的部分内容。

相关推荐
tellmewhoisi18 小时前
前置配置1:nacos 基本配置(注册与发现)
java
会开花的二叉树18 小时前
继承与组合:C++面向对象的核心
java·开发语言·c++
长河20 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
Cyan_RA920 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
喵手1 天前
玩转Java网络编程:基于Socket的服务器和客户端开发!
java·服务器·网络
再见晴天*_*1 天前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
灿烂阳光g1 天前
domain_auto_trans,source_domain,untrusted_app
android·linux
hdsoft_huge1 天前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
低调小一1 天前
Android传统开发 vs Android Compose vs HarmonyOS ArkUI 对照表
android·华为·harmonyos
雨白1 天前
Java 多线程指南:从基础用法到线程安全
android·java