Android 運行時 (ART) 和 Dalvik

Android 運行時 (ART) 是 Android 上的應用程序和某些系統服務使用的託管運行時。 ART 及其前身 Dalvik 最初是專門為 Android 項目創建的。 ART 作為運行時執行 Dalvik 可執行格式和 Dex 字節碼規範。

ART 和 Dalvik 是運行 Dex 字節碼的兼容運行時,因此為 Dalvik 開發的應用程序在使用 ART 運行時應該可以工作。然而,一些適用於 Dalvik 的技術不適用於 ART。有關最重要問題的信息,請參閱在 Android 運行時 (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 支持許多新的調試選項,尤其是在與監視器和垃圾收集相關的功能中。例如,您可以:

  • 查看堆棧跟踪中持有哪些鎖,然後跳轉到持有鎖的線程。
  • 詢問給定類有多少活動實例,詢問實例,並查看哪些引用使對象保持活動狀態。
  • 過濾特定實例的事件(如斷點)。
  • 查看方法退出時返回的值(使用“方法退出”事件)。
  • 設置字段觀察點以在訪問和/或修改特定字段時暫停程序的執行。

改進了異常和崩潰報告中的診斷細節

ART 在發生運行時異常時為您提供盡可能多的上下文和詳細信息。 ART 為java.lang.ClassCastExceptionjava.lang.ClassNotFoundExceptionjava.lang.NullPointerException提供了擴展的異常詳細信息。 (後來的 Dalvik 版本為java.lang.ArrayIndexOutOfBoundsExceptionjava.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。