但是为了兼容android4.4及以下的程序,这个ART虚拟机也需要有Dalvik虚拟机的特性,但是就在这个基础上加上了一个很好的特性AOT(aheadoftime),根据英文可以简单理解成,运行前编译。
但是从Android7.0(代号Nougat,简称N)开始,又引入了JIT编译,以及AOT与JIT混合使用的ART虚拟机
这里简单介绍下这个ART虚拟机。
ART虚拟机从7.0开始就混合使用3种编译方式
1、使用预先(AOT)编译:程序运行前编译好
2、即时(JIT)编译:一边运行一边编译
3、配置文件引导型编译
这些编译方式互相组合,共同为程序运行提供最优的服务。
例如,Pixel设备配置了以下编译流程:
最初安装应用时不进行任何AOT编译。应用前几次运行时,系统会对其进行解译,并对经常执行的方法进行JIT编译。
当设备闲置和充电时,编译守护程序会运行,以便根据在应用前几次运行期间生成的配置文件对常用代码进行AOT编译。
下一次重新启动应用时将会使用配置文件引导型代码,并避免在运行时对已经过编译的方法进行JIT编译。在应用后续运行期间经过JIT编译的方法将会添加到配置文件中,然后编译守护程序将会对这些方法进行AOT编译。
ART包括一个编译器(dex2oat工具)和一个为启动Zygote而加载的运行时(libart.so)。dex2oat工具接受一个APK文件,并生成一个或多个编译工件文件,然后运行时将会加载这些文件。文件的个数、扩展名和名称因版本而异。
也就是说,dex在程序运行前就经过dex2oat编译,编译后会生成.art、.oat两个文件,oat是一个android定制的elf文件,原始dex也保存在其中。
在8.0后,dex单独保存到.vdex文件中,另外还有经过AOT编译的odex文件和art文件
.vdex:其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据。
.odex:其中包含APK中已经过AOT编译的方法代码。
.art(optional):其中包含APK中列出的某些字符串和类的ART内部表示,类似于一个内存映像,缓存常用的ArtField、ArtMethod、DexCache等内容,加载后可直接使用,避免解析耗时。
可以想象,ART虚拟机将.dex文件提前做了一个优化处理,因此不会有一个合包的过程,这样ART虚拟机的使用会很大的提升APP冷启动速度。
下面来说说JIT编译
AndroidRuntime(ART)包含一个具备代码分析功能的即时(JIT)编译器,该编译器可以在Android应用运行时持续提高其性能。JIT编译器对Android运行组件当前的预先(AOT)编译器进行了补充,可以提升运行时性能,节省存储空间,加快应用和系统更新速度。相较于AOT编译器,JIT编译器的优势也更为明显,因为在应用自动更新期间或在无线下载(OTA)更新期间重新编译应用时,它不会拖慢系统速度。
官方给出了这样一个图,其实很清楚了
1、如果应用在运行前已经经过AOT编译了,那就会有oat文件。这个oat直接通过ART就可以运行了
2、如果没有经过AOT编译,那就还是dex文件。这时候在运行时对dex指令进行interpreter,生成机器码运行。
3、ART根据函数调用的次数来决定热点代码,并以函数为维度将热点代码的机器码进行缓存,以便下一次更加快捷的调用该机器码。
Android的编译器不断更新,这是android平台本身不断发展的结果。每一个新的解释器推出,总是要做出一些优化,或者提高效率,或者降低资源损耗。最终目标肯定是以人为本,让大众享受到更好的android服务。
预览时标签不可点收录于话题#个上一篇下一篇