dexopt和dex2oat之间的区别?

Gok*_* KP 40 android dalvik dexopt android-runtime dex2oat

Google是从移动DalvikART(Android的运行系统).

我试图了解它是如何改善性能的.

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

Dalvik和ART

其中一个已改变的主要成分是dexoptdex2oat.

由于我对这些没有太多了解,有谁可以解释这些差异以及这将如何改善性能?

Jes*_*eke 63

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

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

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

这两种工具通常在设备上的安装时运行.

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

  • 科罗拉,所以我是个疯子,oto!;-) (7认同)
  • 这可能是一个愚蠢的问题,但如果dex2oat产生一个使用"Ahead of Time"(AOT)编译的本机代码,为什么不称为dex2aot?可能是一个错字或者它意味着什么? (3认同)
  • Art的AOT编译图像文件称为燕麦文件.我不知道"燕麦"的含义/历史,但我猜它是故意创造性的拼写错误的aot. (3认同)
  • 是的,燕麦文件是直接执行的.你想看看AOSP中的艺术项目. (2认同)
  • @asgs我发现了这个问题:[* OAT是什么意思?*](/sf/ask/1990510231/) (2认同)

小智 5

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

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

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