ART vs Dalvik - 介绍新的 Android x86 运行时





0/5 (0投票)
ART vs Dalvik - 介绍新的 Android x86 运行时
Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台与技术信息、代码示例以及同行专业知识,助力开发者创新并取得成功。加入我们的社区,面向 Android、物联网、Intel® RealSense™ 技术和 Windows,下载工具、访问开发套件、与志同道合的开发者分享想法,并参与黑客松、竞赛、路演和本地活动。
Android* 5.x 最显著的改变之一是转向一种相对较新的应用执行方式,称为 Android 运行时 (ART)。使用 ART 的选项自 Android 4.4 (KitKat) 版本起就已可用。KitKat 用户可以在 ART 和其前身 Dalvik 之间进行选择。现在 ART 是 Android Lollipop 中唯一的运行时环境。
ART 和 Dalvik 运行时兼容运行相同的 Dex 字节码,因此为 Dalvik 开发的应用在 ART 环境下运行应该效果良好。但 ART 有一些特定的差异,将在本文中进行解释。
让我们来看看 ART 中实现的主要功能。
预编译 (Ahead-of-Time Compilation)
ART 与 Dalvik 不同的主要功能是预编译 (AOT) 范式。根据 AOT 概念,DEX 字节码翻译只发生一次,即在应用安装到设备上时。与 Dalvik 的即时编译 (JIT) 方法(每次运行应用时都会翻译代码)相比,这带来了实际的好处。这里有 一篇文章,您可以在其中找到有关 AOT 编译如何改变用户设备的性能、电池续航、安装时间和存储占用的更多信息。
垃圾回收
ART 的另一项改进是内存管理。垃圾回收 (GC) 是影响性能的关键过程,因为它会影响用户体验。ART 的垃圾回收器包含一些可以超越 Dalvik GC 的增强功能。
首先,新的 GC 在 **一次暂停** 中枚举所有已分配的对象并标记所有可达对象,而 Dalvik 的 GC 会暂停两次。
其次,标记-清除算法的 **并行化** 使应用能够显著减少暂停时间。
第三,在某些需要清理最近分配的、短暂存在的对象的情况下,ART 的总 GC 时间更短。
第四,ART 使并发 GC 更及时。因此,当堆已满而应用尝试分配内存时,应用不必停止。
内存管理的最后一个变化是紧凑型 GC 功能的出现。有时 OutOfMemoryErrors 的发生并非由于应用内存不足,而是由于没有足够大的连续内存块来处理应用的请求。这些错误是 Android 开源项目 (AOSP) 为 ART 开发紧凑型 GC 的原因。紧凑型 GC 将释放的单个内存块合并到一个易于分配的位置。
这是一个非常有用的功能,但由于紧凑型 GC 仍处于开发阶段,因此存在一些限制,尤其是在使用 Java* Native Interface (JNI) 的应用中。Android 建议开发者避免不兼容的操作,并更加关注指针。此外,使用 CheckJNI 来捕获潜在错误也是明智之举。
开发和调试
最后一个增强的 ART 功能涉及应用开发和调试领域。
ART 添加了对专用采样分析器的支持。以前,用于分析 Android 应用的常用工具是称为 TraceView 的执行日志图形查看器。但使用此工具会对运行时性能产生负面影响。采样分析器测量操作系统中断。因此,与其它方法相比,使用采样分析器对应用的侵扰性更小,副作用也少得多。现在添加到 TraceView 的这个新的专用分析器可以在应用以自然速度运行时提供应用行为的准确图景,而不会显著减慢速度。
此外,ART 还支持一些新的调试选项,例如监控锁、计算某些类别的活动实例、设置字段观察点以在特定事件发生时停止应用执行等。
ART 的另一个可以加速开发的改进是异常和崩溃报告中更清晰的诊断信息。Dalvik 的最新版本为 java.lang.ArrayIndexOutOfBoundsException
和 java.lang.ArrayStoreException
提供了扩展的异常详细信息。ART 为 java.lang.ClassCastException
、java.lang.ClassNotFoundException
和 java.lang.NullPointerException
提供了详细信息。
java.lang.NullPointerException: Attempt to write to field 'int android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
更多信息可在文章中找到:在 Android 运行时 (ART) 上验证应用行为。
摘要
AOT 编译、垃圾回收、开发和调试的改进以及这里讨论的其它功能,使得 ART 相较于 Dalvik 取得了巨大的进步。现代技术使设备能够成为多核、拥有大型内存和存储容量,以兼容 ART 的要求。此外,一些 ART 功能,例如紧凑型 GC,目前仍在开发中。新的运行时处于 Google 开发的前沿,这意味着它很可能会看到扩展和升级的功能。