Android 運行時和 Dalvik

Android 運行時 (ART) 是 Android 上的應用程式和某些系統服務使用的託管運行時。 ART 及其前身 Dalvik 最初是專門為 Android 專案創建的。 ART 作為運行時執行 Dalvik 可執行檔 (DEX) 格式和 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 版本中的 Traceview for Dalvik 新增了採樣支援。

支援更多調試功能

ART 支援許多新的調試選項,特別是與監視器和垃圾收集相關的功能。例如,您可以:

  • 查看堆疊追蹤中持有哪些鎖,然後跳到持有鎖的執行緒。
  • 詢問給定類別有多少個活動實例,要求查看這些實例,並查看哪些引用使物件保持活動狀態。
  • 過濾特定實例的事件(如斷點)。
  • 查看方法退出時傳回的值(使用「method-exit」事件)。
  • 設定欄位觀察點以在存取和/或修改特定欄位時暫停程式的執行。

改進了異常和崩潰報告中的診斷詳細信息

當運行時異常發生時,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。