Android 執行階段和 Dalvik

Android 執行階段 (ART) 是應用程式和部分系統使用的受管理執行階段 才能享有更優質的服務ART 及其前身 Dalvik 的最初是 這是 Android 專案專屬的專案之一執行階段以執行 Dalvik run (DEX) 格式和 DEX 位元碼規格。

ART 和 Dalvik 是執行 DEX 位元碼的相容執行階段,所以應用程式 為 Dalvik 開發的 Dalvik 應能在使用 ART 執行時正常運作。不過, 無法在 ART 上使用 Dalvik 的技術。如要進一步瞭解 最常見的問題,請參閱驗證 Android 執行階段 (ART) 的應用程式行為。

ART 功能

以下是 ART 實作的部分主要功能。

預先 (AOT) 編譯

ART 導入預先 (AOT) 編譯,以便改善應用程式 才需進行此外,ART 的安裝時驗證比 Dalvik 更短。

在安裝時,ART 會使用裝置端編譯應用程式 dex2oat 工具。這個公用程式會接受 DEX 檔案做為輸入內容,並產生 目標裝置的已編譯應用程式執行檔。公用程式應可 輕鬆編譯所有有效的 DEX 檔案。不過,部分後續處理作業 工具會產生可受 Dalvik 容許的無效檔案, 並由 ART 編譯。詳情請參閱「地址 垃圾收集問題

改善垃圾收集功能

垃圾收集 (GC) 需要耗費大量資源,與應用程式效能 這可能會導致顯示畫面斷斷續續、UI 回應速度不佳以及其他問題。ART 提升垃圾品質 以下列方式收集:

  • 大多為並行設計,且單一 GC 暫停
  • 同時複製,減少背景記憶體用量和片段
  • GC 暫停的時間長度與堆積大小無關
  • 特殊清潔案例的總收集時間較短 最近配置的短期物件
  • 改善垃圾收集人體工學,創造並行的垃圾 及時收集更多資料,因此GC_FOR_ALLOC 在一般用途中極為少見

改善開發和偵錯功能

ART 提供許多功能,來改善應用程式開發和偵錯作業。

支援取樣分析器

過去,開發人員用過 Traceview 工具 (專為追蹤設計) 應用程式執行) 做為分析器。Traceview 可以提供實用資訊 導致在 Dalvik 上產生的結果 與個別方法呼叫的負擔有關 明顯影響執行時間效能

ART 新增支援沒有這些分析分析器的專屬取樣分析器 這樣一來,您就能更準確地掌握應用程式的執行情況 規模大幅拖慢。Traceview 已新增以下應用程式的取樣支援: KitKat 版本上的 Dalvik。

支援更多偵錯功能

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。