{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/android-app-runtime-environment/",
  "atlas": "https://www.pystone.net/?node=android-app-runtime-environment#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/android-app-runtime-environment.md",
  "context": "https://www.pystone.net/notes/android-app-runtime-environment.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:android-app-runtime-environment",
  "slug": "android-app-runtime-environment",
  "title": "Android应用程序与运行环境",
  "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": "Android应用程序与运行环境 JVM（Java Virtual Machine）、Dalvik 和 ART（Android Runtime）从广义上来说，都可以归类为 \"Java 运行时环境\" （Java Runtime Environment）的一部分，核心目标是执行 Java 字节码或类似 Java 的程序。",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "6c9c5bd609ccd3e3ee92e3107f1463517846b756f4b6f0b096f3f522b2150abc",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "Android应用程序与运行环境",
      "anchor": "android应用程序与运行环境",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#android%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%B8%8E%E8%BF%90%E8%A1%8C%E7%8E%AF%E5%A2%83"
    },
    {
      "depth": 2,
      "text": "JVM（Java Virtual Machine）",
      "anchor": "jvmjava-virtual-machine",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#jvmjava-virtual-machine"
    },
    {
      "depth": 4,
      "text": "工作原理",
      "anchor": "工作原理",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86"
    },
    {
      "depth": 4,
      "text": "特点",
      "anchor": "特点",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E7%89%B9%E7%82%B9"
    },
    {
      "depth": 2,
      "text": "Dalvik",
      "anchor": "dalvik",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#dalvik"
    },
    {
      "depth": 4,
      "text": "工作原理",
      "anchor": "工作原理-1",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86-1"
    },
    {
      "depth": 4,
      "text": "特点",
      "anchor": "特点-1",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E7%89%B9%E7%82%B9-1"
    },
    {
      "depth": 2,
      "text": "ART（Android Runtime）",
      "anchor": "artandroid-runtime",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#artandroid-runtime"
    },
    {
      "depth": 4,
      "text": "工作原理",
      "anchor": "工作原理-2",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86-2"
    },
    {
      "depth": 4,
      "text": "特点",
      "anchor": "特点-2",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E7%89%B9%E7%82%B9-2"
    },
    {
      "depth": 2,
      "text": "特点",
      "anchor": "特点-3",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E7%89%B9%E7%82%B9-3"
    },
    {
      "depth": 2,
      "text": "构建",
      "anchor": "构建",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E6%9E%84%E5%BB%BA"
    },
    {
      "depth": 2,
      "text": "加载和执行",
      "anchor": "加载和执行",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E5%8A%A0%E8%BD%BD%E5%92%8C%E6%89%A7%E8%A1%8C"
    },
    {
      "depth": 2,
      "text": "相关工具",
      "anchor": "相关工具",
      "citation": "https://www.pystone.net/notes/android-app-runtime-environment/#%E7%9B%B8%E5%85%B3%E5%B7%A5%E5%85%B7"
    }
  ],
  "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开发中的“Android应用程序与运行环境”导航项",
      "citation": "https://www.pystone.net/notes/application-and-cloud-engineering/#android%E5%BC%80%E5%8F%91"
    },
    {
      "id": "note:android-system-architecture",
      "title": "Android系统架构",
      "url": "https://www.pystone.net/notes/android-system-architecture/",
      "atlas": "https://www.pystone.net/?node=android-system-architecture#knowledge-atlas",
      "label": "Android系统架构",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "详见 Android应用程序与运行环境",
      "citation": "https://www.pystone.net/notes/android-system-architecture/#android-runtime"
    }
  ],
  "contentMarkdown": "# Android应用程序与运行环境\nJVM（Java Virtual Machine）、Dalvik 和 ART（Android Runtime）从广义上来说，都可以归类为 **\"Java 运行时环境\"**（Java Runtime Environment）的一部分，核心目标是执行 Java 字节码或类似 Java 的程序。\n\nDalvik 和 ART可以看作是针对 Android 平台优化的 Java 虚拟机变种，旨在支持 Java 生态和语言特性，负责解释、编译和运行 Java 或 Kotlin 代码（在 Android 中）。\n\n## JVM（Java Virtual Machine）\nJVM 是一种运行 Java 字节码（`.class` 文件）的虚拟机，作为 Java 平台的核心组件。它提供了一种跨平台的运行环境，使 Java 程序能够在多种操作系统上运行。\n\n#### **工作原理**\n1. **Java 字节码**：Java 源代码（`.java` 文件）通过编译器 `javac` 转换为 `.class` 文件（Java 字节码）。\n2. **加载与解释**：JVM 通过类加载器（ClassLoader）加载 `.class` 文件，并将其转换为虚拟机可以执行的指令。\n3. **执行方式**：\n    - **解释执行**：逐行解释 `.class` 文件中的字节码并执行。\n    - **JIT（Just-In-Time）编译**：将热点代码（频繁执行的代码）编译为本地机器码，提高性能。\n#### **特点**\n- 跨平台性：Java 程序可以在任何安装了 JVM 的系统上运行。\n- 面向通用场景：JVM 的设计初衷是服务于多种环境和设备。\n\n## Dalvik\n\nDalvik 是 Android 早期的虚拟机，用于在移动设备上高效运行 Android 应用程序。它能够运行 Android 专用的 `.dex` 文件（Dalvik Executable）。\n\n#### **工作原理**\n1. **字节码格式**：\n    - Android 开发中的 `.class` 文件会被转换为 `.dex` 文件，这是一种经过优化的字节码格式。\n2. **基于寄存器的架构**：\n    - 不同于 JVM 基于栈的指令集，Dalvik 使用寄存器作为操作数存储区。这种方式减少了指令数量，提高了执行效率。\n3. **解释执行**：\n    - Dalvik 主要通过解释器逐行执行 `.dex` 字节码。\n\n#### **特点**\n- **为移动设备优化**：\n    - 低内存占用。\n    - 更高效的指令集。\n- **单独进程模型**：\n    - **每个 Android 应用都有自己的 Dalvik 实例，运行在独立的进程中。**\n- **GC（垃圾回收）优化**：\n    - 针对低内存设备进行了垃圾回收算法优化。\n\n## ART（Android Runtime）\n\nART 是 Android 的现代运行时，作为 Dalvik 的替代者，从 Android 5.0（Lollipop）开始成为默认运行时。ART 的目标是进一步提高性能，优化资源使用。\n\n#### **工作原理**\n1. **AOT（Ahead-Of-Time）编译**：\n    - 在应用安装时，ART 会将 `.dex` 文件编译为本地机器码（`ELF` 文件），这样在运行时无需解释或即时编译。\n2. **JIT（Just-In-Time）编译**：\n    - 从 Android 7.0 开始，ART 增加了 JIT 编译器，用于在运行时优化热点代码。\n3. **解释执行**：\n    - ART 也支持解释执行未编译的代码。\n\n#### **特点**\n- **高性能**：\n    - AOT 编译减少了运行时的计算开销，启动速度更快。\n- **优化内存使用**：\n    - ART 支持共享类和字符串池，减少了重复数据的内存占用。\n- **改进的垃圾回收**：\n    - ART 提供了更高效的垃圾回收机制（如并行 GC 和增量 GC）。\n- **调试和分析支持**：\n    - 支持更精细的调试功能，例如更好的堆栈跟踪和内存泄漏检测。\n\nDEX( **Dalvik Executable**) 是 Android 平台的一种字节码格式。\nA bytecode format designed specifically for Android that's optimized for a minimal memory footprint.\n\n所有 Android 应用程序的代码最终都会以 DEX 文件的形式运行在 Android Runtime (ART) 或 Dalvik 虚拟机上。\n\n\n## 特点\n- DEX 文件的设计目标是减少运行时的内存使用。\n- 指令集被精简并优化，以适应移动设备的有限资源。\n* 不同于 Java 的 `.class` 文件（每个类一个文件），一个 DEX 文件可以包含多个类的字节码。这种设计减少了文件数量和存储开销。\n- 虽然 DEX 文件是为 Android 优化的，但它仍然保持了平台无关性，类似于 JVM 的字节码。\n\n## 构建\n\n在构建 APK 的过程中，所有 JAR 文件中的 Java 字节码会被 `d8` 或 `dx` 工具转换为 DEX 格式。\n- `JAR` 文件中包含的是标准的 Java 字节码（`.class` 文件）。\n- 在构建时，这些 `.class` 文件会被统一合并并转换为一个或多个 `.dex` 文件。\n- 最终生成的 DEX 文件会被打包到 APK 的 `classes.dex` 文件中。\n\n\n> Unity 在构建 Android 工程时，会将所有 JAR 插件统一传递给 Android 构建工具链（Gradle 或 `UnityPlayerActivity` 的构建脚本），最终处理方式取决于这些工具链：\n> \t- **普通 JAR 文件**：字节码会被转换为 DEX。\n> \t- **动态加载 JAR 文件**：如果指定为动态加载，JAR 会保留原始形式。\n\n\n## 加载和执行\n1. **加载 DEX 文件**\nDEX 文件通常通过虚拟机加载和解释。加载器主要包括：\n\n- **`ClassLoader`**：加载和解析 DEX 文件中的类。\n- **`DexClassLoader`**：支持在运行时动态加载外部的 DEX 文件。\n\n2. **解释与编译**\n- **解释执行**：ART 和 Dalvik 虚拟机可以直接解释 DEX 字节码。\n- **编译执行**：\n    - 在 ART 中，常见方法会被 JIT 编译为本地机器码。\n    - 在应用安装时，ART 会将 DEX 文件通过 AOT 编译为本地代码。\n\n\n## 相关工具\n- **d8**：\n    - 新版的字节码转换工具，用于将 `.class` 转换为 `.dex`。\n    - 比 `dx` 更高效，支持增量编译。\n- **dexdump**：\n    - 用于分析和查看 DEX 文件内容的工具。\n- **proguard**：\n    - 用于混淆代码，减小 DEX 文件的大小，并保护代码不被反编译。\n"
}
