Android虚拟机

512 阅读3分钟

一、虚拟机概念:

Linux内核之上构建了一个虚拟机,Android应用运行在虚拟机之上

1、Dalvik虚拟机:Android4.4及之前使用的虚拟机

采用JIT(Just-In-Time)技术,应用执行时,Dalvik将程序的代码实时编译为机器语言执行。

2、ART(Android RunTime)虚拟机:Android5.0及以后使用。

1)采用AOT(Ahead-Of-Time)技术,应用程序安装时就转换成机器语言,不再在执行时解释,从而优化了应用运行的速度。

2)内存管理优化,对内存分配和回收都做了算法优化,降低了内存碎片化程度,减少了GC次数。回收时间也得以缩短。

二、app安装运行

Java文件在编译成class文件,然后经过Android平台的dx工具转换为Dex文件后,同Native code(JNI)和资源一起打包成apk,apk安装到手机后解压出Dex文件。

1)Dalvik会通过dexopt工具将Dex优化,成为Odex文件,Odex文件的效率比Dex高,但其中大部分代码仍然需要每次执行时编译;

2)ART则会将Dex通过dex2oat工具编译得到一个ELF文件,它是一个可执行的文件。

关于Java代码的执行过程,以一段简单的代码为例:

int a = 1;

int b = 2;

public int test() {

① int x = a;

② int y = b;

int z = a + b;

return z;

}

在执行这段Java代码时,Dalvik虚拟机先要把test()方法的每句代码转译成Dex代码,对其中的① ② 两句赋值语句,执行时需要在虚拟机中进行“指令读取—识别指令—跳转—实例操作”的解析过程;而ART中Java代码都被以方法为单位编译成汇编指令,执行上面这个方法的时候,① ② 两句代码只需要直接拷贝两个寄存器的值,各需要一条汇编指令就可以完成,省去了跳转、指令读取的过程,执行效率也就大大提高了。

三、对比

art缺点:

1)apk经过dex2oat预编译之后,占用的空间增加,因此Android ROM占用的空间更大

2)安装时间变长和系统升级之后的应用优化比较耗时

四、进化史

Android2.2~Android4.4 :JIT

Android5.0~Android6.0 : AOT

Android7.0以后:AOT/JIT混合编译

这种混合编译模式的特点是:

  • 应用在安装的时候 dex 不会被编译
  • 应用在运行时 dex 文件先通过解析器(Interpreter)后会被直接执行(这一步骤跟 Android 2.2 - Android 4.4之前的行为一致),与此同时,热点函数(Hot Code)会被识别并被 JIT 编译后存储在 jit code cache 中并生成 profile 文件以记录热点函数的信息。
  • 手机进入 IDLE(空闲) 或者 Charging(充电) 状态的时候,系统会扫描 App 目录下的 profile 文件并执行 AOT 过程进行编译。

可以看出,混合编译模式综合了 AOT 和 JIT 的各种优点,使得应用在安装速度加快的同时,运行速度、存储空间和耗电量等指标都得到了优化。

AOT_JIT