Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

Android Runtime(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事件在典型用例中極為罕見
  • 壓縮GC以減少背景內存使用和碎片

開發和調試方面的改進

ART提供了許多功能來改善應用程序開發和調試。

支持採樣分析器

從歷史上看,開發人員一直使用Traceview工具(旨在跟踪應用程序執行情況)作為探查器。儘管Traceview提供了有用的信息,但其在Dalvik上的結果卻因按方法調用的開銷而有所偏差,並且該工具的使用會明顯影響運行時性能。

ART增加了對不具有這些限制的專用採樣探查器的支持。這樣可以更準確地查看應用執行情況,而不會顯著降低運行速度。在KitKat版本中,對Traceview的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。