浅探Android新运行时环境ART

Dalvik已死,Dalvik永生

今天,旧版的Android运行时环境Dalvik正式从代码里移除,替换成了在Android4.4中推出的运行时环境ART。官方也正式宣告Dalvik退出了历史舞台:Dalvik已死,Dalvik永生。

ART是什么?

在过去,Android依靠Dalvik这个Java虚拟机运行时环境运行Android应用程序。我们都知道,Java跟C++、C不一样,Java写的程序并不会直接生成底层机器代码,而是生成字节码中间代码。程序在运行的时候需要由本地的Java运行时环境将中间代码即时翻译成机器码,从而实现统一款软件的跨平台运行。Dalvik就是这样一个在Android平台上的运行时环境。

通过这种方式,Android得以在不同的硬件配置上运行同样的Android应用,但由此也带来了效率底下,内存占用高,耗电快这些问题(程序运行的过程中需要空间、时间存放、翻译中间码,翻译过程也占用CPU资源)。

ART作为新的运行时环境,它跟Dalvik的不同之处在于,ART并不是在运行的时候翻译字节码,而是在安装的时候就将APK里的中间代码翻译成与当前设备适应的机器语言代码。这种提前编译的方式,使得应用能用更加高效、低功耗、低内存占用的运行。由于编译阶段提前至安装阶段,因此在安装的时间将会相应增加,编译出来的程序也将比安装包要大,但对于现在动则16G+容量的设备来说,这些多出来的空间占用并非大碍。

对于普通使用者来说这意味着什么?

ART运行时目前只在Android 4.4上出现,因此对非这个版本的用户来说其实没什么影响。对于那些系统支持ART的用户来说,理论上开启了ART将让设备运行得更流畅,但目前ART还处于实验阶段,所以性能上的提升还不是那么明显。当然,既然开发团队正式移除了Dalvik,换上ART,也就是ART通过了考验,在新版的Android系统中应该有不输于Dalvik的表现。总的来说,对普通用户还是没有什么影响。(现在可以期待下即将到来的Google I/O大会上将有什么新产品发布了)

对于开发者,这又意味着什么?

运行性能得到提升

得益于提前编译这一特性,绝大部分程序将得到不错的运行表现提升。ART使用一个称为dex2oat的工具来将打包好的APK包中的dex代码翻译成机器语言代码。

垃圾回收性能的提升

垃圾回收是Java里很重要的内容。ART提供了更好的垃圾回收表现: 1. 将垃圾回收时,程序的暂停次数由两次减少到一次 1. 程序暂停时,并行的进行垃圾回收处理 1. 回收新近分配的、生命期短的对象,垃圾回收器花费的时间更少

更方便进行开发、调试

  1. 支持数据采样和剖析
  2. 提供更多的调试特性
  3. 提供更多用于诊断的出错和崩溃报告信息

结论

就目前我们能接触到的ART实现来说,ART已经基本达到跟Dalvik性能一致的水平,后期超越Dalvik是迟早的事。ART提供了更多的特性,开发者能更加方便的开发高性能的Android应用。老设备若得到ART支持,将能焕发第二春?(据说官方能在512M内存的机器上流畅使用新版Android系统)

最后打个比方来形容Dalvik和ART的不同(如有雷同,纯属我抄你): Dalvik和ART都是自行车,但Dakvik是折叠式单车,而ART是普通单车。骑单车的话,使用Dalvik还要先组装好才能使用,而ART则直接骑上就能出发。这就是这两个运行时环境最大的区别。

That's all. But NOT ALL.