ART and Dalvik

原文链接

ART(Android runtime)用于托管Android应用程序和一些系统服务的运行时。ART和其前身Dalvik是专门为Android项目创建的。ART作为运行时可执行Dalvik可执行格式和Dex字节码规范。

ART和Dalvik在运行Dex字节码时可兼容,因此为Dalvik开发的App在ART下应该可以工作。但是,一些技术在Dalvik下可工作,但在ART下无法工作。关于这个问题的信息可以查看Verifying App Behavior on the Android Runtime (ART)

ART特性

下面是一些ART的主要特性。

预编译(AOT)

ART使用预编译可以提升App性能。ART还具有比Dalvik更严格的安装时间验证。

在安装时,ART会使用设备上的dex2oat工具编译应用。此工具可以将DEX文件作为输入,生成一个在目标设备上已编译好的应用程序可执行文件。此工具应该可以编译所有有效的DEX文件。但是,一些后处理工具会生成可以在Dalvik上运行但不能在ART上运行的无效文件。更多的信息可以查看解决GC问题

优化GC

垃圾回收(GC)可能会损害App的性能,导致显示不稳定、UI响应性能差等问题。ART通过下面这几种方式优化GC:

  • 一次GC暂停而不是两次(Dalvik的GC分为两个阶段:暂停所有线程分析堆使用情况;暂停所有线程清理堆。而ART在便利阶段不需暂停,因此只需要一次暂停并且垃圾回收时间也大大缩短)
  • 在GC暂停期间做并行处理
  • 对于最近分配以及短暂对象的特殊情况的清理时间更短
  • 改进GC机制,使并发GC更及时,这使得GC_FOR_ALLOC在典型的情况下很少发生
  • 紧凑型GC可以减少后台内存使用和碎片

开发和调试的改进

ART提供了一些特性去改善开发和调试:

支持采样分析器

以前,开发者使用Traceview工具(用于跟踪应用程序执行)作为分析器。Traceview提高了一些有用的信息,在Dalvik上它的结果被方法调用开销曲解,并且使用这个工具会很明显的影响运行时间性能。

ART增加了一个专门的采样分析器,它没有这些限制。它提供了更准确的应用程序执行视图,并且不会很明显的影响运行速度。在KitKat版本中,Dalvik的Traceview中添加了抽样的支持。

支持更多的调试特性

ART支持一些新的调试选项,特别是在monitor和GC相关功能中。比如,你可以:

  • 查看哪些锁在堆栈中被持有,然后跳到持有该锁的线程。
  • 查看一个类中有多少存活的实例,查看实例,查看保存对象的引用。
  • 过滤一个特定实例的事件(比如断点)。
  • 查看方法退出时返回的值(使用method-exit事件)。
  • 设置字段断点以在访问、修改特定字段时暂停程序的执行。
改进了异常和崩溃报告中的诊断信息

当运行时异常发生时,ART给你提供了尽可能多的上下文和详细信息。ART对于java.lang.ClassNotFoundExceptionjava.lang.NullPointerException提供了扩展的异常详细信息。(Dalvik的后续版本对java.lang.ArrayIndexOutOfBoundsExceptionjava.lang.ArrayStoreException提供了扩展的异常详细信息,包括数组的大小和边界偏移,ART也是这样。)

例如,java.lang.NullPointerException现在显示有关应用程序尝试使用空指针(如应用程序尝试写入的字段)或其尝试调用的方法的信息。 这里有一些典型的例子:

1
2
3
java.lang.NullPointerException: Attempt to write to field 'int
android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object
reference
1
2
java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String java.lang.Object.toString()' on a null object reference

ART在App本地崩溃报告中也提供了改进的Context信息,包括了Java和本地堆栈信息。

报告问题

如果你遇到的问题不是APP JNI问题,请通过Android开源项目问题跟踪工具报告问题。在Google Play商店中添加adb bugreport和指向该应用的链接(如果有)。否则,如果可能,请附加重现此问题的APK。请注意,问题(包括附件)会公开显示。