深入解析 dex2oat:vdex、cdex、dex 格式转换全流程实战

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

dex2oat

dex2oat 是 Android 系统中的一个核心工具,负责将应用中的 .dex(Dalvik Executable)字节码编译为本地机器代码(native code),以提高运行效率。它的全称是 DEX to OAT(Optimized Android Transport)。

dex2oat 的作用

word/media/image1.png

在 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值