自 2008 年 9 月 23 日对外发布第一个版本 Android 1.0 以来,在摩尔定律和安迪比尔定律的共同做用下,Android 系统以每一年至少一次重大更新(2016 年至今每一年一次)速度进行迭代,在进行版本迭代的过程当中,Android 虚拟机的发展不可忽视。android
在 Android 系统初期,不一样于 Java 平台使用 JVM 加载字节码文件(.class),Android 系统由 Dalvik 担任虚拟机的角色,每次运行程序的时候,Dalvik 负责加载 dex/odex 文件并解析成机器码交由系统调用。函数
为了适应硬件速度的提高,Android 系统系统也在不断更新,单一的 Dalvik 虚拟机已经渐渐地知足系统的要求了,2010 年 5 月 20 日,Google 发布 Android 2.2(Froyo冻酸奶),在这个版本中,Google 在 Android 虚拟中加入了 JIT 编译器(Just-In-Time Compiler)。性能
和其余大多数 JVM 同样,Dalvik 使用 JIT 进行即时编译,借助 Java HotSpot VM,JIT 编译器能够对执行次数频繁的 dex/odex 代码进行编译与优化,将 dex/odex 中的 Dalvik Code(Smali 指令集)翻译成至关精简的 Native Code 去执行,JIT 的引入使得 Dalvik 的性能提高了 3~6 倍。优化
可是 JIT 模式的缺点也不容忽视:翻译
2013 年 10 月 31 日,Google 发布 Android 4.4(奇巧Kitkat),带来了全新的虚拟机运行环境 ART(Android RunTime)的预览版和全新的编译策略 AOT(Ahead-of-time),须要注意的是,彼时 ART 是和 Dalvik 共存的,用户能够在二者之间进行选择(感受怪怪的,用户但是小透明啊)。3d
2014 年 10 月 16 日,Google 发布 Android 5.0(棒棒糖Lollipop),ART 全面取代 Dalvik 成为 Android 虚拟机运行环境,至此,Dalvik 退出历史舞台,AOT 也成为惟一的编译模式。code
AOT 和 JIT 的不一样之处在于:JIT 是在运行时进行编译,是动态编译,而且每次运行程序的时候都须要对 odex 从新进行编译;而 AOT 是静态编译,应用在安装的时候会启动 dex2oat 过程把 dex 预编译成 ELF 文件,每次运行程序的时候不用从新编译,是真正意义上的本地应用。cdn
另外,相比于 Dalvik,ART 对 Garbage Collection(GC)过程的也进行了改进:视频
AOT 模式解决了应用启动和运行速度和耗电问题的同时也带来了另外两个问题:对象
这也给 Android 系统后续的优化埋下了伏笔。
用过 Android 手机的人应该都知道,在 Android 5.x 和 6.x 的机器上,系统每次 OTA 升级完成重启的时候都会有个应用优化的过程,这个过程就是刚才所说的 dex2oat 过程,这个过程比较耗时而且会占用额外的存储空间。
2016 年 8 月 22 日,Google 发布 Android 7.0(牛轧糖Nougat),JIT 编译器回归,造成 AOT/JIT 混合编译模式,这种混合编译模式的特色是:
能够看出,混合编译模式综合了 AOT 和 JIT 的各类优势,使得应用在安装速度加快的同时,运行速度、存储空间和耗电量等指标都获得了优化。
Android 系统从诞生到如今,经历了几回重要更新,最终选择了折衷的方案,使得系统的安装和运行的时候各项指标都获得了优化,至此,Android 虚拟机的发展进程告一段落。可是,随着硬件性能的不断提高,相信谷歌的脚步不会就此中止,期待谷歌能在将来给咱们不断带来惊喜。
source.android.com/devices/tec…
若是你对文章内容有不一样意见,欢迎留言,咱们一同探讨。