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.ClassNotFoundException
和java.lang.NullPointerException
提供了扩展的异常详细信息。(Dalvik的后续版本对java.lang.ArrayIndexOutOfBoundsException
和java.lang.ArrayStoreException
提供了扩展的异常详细信息,包括数组的大小和边界偏移,ART也是这样。)
例如,java.lang.NullPointerException
现在显示有关应用程序尝试使用空指针(如应用程序尝试写入的字段)或其尝试调用的方法的信息。 这里有一些典型的例子:
1 | java.lang.NullPointerException: Attempt to write to field 'int |
1 | java.lang.NullPointerException: Attempt to invoke virtual method |
ART在App本地崩溃报告中也提供了改进的Context信息,包括了Java和本地堆栈信息。
报告问题
如果你遇到的问题不是APP JNI问题,请通过Android开源项目问题跟踪工具报告问题。在Google Play商店中添加adb bugreport
和指向该应用的链接(如果有)。否则,如果可能,请附加重现此问题的APK。请注意,问题(包括附件)会公开显示。