Dalvik与ART虚拟机

对于android 5.0之后的系统都默认采用ART虚拟机,其执行速度要比Dalvik快很多。

Dalvik虚拟机

Dalvik虚拟机是基于JIT(Just-In-Time)即时编译,虚拟机在执行dex中的代码时将一些调用频率高的函数编译为对应的机器指令,这样当下一次运行此函数时就直接运行对应的机器代码从而提高了程序的执行效率。这里只针对执行频率较高的热点代码而不会将所有的dex代码都编译为机器指令,因为dex文件中的一些函数只执行一次或者很少的次数,如果对其进行编译反而会增加程序的运行时间(编译过程也需要花费很多运行时间)。

ART虚拟机

ART虚拟机是基于AOT(Ahead-Of-Time)预编译,也就是每次在安装应用程序的时候就把dex文件编译成对应的机器码并保存起来,这样当执行apk文件时直接执行对应的机器码,无须再次进行编译提高了运行速度。但同时因为在apk安装的时候需要进行编译,增加了apk安装所需要的时间。所以在android 7之后的ART虚拟机使用了JIT + AOT协同工作的方式,程序在运行时执行频率较高的代码还是会被jit编译,不同的是这次编译后会产生profile代码保存在磁盘中,当设备充电或者处于待机状态时守护进程会对所有应用程序的profile文件进行AOT编译并生成.oat文件,这样下一次apk再运行时就会加载此oat文件。

dex优化

Dalvik虚拟机可以利用dexopt对dex文件进行优化,dex文件在加载的时候就会触发dexopt优化逻辑,其会对dex文件中的一些指令进行优化,优化后的文件还是一个dex文件。

Art虚拟机通过dex2opt对dex文件进行AOT编译,生成的oat文件实际是一个包含本地代码的ELF文件,但实际其后缀还是.odex文件,只不过文件格式已经不是dex文件的格式而是一个elf文件的格式。(有一点需要特别注意,dexopt只是dalvik用来优化dex文件的程序,他和dalivk的jit即时编译技术没有关系,而dex2oat是ART虚拟机的AOT事前编译技术的核心程序)

posted @ 2022-04-10 02:39  怎么可以吃突突  阅读(200)  评论(0编辑  收藏  举报