Android 运行时

JVM

Java Virtual Machine,缩写为JVM,Java虚拟机,一种能够运行Java字节码的虚拟机。

JIT

Just-in-time 即时编译,又译及时编译、实时编译,是一种提高程序运行效率的方法,是在Android2.2系统中引进到Dalvik虚拟机中的,通常程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而动态解释则是一句一句边运行边翻译。即时编译器则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。

AOT

AOT Ahead-Of-Time 预编译,在应用程序安装的过程中,ART就已经将所有的字节码重新编译成了机器码。应用程序运行过程中无需进行实时的编译工作,只需要进行直接调用。

Dalvik

Dalvik是Google等厂商合作开发的Android移动设备平台的核心组成部分之一。它可以支持已转换为.dex(即“Dalvik Executable”)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统

在app安装到手机之后,系统运行dexopt程序对dex进行优化,将dex的依赖库文件和一些辅助数据打包成odex文件。存放在cache/dalvik_cache目录下。保存格式为apk路径 @ apk名 @ classes.dex。这样以空间换时间大大缩短读取/加载dex文件的过程。

ART

Android Runtime(缩写为ART),是一种在Android操作系统上的运行环境,由Google公司研发,并在2013年作为Android 4.4系统中的一项测试功能正式对外发布,在Android 5.0及后续Android版本中作为正式的运行时库取代了以往的Dalvik虚拟机。ART能够把应用程序的字节码转换为机器码,是Android所使用的一种新的虚拟机。

混合编译

Android N混合使用AOT编译,解释和JIT三种运行时,以便在安装时间、内存占用、电池消耗和性能之间获得最好的折衷。

Dalvik vs JVM

Dalvik是基于寄存器的,而JVM是基于栈的。
Dalvik运行dex文件,而JVM运行java字节码

Dalvik vs ART

Dalvik采用的是JIT技术,而ART采用Ahead-of-time(AOT)技术。ART同时也改善了性能、垃圾回收、应用程序除错以及性能分析。

Dalvik优缺点

优点:

  1. 安装比较快,占用更少空间 
  2. 为简化翻译,常量池只使用32位索引  
  3. 标准Java字节码实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。这样减少了Dalvik的指令计数,提高了翻译速度

缺点:

开启应用比较慢

ART优缺点

优点:

  1. 系统性能的显著提升。
  2. 应用启动更快、运行更快、体验更流畅、触感反馈更及时。
  3. 更长的电池续航能力。
  4. 支持更低的硬件。

缺点:

  1. 机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。
  2. 应用的安装时间会变长。

Dalvik虚拟机和ART原理的对比图

Dalvik vs ART

混合编译的优点

  1. 即使是大应用,安装时间也能缩短到几秒
  2. 系统升级能更快地安装,因为不再需要优化这一步
  3. 应用的内存占用更小,有些情况下可以降低50%
  4. 改善了性能
  5. 更低的电池消耗

参考

Android 中的Dalvik和ART是什么,有啥区别?
Dalvik虚拟机
Java虚拟机
Android Runtime
Android N混合使用AOT编译,解释和JIT三种运行时
简单理解Android Dalvik、ART及APK编译过程
扒一扒 Android 运行时: DVM vs ART