Android 运行时 (ART) 是应用和 Android 上的一些系统服务使用的托管运行时。ART 及其前身 Dalvik 最初是专门为 Android 项目创建的。ART 作为运行时执行 Dalvik 可执行文件 (DEX) 格式和 DEX 字节码规范。
ART 和 Dalvik 是运行 DEX 字节码的兼容运行时,因此为 Dalvik 开发的应用在与 ART 一起运行时应该可以工作。但是,某些在 Dalvik 上有效的技术在 ART 上无效。有关最重要的问题的信息,请参阅验证 Android 运行时 (ART) 上的应用行为。
ART 功能
以下是 ART 实现的一些主要功能。
提前 (AOT) 编译
ART 引入了提前 (AOT) 编译,这可以提高应用性能。ART 还具有比 Dalvik 更严格的安装时验证。
在安装时,ART 使用设备上的 dex2oat 工具编译应用。此实用程序接受 DEX 文件作为输入,并为目标设备生成编译后的应用可执行文件。该实用程序应该能够毫无困难地编译所有有效的 DEX 文件。但是,某些后处理工具会生成无效文件,这些文件可能被 Dalvik 容忍,但无法被 ART 编译。有关详细信息,请参阅解决垃圾回收问题。
改进的垃圾回收
垃圾回收 (GC) 非常消耗资源,这会损害应用的性能,导致显示卡顿、UI 响应缓慢和其他问题。ART 通过以下几种方式改进了垃圾回收
- 主要采用并发设计,具有单个 GC 暂停
- 并发复制以减少后台内存使用和碎片
- GC 暂停的长度与堆大小无关
- 收集器具有更低的总 GC 时间,用于清理最近分配的、生命周期短的对象这一特殊情况
- 改进的垃圾回收人体工程学,使并发垃圾回收更加及时,这使得
GC_FOR_ALLOC
事件在典型用例中极为罕见
开发和调试方面的改进
ART 提供了许多功能来改进应用开发和调试。
支持采样分析器
过去,开发人员一直使用 Traceview 工具(专为跟踪应用执行而设计)作为分析器。虽然 Traceview 提供了有用的信息,但其在 Dalvik 上的结果因每个方法调用的开销而有所偏差,并且使用该工具会明显影响运行时性能。
ART 添加了对专用采样分析器的支持,该分析器没有这些限制。这在不显着降低速度的情况下,更准确地了解应用执行情况。在 KitKat 版本中,为 Dalvik 的 Traceview 添加了采样支持。
支持更多调试功能
ART 支持许多新的调试选项,尤其是在监视器和垃圾回收相关功能方面。例如,您可以
- 查看堆栈跟踪中持有的锁,然后跳转到持有锁的线程。
- 询问给定类有多少个实时实例,要求查看实例,并查看哪些引用使对象保持活动状态。
- 为特定实例过滤事件(如断点)。
- 查看方法退出时返回的值(使用“method-exit”事件)。
- 设置字段观察点以在访问和/或修改特定字段时暂停程序的执行。
改进了异常和崩溃报告中的诊断详细信息
当运行时异常发生时,ART 会尽可能多地为您提供上下文和详细信息。ART 为 java.lang.ClassCastException
、java.lang.ClassNotFoundException
和 java.lang.NullPointerException
提供了扩展的异常详细信息。(更高版本的 Dalvik 为 java.lang.ArrayIndexOutOfBoundsException
和 java.lang.ArrayStoreException
提供了扩展的异常详细信息,现在包括数组的大小和越界偏移量,ART 也这样做。)
例如,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
ART 还在应用原生崩溃报告中提供了改进的上下文信息,包括 Java 和原生堆栈信息。
报告问题
如果您遇到任何并非由应用 JNI 问题引起的问题,请通过Android 开源项目问题跟踪器报告它们。包括 adb bugreport
,并在 Google Play 商店中链接到该应用(如果可用)。否则,如果可能,请附加一个重现该问题的 APK。