安卓

首页 » 常识 » 诊断 » android中的虚拟机3AR
TUhjnbcbe - 2021/7/20 9:22:00
医治白癜风的知名专家 http://m.39.net/news/a_5941698.html

但是为了兼容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服务。

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: android中的虚拟机3AR