Android的ART和Dalvik
Android 运行时机制,即为ART,是一个管理的运行时机制,被android系统上的应用程序和一些系统服务使用。ART和他的前辈Dalvik初始被创建专门用于Android项目。ART作为运行时可以执行Dalvik可执行格式和Dex字节码的规范。
ART和Dalvik在运行Dex字节码上是兼容的,所以为Dalvik开发的apps应该在运行ART的系统上也能够正常运行。然而,一些专门为Dalvik设计的技术不能运行在ART运行时中。
ART的特征
下面是一些由ART实现的主要特征:
提前编译(AOT)
ART引入了AOT编译,这样的方式可以提高app的性能。ART也有比Dalvik更加紧凑的安装时间验证。
在安装时间上,ART使用设备上的dex2oat
工具编译。这个工具接收DEX文件作为输入,并且为目标设备生成一个编译的可运行的app。这个工具能够不费吹灰之力的编译所有有效的DEX文件。然而,一些Dalvik可允许的后处理工具生成的无效文件是不能被ART编译的。
提升垃圾回收
垃圾回收机制(GC)可以减低一款app的性能,导致波浪显示,低效的UI响应和其他问题。ART通过几种方式来提高垃圾回收:
一个GC暂停而不是两次
在剩余的GC暂停期间,并行处理
收集器拥有更少的整个GC时间,用于清理最近分配的,短周期对象
提高垃圾回收机制的工效,使并行的垃圾回收更加及时,这使得
GC_FOR_ALLOC
在典型的使用例子中更加稀少压紧GC来降低后台内存使用和碎片
开发和调试提升
ART提供了一些体征来提升app开发和调试。
支持样例分析
在历史上,开发者使用Traceview
工具(设计用来追踪应用执行)作为一个分析器。然而,Traceview给了有用的信息,在Dalvik上,他的结果已经被每次函数调用过量影响了,并且这个工具的使用也明显的影响了运行时的性能。
ART添加了专门的样例分析器支持,该分析器并没有这些限制。这给了对app执行更加精确的视图但没有明显的变慢。在KitKat发行版中,Dalvik已经将样例支持添加到Traceview中了。
支持更多调试特征
ART支持许多新的调试选项,尤其是在监视和垃圾回收相关的功能上。例如,你可以:
在栈追踪中查看什么锁被持有,然后跳转到持有这个锁的线程中。
查询一个给定的类有多少存在的实例,请求查看实例,并且查看什么引用正在包一个对象生存。
对一个指定的实例过滤事件(类似于断点)
查看一个方法的返回值,如果他存在的话(使用”method-exit”事件)。
当一个指定的域被访问或者是修改,设置域观察点来暂停程序的运行
在异常和崩溃报告中,提升判断细节
当运行时异常发生的时候,ART给了你尽可能多的上下文和细节。ART为java.lang.ClassCastException, java.lang.ClassNotFoundException, and java.lang.NullPointerException
提供了扩展的异常细节。
举个例子,java.lang.NullPointerException
现在展示了关于app正在尝试操作什么空指针,例如app正在尝试写入的域,或者是他正在尝试调用的方法,下面是一个典型的例子:
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在app本地崩溃报告中也提供了提升的上下文信息,包括Java和本地栈信息。在后面几篇博客中,我们专门介绍Android的ART和Dalvik相关的知识。