{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/android-jar-aar/",
  "atlas": "https://www.pystone.net/?node=android-jar-aar#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/android-jar-aar.md",
  "context": "https://www.pystone.net/notes/android-jar-aar.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:android-jar-aar",
  "slug": "android-jar-aar",
  "title": "Jar与aar",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Jar与aar",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "31996598609e5234bd9c5346de3fcce4b20e68b14be3bfdc9703c7f8c273a6c9",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "Jar与aar",
      "anchor": "jar与aar",
      "citation": "https://www.pystone.net/notes/android-jar-aar/#jar%E4%B8%8Eaar"
    },
    {
      "depth": 3,
      "text": "Java代码的打包格式：JAR、AAR 和 DEX",
      "anchor": "java代码的打包格式jaraar-和-dex",
      "citation": "https://www.pystone.net/notes/android-jar-aar/#java%E4%BB%A3%E7%A0%81%E7%9A%84%E6%89%93%E5%8C%85%E6%A0%BC%E5%BC%8Fjaraar-%E5%92%8C-dex"
    },
    {
      "depth": 4,
      "text": "1. JAR (Java ARchive)",
      "anchor": "1-jar-java-archive",
      "citation": "https://www.pystone.net/notes/android-jar-aar/#1-jar-java-archive"
    },
    {
      "depth": 4,
      "text": "2. AAR (Android Archive)",
      "anchor": "2-aar-android-archive",
      "citation": "https://www.pystone.net/notes/android-jar-aar/#2-aar-android-archive"
    },
    {
      "depth": 4,
      "text": "3. DEX (Dalvik Executable)",
      "anchor": "3-dex-dalvik-executable",
      "citation": "https://www.pystone.net/notes/android-jar-aar/#3-dex-dalvik-executable"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:application-and-cloud-engineering",
      "title": "应用开发与云端工程",
      "url": "https://www.pystone.net/notes/application-and-cloud-engineering/",
      "atlas": "https://www.pystone.net/?node=application-and-cloud-engineering#knowledge-atlas",
      "label": "应用开发与云端工程",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "Android开发中的“Jar与aar”导航项",
      "citation": "https://www.pystone.net/notes/application-and-cloud-engineering/#android%E5%BC%80%E5%8F%91"
    }
  ],
  "contentMarkdown": "# Jar与aar\n\n﻿# Jar与aar\n\n\n\n### Java代码的打包格式：JAR、AAR 和 DEX\n\n在Java和Android开发中，代码和资源通常会被打包成不同的格式，以便分发、重用和执行。常见的格式包括JAR、AAR和DEX。以下是这些格式的介绍及其相互关系。\n\n#### 1. **JAR (Java ARchive)**\n- **定义**：JAR文件是一种用于打包Java类文件及其相关资源（如配置文件、图片等）的压缩文件格式。它可以包含多个`.class`文件（Java编译后的字节码文件），以及资源文件和一个`MANIFEST.MF`清单文件，用于描述JAR包的元数据。\n- **用途**：JAR文件主要用于在Java程序中分发和重用代码。它们可以被直接加载到Java虚拟机（JVM）中执行，通常用于Java库的分发。\n- **与其他格式的关系**：JAR文件是最基本的Java代码分发格式，而AAR和DEX都是基于JAR文件进一步扩展的格式。\n\n#### 2. **AAR (Android Archive)**\n- **定义**：AAR文件是Android特有的一种包格式，用于打包Android库。它不仅可以包含Java类文件（通常是以JAR形式存在），还可以包含资源文件、AndroidManifest.xml文件、原生库（`.so`文件）等。\n- **用途**：AAR文件通常用于分发Android库，它包含了所有必要的资源和代码，可以直接被其他Android项目引用。例如，第三方UI控件库通常以AAR形式提供。\n- **与其他格式的关系**：AAR文件实际上是一个扩展的JAR文件，包含了Android特有的资源和配置。可以认为AAR是JAR的一个超集，专门用于Android开发。\n\n- **AAR包可以替代Jar包**，特别是在需要包含Android资源的情况下。对于纯Java代码或通用库，Jar包依然是常用的选择。\n\n#### 3. **DEX (Dalvik Executable)**\n- **定义**：DEX文件是Android特有的可执行文件格式，包含经过优化的Java字节码。Android系统中，Java代码在编译成字节码后，并不会直接运行，而是先被转换为DEX格式，以便在Android的Dalvik虚拟机或ART（Android Runtime）中执行。\n- **用途**：DEX文件是Android应用程序的核心执行文件。在构建Android应用时，所有的`.class`文件（通常打包在JAR或AAR中）都会被转换为一个或多个DEX文件，以提高运行时的效率。\n- **与其他格式的关系**：JAR或AAR中的`.class`文件会在构建过程中被转换成DEX文件，这是Android应用在设备上运行的最终执行格式。也就是说，JAR和AAR文件中的Java代码最终都需要被转换为DEX格式才能在Android设备上执行。\n\nAndroid系统对Dex的用法：\n- **编译Java代码**：Java源代码（`.java`文件）首先被编译为字节码（`.class`文件）。\n- **生成DEX文件**：所有`.class`文件通过工具（如`dx`或`d8`）被打包并转换为一个或多个DEX文件。\n- **加载DEX文件**：Android系统在运行时加载这些DEX文件，并在虚拟机中解释执行。\n"
}
