---
title: "Jar与aar"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/android-jar-aar/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/04-应用开发与云端工程/Android开发/Jar与aar.md"
content_hash: 31996598609e5234bd9c5346de3fcce4b20e68b14be3bfdc9703c7f8c273a6c9
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Jar与aar

﻿# Jar与aar



### Java代码的打包格式：JAR、AAR 和 DEX

在Java和Android开发中，代码和资源通常会被打包成不同的格式，以便分发、重用和执行。常见的格式包括JAR、AAR和DEX。以下是这些格式的介绍及其相互关系。

#### 1. **JAR (Java ARchive)**
- **定义**：JAR文件是一种用于打包Java类文件及其相关资源（如配置文件、图片等）的压缩文件格式。它可以包含多个`.class`文件（Java编译后的字节码文件），以及资源文件和一个`MANIFEST.MF`清单文件，用于描述JAR包的元数据。
- **用途**：JAR文件主要用于在Java程序中分发和重用代码。它们可以被直接加载到Java虚拟机（JVM）中执行，通常用于Java库的分发。
- **与其他格式的关系**：JAR文件是最基本的Java代码分发格式，而AAR和DEX都是基于JAR文件进一步扩展的格式。

#### 2. **AAR (Android Archive)**
- **定义**：AAR文件是Android特有的一种包格式，用于打包Android库。它不仅可以包含Java类文件（通常是以JAR形式存在），还可以包含资源文件、AndroidManifest.xml文件、原生库（`.so`文件）等。
- **用途**：AAR文件通常用于分发Android库，它包含了所有必要的资源和代码，可以直接被其他Android项目引用。例如，第三方UI控件库通常以AAR形式提供。
- **与其他格式的关系**：AAR文件实际上是一个扩展的JAR文件，包含了Android特有的资源和配置。可以认为AAR是JAR的一个超集，专门用于Android开发。

- **AAR包可以替代Jar包**，特别是在需要包含Android资源的情况下。对于纯Java代码或通用库，Jar包依然是常用的选择。

#### 3. **DEX (Dalvik Executable)**
- **定义**：DEX文件是Android特有的可执行文件格式，包含经过优化的Java字节码。Android系统中，Java代码在编译成字节码后，并不会直接运行，而是先被转换为DEX格式，以便在Android的Dalvik虚拟机或ART（Android Runtime）中执行。
- **用途**：DEX文件是Android应用程序的核心执行文件。在构建Android应用时，所有的`.class`文件（通常打包在JAR或AAR中）都会被转换为一个或多个DEX文件，以提高运行时的效率。
- **与其他格式的关系**：JAR或AAR中的`.class`文件会在构建过程中被转换成DEX文件，这是Android应用在设备上运行的最终执行格式。也就是说，JAR和AAR文件中的Java代码最终都需要被转换为DEX格式才能在Android设备上执行。

Android系统对Dex的用法：
- **编译Java代码**：Java源代码（`.java`文件）首先被编译为字节码（`.class`文件）。
- **生成DEX文件**：所有`.class`文件通过工具（如`dx`或`d8`）被打包并转换为一个或多个DEX文件。
- **加载DEX文件**：Android系统在运行时加载这些DEX文件，并在虚拟机中解释执行。
