版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
dex2oat
dex2oat 是 Android 系统中的一个核心工具,负责将应用中的 .dex(Dalvik Executable)字节码编译为本地机器代码(native code),以提高运行效率。它的全称是 DEX to OAT(Optimized Android Transport)。
dex2oat 的作用

在 Android 系统中,Java/Kotlin 编写的应用在编译时会被转换为 .dex 文件。为了提高性能,Android 会将 .dex 文件进一步编译为 .oat 文件(或 .odex/.vdex 文件),以便设备可以直接执行本地代码而不是解释执行 .dex 字节码。
工作原理(简要流程)
输入:一个或多个 .dex 文件(通常来自 APK 中的 classes.dex)。
输出:生成 .oat(Optimized Android Executable)、.vdex(Verified DEX)和 .art(Android Runtime)文件。
过程:
-
验证并优化 .dex。
-
使用 AOT(Ahead-Of-Time)方式将 .dex 转为本地机器码。
-
生成平台相关的可执行文件,用于加快应用启动速度。
编译模式:
-
AOT(Ahead-Of-Time):安装或开机前就编译好,提高运行速度。
-
JIT(Just-In-Time):运行时动态编译,节省空间但牺牲性能。
-
Hybrid(混合):Android 7.0+ 默认模式,结合 AOT 与 JIT。
执行时机
-
第一次开机:系统会对预装的应用使用 dex2oat 编译。
-
App 安装时:根据编译策略(speed, quicken, interpret-only 等)选择是否编译。
-
系统升级/补丁后:部分 DEX 文件会重新编译。
文件格式说明
-
.dex:Dalvik 字节码文件,APK 中的代码格式。
-
.oat / .odex:包含从 dex 编译来的 优化后的中间表示代码。
-
.vdex:包含验证后的 dex 和优化信息。
-
.art:Android Runtime 中的预编译执行数据
调用 dex2oat
把一个 dex 文件 push 到 sdcard 上
adb push classes3.dex /sdcard/Android/data/com.cyrus.example/files/classes3.dex
调用 dex2oat 生成 odex 文件
/system/bin/dex2oat \
--dex-file=/sdcard/Android/data/com.cyrus.example/files/classes3.dex \
--oat-file=/sdcard/Android/data/com.cyrus.example/files/classes3.odex \
--instruction-set=arm64 \
--runtime-arg -Xbootclasspath:/apex/com.android.art/javalib/core-oj.jar:/apex/com.android.art/javalib/core-li

最低0.47元/天 解锁文章
6131

被折叠的 条评论
为什么被折叠?



