Google
正在从Dalvik
转移到ART
(Android运行时)。
我试图了解它是如何改善性能的。
我找到的最佳解释是下图:
已更改的主要组件之一是dexopt
到dex2oat
。
由于我对这些不太了解,有人可以解释其差异以及如何改善性能吗?
答案 0 :(得分:61)
dexopt对dex文件进行了一些优化。它使用包含被调用方法的vtable索引的优化版本替换虚拟调用指令,这样它就不必在执行期间执行方法查找。
dexopt的结果是odex(优化的dex)文件。这与原始dex文件非常相似,只是它使用了一些优化的操作码,比如优化的调用虚拟指令。
dex2oat接受一个dex文件并编译它。结果本质上是一个elf文件,然后本地执行。因此,它不具有由虚拟机解释的字节码,而是具有可由处理器本机执行的本机代码。这称为AOT(提前)编译。
这两个工具通常都会运行at install time on the device。
要考虑的另一个因素是dalvik使用了JIT(即时)编译器 - 这意味着它还能够将字节码编译为本机代码。然而,主要区别在于ART提前编译所有内容,而dalvik仅使用启发式编译字节码的子集来检测最常执行的代码,并在执行期间编译。
答案 1 :(得分:0)
Android运行时(ART)是Android移动操作系统使用的应用程序运行时环境。 ART取代了Dalvik(最初由Android使用的进程虚拟机),并将应用程序的字节码转换为本机指令,然后由设备的运行时环境执行。
与Dalvik不同,Dalvik自Android 2.2“ Froyo”每次启动应用程序以来均使用即时(JIT)编译来编译字节码,而ART通过执行它来引入提前(AOT)编译在安装应用程序时。通过减少需要在应用程序的整个操作中执行的编译总量,可以减少移动设备的处理器使用率并改善电池运行时间。同时,ART带来了性能,垃圾收集,应用程序调试和性能分析方面的改进。
为了保持向后兼容性,ART使用与Dalvik相同的输入字节码,并通过标准.dex
文件作为APK文件的一部分提供,而.odex
文件则替换为可执行和可链接格式(ELF)可执行文件。使用ART的设备上dex2oat实用程序对应用程序进行编译后,便只能从已编译的ELF可执行文件运行该应用程序;这种方法消除了JIT编译涉及的各种开销,但在安装应用程序时需要花费更多的时间进行编译,并且应用程序会占用稍多的空间来存储已编译的代码。