安卓4.4 KitKat里最引人关注的变化之一就是新的安卓运行时ART,但因为还是试验性质的,Google并未做大张旗鼓的宣传,相关介绍也很少,只说它有望取代使用许久的Dalvik虚拟机。
AnandTech近日详细考察了Nexus 5,其中就对ART模式做了一些介绍和测试。
在安卓设备上,Dalvik虚拟机是运行Java语言编写应用的必需步骤,正是它将应用编译为字节码(ByteCode),然后再转换成dex(Dalvik可执行格式),最终交给Dalvik虚拟机来运行。
通过这一过程,安卓应用可以很好地适应各种形形色色的设备,但也因为中间的转换过程降低了执行效率。
Android 2.2的时候引入了即时编译器(JIT),大大提高了部分应用的执行效率。此后虽然不再有明显的性能提升,但是Google和厂商们一直都在优化Dalvik。事实上,如果你执行了Dalvik缓存清理,就会看到“安卓正在更新”(Android is upgrading)的提示,此时幕后就正在对dex文件进行深入优化,同时重建Dalvik缓存分区。
ART抛弃了JIT而转向AOT(预先编译)模式,会在启动过程中同样的“安卓正在更新”时开始生效,只不过需要更长时间。
如果查看这个时候的系统日志,就会发现新的ART文件格式“dex2oat”正在运行、编译成文件、建立Dalvik缓存。
I/art ( 615): DexFile_isDexOptNeeded cache file /data/dalvik-cache/data@app@com.google.android.apps.maps–2.apk@classes.dex does not exist for /data/app/com.google.android.apps.maps–2.apk
I/PackageManager( 615): Running dexopt on: com.google.android.apps.maps
I/dex2oat ( 951): dex2oat: /data/dalvik-cache/data@app@com.google.android.apps.maps–2.apk@classes.dex
W/dex2oat ( 951): Compilation of com.google.zxing.g.a.s[] com.google.zxing.g.a.s.f() took 126.362083ms
ART目前兼容ARMv7、x86、MIPS三种处理器架构,还不支持64位的ARMv8,而且从字节码到原生代码的转换暂时仅支持AOT编译,JIT模式得以后再说。这更加证明了ART现在的试验性质。
底层虚拟机的变化对安卓应用的性能、耗电量影响都是巨大的,ART又有什么变化呢?
这里找来两部Nexus 5、两部Moto X,分别各自运行Dalvik、ART。运行时模式可以在设置-开发者选项里切换,而除了少部分应用之外,大多数都可以正常运行于ART。
Nexus 5 AndEBench测试中,单线程下ART的速度有所提升,但是双线程、四线程不如Dalvik,显然在线程分派方面还不够好。
Caffeinemark是一款经典的Java测试程序,ART性能暴增了超过50%。Linpack也提升了几乎30%。
某厂商看到了Caffeinemark的对比后也赞叹不已,并表示Dalvik的潜力确实已经基本挖掘殆尽,ART是个很好地的方向。
Moto X上使用了高通定制的Dalvik,AndEBench单线程、双线程表现基本不相上下,四线程模式无法运行,Caffeinemark则提升了不到20%。
事实证明,ART的确可以带来明显的性能提升,进一步优化后肯定还会更好,但是也有一些代价,必需需要占用更多存储空间,应用安装和系统启动时间会延长不少(AOT编译),不过我们相信这是值得的。