49

Google正在从Dalvik( ARTAndroid 运行时) 移动。

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

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

达尔维克和艺术

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

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

4

2 回答 2

75

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

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

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

这两个工具通常在设备上安装时运行。

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

于 2014-10-08T17:40:11.810 回答
5

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 编译所涉及的各种开销,但在安装应用程序时需要额外的编译时间,并且应用程序会占用稍多的空间来存储已编译的代码。

于 2018-10-12T04:48:18.857 回答