Android dexopt和dex2oat之间的区别?

Android dexopt和dex2oat之间的区别?,android,dalvik,android-runtime,dexopt,dex2oat,Android,Dalvik,Android Runtime,Dexopt,Dex2oat,Google正在从Dalvik移动到ART(安卓运行时) 我试图理解,它将如何提高性能 我发现最好的解释是下图: 已更改的主要组件之一是dexopt到dex2oat 由于我对这些不太了解,有人能解释一下区别以及这将如何提高性能吗?dexopt对dex文件进行了一些优化。它可以用包含被调用方法的vtable索引的优化版本替换虚拟invoke指令,这样就不必在执行过程中执行方法查找 dexopt的结果是一个odex(优化的dex)文件。这与原始的dex文件非常相似,只是它使用了一些优化的操作码,比

Google
正在从
Dalvik
移动到
ART
(安卓运行时)

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

我发现最好的解释是下图:

已更改的主要组件之一是
dexopt
dex2oat


由于我对这些不太了解,有人能解释一下区别以及这将如何提高性能吗?

dexopt对dex文件进行了一些优化。它可以用包含被调用方法的vtable索引的优化版本替换虚拟invoke指令,这样就不必在执行过程中执行方法查找

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

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

这两种工具都正常运行

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

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

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


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

您能否共享此映像的源代码?@Owen是的,直接执行oat文件。您可能想看看AOSP中的art项目。这可能是一个愚蠢的问题,但如果dex2oat生成一个使用“提前”(AOT)编译的本机代码,为什么不称为dex2aot?可能是打字错误,也可能意味着什么?Art的AOT编译图像文件称为oat文件。我不知道“oat”的含义/历史,但我猜这是对aot.Colo的故意创造性拼错,所以我可以用craetive,oto!;-)@asgs我发现了这个问题: