Dalvik 虚拟机概述
Dalvik 虚拟机是 Google 专为 Android 平台设计的执行环境。虽然它处理 Java 代码,但并未遵循标准的 JVM 规范。其核心职责涵盖对象生命周期管理、线程调度、安全控制、异常处理以及垃圾回收等关键功能。
JVM 与 Dalvik 的核心差异
理解两者的区别有助于深入掌握 Android 底层机制:
| 特性 | Java 虚拟机 (JVM) | Dalvik 虚拟机 |
|---|---|---|
| 架构类型 | 基于栈 (Stack-based) | 基于寄存器 (Register-based) |
| 指令集 | 运行标准 Java 字节码 (.class/.jar) | 运行自定义 .dex 字节码格式 |
| 编译流程 | 类文件直接打包 | .class 文件经 dx 工具合并转换为 .dex 文件 |
| 内存参数 | 依赖 JVM 默认配置 | 支持通过 -Xms 和 -Xmx 调整堆栈参数 |
| 进程模型 | 通常多应用共享 JVM 实例 | 单应用单虚拟机实例,独立 Linux 进程 |
注:Dalvik 的常量池索引优化为 32 位以简化解释器;每个 Android 应用拥有独立的 Linux PID(如 app_),运行在沙盒环境中。*
虚拟机架构实现
在 Android 源码中,Dalvik 的实现主要位于 dalvik/ 目录下:
dalvik/vm:核心实现部分,编译生成libdvm.so。dalvik/libdex:提供 dex 工具支持,编译为静态库libdex.a。dalvik/dexdump:用于反编译 .dex 文件的工具。dalvik/dalvikvm:可执行程序入口,编译后生成dalvikvm。
[图示:Dalvik 虚拟机架构]
应用编译及运行流程
Android 应用的构建涉及从源代码到可执行镜像的转换。Java 源文件首先编译为 .class 文件,随后经过 dx 工具链处理生成 .dex 文件,最终打包进 APK。运行时,Dalvik 虚拟机加载 .dex 文件并执行其中的指令。
[图示:Android 应用编译及运行流程]
进程管理机制
Dalvik 的进程管理深度依赖 Linux 体系结构。为了高效创建应用进程,系统采用 fork 机制复制现有进程,而非重新创建,这显著提升了启动速度。
Zygote 进程孵化
Zygote 是 Android 中的特殊进程,既是虚拟机实例也是孵化器。它由 init 进程启动,负责孵化 System_Server 守护进程。当用户启动应用时,System_Server 向 Zygote 发出请求,Zygote 随即 fork 出一个新的子进程来承载该应用。这种机制确保了所有 Android 应用的线程都对应一个 Linux 线程,且运行在各自的沙盒中。


