dexopt 和 dex2oat 的区别?

Posted

技术标签:

【中文标题】dexopt 和 dex2oat 的区别?【英文标题】:Difference between dexopt and dex2oat? 【发布时间】:2014-12-02 23:22:32 【问题描述】:

Google 正在从 Dalvik 移动到 ARTandroid 运行时)。

我试图了解它将如何提高性能。

我找到的最好的解释是下图:

已更改的主要组件之一是 dexoptdex2oat

由于我对这些不太了解,谁能解释其中的区别以及这将如何提高性能?

【问题讨论】:

你能分享这张图片的来源吗? @Owen en.wikipedia.org/wiki/File:ART_view.png 【参考方案1】:

dexopt 对 dex 文件做了一些优化。它会使用包含被调用方法的 vtable 索引的优化版本替换虚拟调用指令,这样它就不必在执行期间执行方法查找。

dexopt的结果是一个odex(优化的dex)文件。这和原始的 dex 文件非常相似,只是它使用了一些优化的操作码,比如优化的调用虚拟指令。

dex2oat 获取一个 dex 文件并编译它。结果本质上是一个elf文件,然后本机执行。因此,它不再拥有由虚拟机解释的字节码,而是拥有可由处理器本机执行的本机代码。这称为 AOT(提前)编译。

这两个工具都正常运行at install time on the device。

另一个需要考虑的因素是 dalvik 使用了 JIT(即时)编译器——这意味着它还能够将字节码编译为本机代码。然而,主要区别在于 ART 会提前编译所有内容,而 dalvik 仅使用启发式方法编译字节码的子集,以检测最频繁执行的代码,并在执行期间编译。

【讨论】:

可以,直接执行oat文件。你会想看看 AOSP 中的艺术项目。 这可能是一个愚蠢的问题,但如果 dex2oat 生成使用“提前”(AOT)编译的本机代码,为什么不叫 dex2aot?可能是拼写错误还是完全意味着什么? Art 的 AOT 编译图像文件称为 oat 文件。我不知道“oat”的含义/历史,但我猜这是 aot 的故意创造性拼写错误。 科洛,所以我有创意,奥托! ;-) @asgs 我发现了这个问题:What does OAT mean?【参考方案2】:

Android Runtime (ART) 是 Android 移动操作系统使用的应用程序运行时环境。 ART 取代了 Android 最初使用的进程虚拟机 Dalvik,将应用程序的字节码转换为本机指令,然后由设备的运行时环境执行。

与 Dalvik 不同,因为 Android 2.2 “Froyo” 每次启动应用程序时都使用即时 (JIT) 编译来编译字节码,ART 通过执行它引入了提前 (AOT) 编译的使用在安装应用程序时。通过减少需要在应用程序的操作中执行的编译总量,可以减少移动设备的处理器使用量并提高电池运行时间。同时,ART 在性能、垃圾收集、应用程序调试和分析方面带来了改进。

为了保持向后兼容性,ART 使用与 Dalvik 相同的输入字节码,通过标准 .dex 文件作为 APK 文件的一部分提供,而 .odex 文件被替换为可执行和可链接格式 (ELF) 可执行文件。使用 ART 的设备上 dex2oat 实用程序编译应用程序后,它将仅从已编译的 ELF 可执行文件中运行;这种方法消除了 JIT 编译所涉及的各种开销,但是在安装应用程序时需要额外的编译时间,并且应用程序会占用稍多的空间来存储已编译的代码。

【讨论】:

以上是关于dexopt 和 dex2oat 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

android开发入门与实战作者,高薪程序员必会

Android 逆向ART 脱壳 ( dex2oat 脱壳 | aosp 中搜索 dex2oat 源码 | dex2oat.cc#main 主函数源码 )

Android 逆向ART 脱壳 ( dex2oat 脱壳 | /art/dex2oat/dex2oat.cc#Dex2oat 函数源码 )

如何修复“'dexOptions(Action<DexOptions>): Unit' 已弃用。设置 dexOptions 已过时。”?

Android Gradle 插件DexOptions 配置 ① ( BaseExtension#dexOptions 脚配块配置 | DexOptions 属性配置简介 )

Android 逆向ART 函数抽取加壳 ② ( 禁用 dex2oat 简介 | TurboDex 中禁用 dex2oat 参考示例 )