ART 运行时全景:dex、oat 与执行模式
2026/8/9大约 2 分钟运行时Android 14ARTdex运行时
ART 运行时全景:dex、oat 与执行模式
ART 接收 APK 中的 dex,完成验证、编译与执行,并管理类加载和 Java 堆。oat/vdex、解释器、 JIT 与 AOT 不是互斥方案,它们会随安装状态、profile 和设备策略组合工作。
ART 同时管理代码与对象生命周期
| 常见误解 | 正确理解 |
|---|---|
| 应用直接执行 dex | ART 会验证、编译成 oat 并配合 JIT 执行 |
| ART 就是“Java 虚拟机” | 它是 Android 的运行时,管理 dex、编译、GC 与类加载 |
| 编译一次永远生效 | 解释、JIT、AOT 会按 profile 动态组合 |
核心结论
- 应用代码以 dex 形式进入 ART,经验证后执行。
- 执行模式:解释、JIT(热点编译)、AOT(预编译),按 profile 组合。
- oat/vdex 是预编译与验证产物,提升启动与执行效率。
- GC 管理 Java 堆,回收无引用对象。
- 排查入口:编译状态、GC 日志、hprof 与启动时间线。
ART 全景
逐步解释:
- dex:应用安装包里的字节码。
- 编译:dex2oat 验证并生成 oat。
- 执行:按 profile 选择解释/JIT/AOT。
- 类加载与 GC:运行期配套机制。
- 产物:oat/vdex 加速后续启动。
常用在哪些地方
按排查频率排列:
- 冷启动慢:dex/oat 与基线配置。
- 内存问题:GC 与堆。
- 类找不到:类加载与验证。
- 崩溃:运行时异常与 GC 相关。
- 性能波动:JIT/AOT 切换。
验证与排障
环境:开发设备或模拟器;以下命令不需要 root。
adb shell getprop dalvik.vm.heapsize
adb shell dumpsys package <包名> | grep -E "codePath|primaryCpuAbi"
adb logcat -v threadtime | grep -E "ART|GC_|ClassLinker"先看运行时属性与包路径,再查 GC/类加载日志。启动慢先看编译状态与基线配置, 内存问题看 GC 日志与 hprof。
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
art/runtime/ | 运行时核心 | 执行与 GC |
art/dex2oat/ | 编译 | oat 生成 |
art/runtime/class_linker.cc | 类加载 | 类管理 |
art/runtime/gc/ | GC | 内存回收 |
公共路径:art/。行号以 r75 检索为准。
代码安装后形成哪些产物,见 dex2oat 与编译产物。