Android虚拟机的JIT编译器

2019-06-07  本文已影响0人  None_Ling

背景

最近参加了华为方舟的Workshop,从编译到Runtime都有了一些体会,并且对于虚拟机的运行也有了一些了解。

Android虚拟机的演变

Dalvik虚拟机

原理
KitKat的JIT
优点与缺点

5.0-7.0的Art虚拟机

在5.0-7.0(Android N)之间,Android提出了ART虚拟机的概念,而运行的文件格式也从odex转换成了oat格式。

原理

在APK安装的时候,PackageManagerService会调用dex2oat通过静态编译的方式,来将所有的dex文件(包括Multidex)编译oat文件。

编译完后的oat其实是一个标准的ELF文件,只是相对于普通的ELF文件多加了oat data section以及oat exec section这两个段而已。

这两个段里面主要保存了两种信息:

在运行的时候,就直接运行oat的代码。而其中的Dex文件的内容也就是为了DexClassLoader在动态加载其他的Dex文件时,在链接的过程中可以找到对应的meta-data,正确的链接到引用的类文件与函数。

罗老师的图
优点与缺点

7.0至今的Art虚拟机

由于上述的缺点,7.0之后的采用了Hybrid Mode的ART虚拟机:

将这三种方案进行混合编译,来从运行时的性能、存储、安装、加载时间进行平衡。

在第一次启动的时候,系统会以Intercept的方式来运行App,同时启动Compilation Daemon Service在系统空闲的时候会在后台对App进行AOT静态编译,并且会根据JIT运行时所收集的运行时函数调用的信息生成的Profile文件来进行参考 。

而根据Profile生成AOT的过程就是:Profile Guided AOT

而在JIT的过程中会进行以下事情:

Android N的ART模式
JIT的解释器
JIT的编译器

函数粒度的编译

生成Profile文件

使用单独的ProfileSaver线程

使用混编模式的原因
混编模式的实现

Profile文件会在JIT运行的过程中生成:

Offline Profile

而在BackgroundDexOptService中,会根据JIT运行时所生成的Profile以及Dex文件在后台进行AOT,根据运行时的Profile文件会选择性的将常用的函数编译成NativeCode

Profile Guided AOT

而整个JIT的工作流如下:

工作流

华为的方舟编译器

从方舟编译器来看:

参考资料

Understanding JIT Compilation and Optimizations
Android profile-guided dex2oat

上一篇 下一篇

猜你喜欢

热点阅读