# ART：Google 兑现了提升 Android 性能的承诺

- 作者：积木
- 发布时间：2014-07-07 00:45
- 分类：产品、特稿
- 原文：https://www.ifanr.com/430876

[![Android-L-ART&#95;678x452](https://s3.ifanr.com/wp-content/uploads/2014/07/Android-L-ART_678x452.jpg)](http://www.ifanr.com/430876/android-l-art_678x452)

Android 下一个版本将会有两个重大改变。其中一个是明显的改变，系统界面采用全新的 Material Design，另一个改变属于底层部分，但是也直接影响到用户体验。Google 将彻底抛弃 Davik，启动新的应用环境 ART（Android Runtime）。ART 能否解决长期困扰 Android 的卡顿问题？[AnandTech 网站](http://anandtech.com/show/8231/a-closer-look-at-android-runtime-art-in-android-l/)对此进行了深入的分析。

### 架构

ART 完全兼容 Dalvik 的字节码格式 dex，因此，开发者编写软件不会受到影响，也无需担心兼容性问题。ART 的一大变化是，它不仅支持即时编译（JIT），而且支持预先编译（AOT）。在 Dalvik 上，每次软件运行，都需从字节码编译为原生代码，ART 可以只编译一次。然后，软件每次运行时，执行编译好的原生代码。预先编译也为新的优化带来了可能性。同时，这也会明显改善电池续航，因为软件运行时不用编译了，从而减少了 CPU 的使用频率，降低了能耗。

ART 也有一些缺点。其中一个是，设备首次启动，以及应用的首次启动时间会变长，不过，Google 宣称说，这种差别不是很大，而且他们会在这方面努力，使其接近甚至超过 Dalvik。另一个缺点是原生代码占用空间更大，不过，现在设备的空间应该都足够。

### 垃圾回收

Android 虚拟机是自动内存管理。优点是，开发者无需担心内存管理，缺点是，开发者失去了控制权，依赖于系统本身的机制。Dalvik 的垃圾回收机制是造成系统卡顿的原因之一。在 Dalvik 虚拟机下，启动垃圾回收机制会造成两次暂停（一次在遍历阶段，一次在标记阶段）。所谓暂停，就是应用的所有线程都不再执行。如果暂停时间过长，应用渲染中就会出现掉帧。用户体验上来说，就是应用运行的时候出现卡顿。

Google 宣称，Neuxs 5 的平均暂停时间是 54ms，结果就是，每次垃圾回收启动，平均掉帧是 4 帧。如果应用编写的不好，情况会更加糟糕。Anandtech 测试了 FIFA 游戏。Dalvik 环境下，启动应用的几秒内，垃圾回收启动 9 次，应用暂停时间总和 603ms，总共掉帧是 214 帧。在 ART 下，情况有了极大改善。同样时间里，应用暂停时间总和是 12.364ms（4 次前台垃圾回收，2 次后台垃圾回收），总共掉帧是 63 帧。

ART 能够做到这一点，是因为应用本身做了垃圾回收的一些工作。垃圾回收启动后，不再是两次暂停，而是一次暂停。在遍历阶段，应用不需要暂停，而标记阶段的暂停时间也大大缩短，因为 Google 使用了一种新技术（packard pre-cleaning），在暂停前就做了许多事情，减轻了暂停时的工作量。Google 承诺说，他们已经把平均暂停时间降到了 3ms，远远超过 Dalvik 的垃圾回收。

与此同时，Google 还改进了内存分配系统，把分配速度加快了 10 倍。垃圾回收算法也进行了修改，以增强用户体验，避免应用被打断。

### 64 位支持

ART 支持 64 位系统，这会带来性能上的提升，加密能力的大幅改进，同时保持与现有 32 位应用的兼容性。与苹果不同的是，Google 使用了指针压缩，以避免转换到 64 位后，空间占用大幅增加，其虚拟机仍然是 32 位指针。

Google 宣称，现有 Play Store 上应用中，85% 都可以转移到 64 位，剩下的 15% 有原生代码，需要重新编译。总的来说，转移到 64 位应该会在短时间内完成。

### 总结

从许多方面来说，Google 兑现了其提升性能的承诺，解决了困扰 Android 的诸多问题。Android 的一些致命弱点，原因在于非原生应用和自动内存管理系统，ART 在这些方面做出了大量改进。总之，在应用的流畅度和性能方面，Android 终于可以与 iOS 一决高下了。

图片来自 [anandtech](http://anandtech.com/show/8231/a-closer-look-at-android-runtime-art-in-android-l/)
