設定 ART

本頁說明如何設定 Android 執行階段 (ART) 及其編譯選項。主題 這裡的解決方式包括 系統映像檔的預先編譯設定:dex2oat 編譯選項,以及如何取捨系統分區空間、資料分區空間和 才需進行

請參閱 ART 和 Dalvik 以及 Dalvik 可執行格式,以便與 ART 搭配使用。請參閱驗證中 Android 執行階段 (ART) 的應用程式行為:確保應用程式正常運作 正確做法。

ART 的運作方式

ART 採用預先 (AOT) 編譯,並從 Android 7 開始 採用 AOT 編譯、及時 (JIT) 編譯和解讀的混合組合 並分析 AOT 編譯以上所有執行模式的組合 並會在本節中討論。例如,Pixel 裝置採用的配置 做法如下:

  1. 應用程式最初安裝時,會有一個由開發人員發行的 dex 中繼資料 (.dm) 檔案, Play 商店,內含雲端設定檔。ART AOT 編譯雲端中列出的方法 或者,如果安裝應用程式時沒有 dex 中繼資料檔案,則不會執行 AOT 編譯 執行任務
  2. 當應用程式前幾次執行時,系統會解讀未編譯 AOT 的方法。 在解譯方法中,我們接著會編譯經常執行的方法。阿根廷時間 根據執行作業產生本機設定檔,並將其與雲端設定檔 (如果有的話) 結合 存在)。
  3. 當裝置處於閒置狀態且正在充電時,系統會執行編譯 Daemon 來重新編譯應用程式 產生的資料集
  4. 在應用程式後續執行作業中,ART 會使用編譯產生的構件 相較於期間產生的程式碼,Daemon 包含更多 AOT 編譯的程式碼 未經過 AOT 編譯的方法仍會解讀或編譯。ART 更新設定檔 安裝程序,系統隨即會在後續的 編譯 Daemon

ART 包含編譯器 (dex2oat 工具) 和執行階段 (libart.so)。 dex2oat 工具會接收 APK 檔案,並產生一或多個檔案 執行階段載入的編譯構件檔案檔案數量,以及 各個版本的擴充功能和名稱可能會變動,但自 Android 8 版本,系統會產生下列檔案:

  • .vdex:包含其他中繼資料,加快驗證速度,有時可能會與 帶有 APK 的未壓縮 DEX 程式碼。
  • .odex:包含 AOT 編譯的程式碼,適用於 APK。
  • .art (optional) 包含 ART 內部 表示 APK 中列出的部分字串和類別,用來加快 應用程式啟動作業

編譯選項

ART 編譯選項有兩種:

  1. 系統 ROM 設定:建構元件時,AOT 編譯的程式碼 系統映像檔
  2. 執行階段設定:ART 如何在 裝置。

編譯器篩選器

其中一種核心 ART 選項來設定這兩個類別,那就是編譯器 篩選器。編譯器篩選器會影響 ART 編譯 DEX 程式碼的方式, 選項傳送至 dex2oat 工具。自 Android 8 起, 以下是正式支援的 4 個篩選器:

  • verify:只會執行 DEX 程式碼驗證 (無 AOT 編譯)。
  • quicken:(在 Android 11 之前) 執行 DEX 程式碼 驗證及最佳化一些 DEX 指示,以提高翻譯效能。
  • speed:執行 DEX 程式碼驗證和 AOT 編譯所有方法。
  • speed-profile:執行 DEX 程式碼驗證和 AOT 編譯方法 列在設定檔中。

系統 ROM 設定

建構系統映像檔時,預先安裝的程式庫和應用程式會經過 AOT 編譯。這個 程序稱為 dreopt。這類已編譯的檔案只要所有依附元件即可使用 ,尤其是啟動類別路徑。

注意:如果裝置 更新「系統模組」後,開機類別路徑就非常 可能在下次更新中可能變更,這會導致所有已過時且無法使用的檔案。

設定 dreopt 有多種 ART 建構選項。設定方式 這些選項取決於系統映像檔的可用儲存空間 預先安裝的應用程式。編譯成系統 ROM 的 JAR/APK 可分成四個 類別:

  • 啟動類別路徑程式碼:使用 speed-profile 編譯器篩選條件編譯, 預設值。
  • 系統伺服器程式碼 (請參閱 PRODUCT_SYSTEM_SERVER_JARSPRODUCT_APEX_SYSTEM_SERVER_JARSPRODUCT_STANDALONE_SYSTEM_SERVER_JARSPRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS):
    • (Android 14 以上版本) 已透過 speed-profile 編譯 編譯器會預設篩選,或是以 speed 編譯器篩選器編譯 (如果 沒有個人資料
    • (Android 13 以下版本) 已透過 speed 編譯 編譯器篩選器預設會篩選掉。
    ,瞭解如何調查及移除這項存取權。 可透過 PRODUCT_SYSTEM_SERVER_COMPILER_FILTER 設定 (詳情請參閱本文後續章節) 文件)。
  • 產品專屬的核心應用程式 (請參閱後續的 PRODUCT_DEXPREOPT_SPEED_APPS 文件):預設是以 speed 編譯器篩選器編譯而成。
  • 所有其他應用程式:預設是以 speed-profile 編譯器篩選器編譯, 或是使用 verify 編譯器篩選器進行編譯。

    可透過 PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER 設定 (詳情請參閱下文 文件)。

Makefile 選項

  • WITH_DEXPREOPT
  • 是否在系統映像檔上安裝的 DEX 程式碼叫用 dex2oat。預設啟用。

  • DONT_DEXPREOPT_PREBUILTS (Android 5 以上版本)
  • 啟用 DONT_DEXPREOPT_PREBUILTS 會禁止系統執行預先建構 都已清除。這些是含有「include $(BUILD_PREBUILT)」的應用程式 在 Android.mk 中指定的檔案。略過 撤銷可能會透過 Google Play 更新的預先建構應用程式 節省系統映像檔的空間,但會增加首次啟動時間。請注意,此選項不會產生任何影響 Android.bp 中定義的預先建構應用程式。

  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER (Android 9) 以上版本)
  • PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER 指定預設編譯器篩選器 針對遭棄置的應用程式這些應用程式已在「Android.bp」中定義,或 include $(BUILD_PREBUILT)已在其 Android.mk 中指定。如果未指定 預設值為 speed-profile;如未指定值,則為 verify 且未提供個人資料

  • WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY (自 Android 8 MR1 起)
  • 啟用「WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY」只會撤銷 開機類別路徑和系統伺服器 jar 檔案

  • LOCAL_DEX_PREOPT
  • 您也可以透過下列方式,啟用或停用個別應用程式 指定模組定義中的 LOCAL_DEX_PREOPT 選項。 如果能立即停用可能會立即停用的應用程式,這項功能就能派上用場 接收 Google Play 更新,因為更新會導致遭撤銷的 程式碼已過時。這也有助於節省 版本升級 OTA,因為使用者可能在 資料分區

    LOCAL_DEX_PREOPT 支援 truefalse 的值 啟用或停用 dexpreopt。此外,nostripping 可以 ;如果 dexpreopt 不應移除 classes.dex 該檔案從 APK 或 JAR 檔案匯入。由於這個檔案沒有 但這個最後一個選項是 允許第三方 APK 簽名保持有效。

  • PRODUCT_DEX_PREOPT_BOOT_FLAGS
  • 將選項傳遞至 dex2oat,以控制啟動映像檔的方式 加以訓練可用於指定自訂圖片類別清單、編譯而成 類別清單和編譯器篩選器

  • PRODUCT_DEX_PREOPT_DEFAULT_FLAGS
  • 將選項傳遞至 dex2oat,以便控制除了 開機映像檔會經過編譯

  • PRODUCT_DEX_PREOPT_MODULE_CONFIGS
  • 能夠將特定dex2oat選項 模組和產品設定設在產品的 $(call add-product-dex-preopt-module-config,<modules>,<option>) 上傳了 device.mk 個檔案 其中 <modules>LOCAL_MODULE 清單和 JAR 和 APK 檔案的 LOCAL_PACKAGE 名稱分別。

  • PRODUCT_DEXPREOPT_SPEED_APPS (自 Android 8 起)
  • 產品清單,列出了 Google 認定為產品核心的應用程式,以及 使用 speed 編譯器篩選器進行編譯。適用對象 舉例來說,SystemUI 等永久性應用程式 設定檔引導編譯作業只會在下次重新啟動時執行,因此可能較適合 確保這些應用程式一律經過 AOT 編譯

  • PRODUCT_SYSTEM_SERVER_APPS (自 Android 8 起)
  • 系統伺服器載入的應用程式清單。這些應用程式 根據預設,會使用 speed 編譯器篩選器進行編譯。

  • PRODUCT_ART_TARGET_INCLUDE_DEBUG_BUILD (自 Android 起) 8.
  • 是否在裝置上加入 ART 偵錯版本。根據預設,這會是 啟用使用者偵錯版本和工程版本。只要明確覆寫此行為即可 將選項設為 truefalse

    根據預設,裝置會使用非偵錯版本 (libart.so)。 如要切換,請將系統屬性 persist.sys.dalvik.vm.lib.2 設為 libartd.so

  • WITH_DEXPREOPT_PIC (適用於 Android 7)
  • 在 Android 5.1.0 到 Android 6.0.1 版本中,WITH_DEXPREOPT_PIC 可以 都必須指定順序,才能啟用與排名無關的程式碼 (PIC)。透過這個方法 不必放在映像檔中的程式碼 將 /system 轉換為 /data/dalvik-cache,節省資料分區的空間。 然而,執行階段會稍有影響,因為這樣會停用充分運用優勢的最佳化功能 。一般而言,裝置會佔用 /data 的儲存空間 應該啟用 PIC 編譯

    在 Android 7.0 中,系統預設啟用 PIC 編譯。

  • WITH_DEXPREOPT_BOOT_IMG_ONLY (適用於 Android 7 版本) MR1)
  • 這個選項已由「WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY」取代 也會預先選用系統伺服器 JAR

  • PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
  • 這個選項會指定系統伺服器的編譯器篩選器。

    • (Android 14 以上版本) 如未指定,speed-profile 使用編譯器篩選器,或者,如果不是設定檔,則會使用 speed 編譯器篩選器 或更新提示
    • (Android 13 以下版本) 如未指定,speed 編譯器 篩選器。
    • 如果設為 speed,系統會使用 speed 編譯器篩選器。
    • 如果設為 speed-profile,就會使用 speed-profile 編譯器篩選器。 如未提供設定檔,則會使用 verify 編譯器篩選器。
    • 如果設為 verify,系統會使用 verify 編譯器篩選器。

  • PRODUCT_SYSTEM_SERVER_JARSPRODUCT_APEX_SYSTEM_SERVER_JARSPRODUCT_STANDALONE_SYSTEM_SERVER_JARS, PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS
  • 系統伺服器載入的 JAR 清單如下。JAR 會使用 PRODUCT_SYSTEM_SERVER_COMPILER_FILTER 指定的編譯器篩選器

    • (必要) PRODUCT_SYSTEM_SERVER_JARS:系統伺服器類別路徑 JAR 的清單 平台 (即 SYSTEMSERVERCLASSPATH 的一部分)。新增系統伺服器 必須指定這份清單中的 classpath JAR。無法將系統伺服器 classpath JAR 加入清單 會導致系統無法載入這些 JAR。
    • (必要) PRODUCT_APEX_SYSTEM_SERVER_JARS:系統伺服器 classpath JAR 的清單 是透過 APEX 傳送 (也就是 SYSTEMSERVERCLASSPATH 的一部分)。格式為 <apex name>:<jar name>。將 APEX 系統伺服器類別路徑 JAR 新增至 這份清單是必要的如果無法將 APEX 系統伺服器類別路徑 JAR 新增至這份清單,將導致 這些 JAR 沒有載入
    • (選用,Android 13 以下版本) PRODUCT_STANDALONE_SYSTEM_SERVER_JARS:系統伺服器載入的 JAR 清單 透過個別的類別載入器動態 (透過 SystemServiceManager.startServiceFromJar)。將獨立系統伺服器 JAR 新增至 雖然這份清單並非必要,但「強烈建議」您採用這個清單,因為這會讓 JAR 進行編譯和 因此執行階段效能良好
    • (自 Android 13 起為必要) PRODUCT_APEX_STANDALONE_SYSTEM_SERVER_JARS:清單 透過 APEX 傳送的 JAR 會使用個別的類別載入器,以動態方式載入 ( 是透過 SystemServiceManager.startServiceFromJar 或宣告為 <apex-system-service>)。格式為 <apex name>:<jar name>。將獨立 APEX 系統伺服器 JAR 新增至 這份清單是必要的如果無法將獨立 APEX 系統伺服器 JAR 新增至這份清單,將導致 啟動失敗。

    啟動類別路徑設定

    預先載入的類別清單是 Zygote 初始化的一系列類別 啟動。如此一來,每個應用程式就不必執行類別初始化器。 分別可加快啟動速度,並在記憶體中分享頁面。 預先載入的類別清單檔案位於 frameworks/base/config/preloaded-classes 並且包含根據一般手機使用情形調整的清單。這可能會 與其他裝置 (例如穿戴式裝置) 不同,而且必須調整相關設定 。調整時請務必謹慎加入過多課程 就會產生記憶體加入的類別太少,會強制讓每個應用程式執行 必須有自己的副本 這同樣會浪費記憶體

    使用方式範例 (位於產品的 device.mk 中):

    PRODUCT_COPY_FILES += <filename>:system/etc/preloaded-classes
    

    注意:您必須將此行程式碼置於 沿用任何含有預設值的產品設定檔 build/target/product/base.mk

    執行階段設定

    JIT 選項

    以下選項只會影響 ART JIT 編譯器的 Android 版本 可以使用。

    • dalvik.vm.usejit:是否啟用 JIT。
    • dalvik.vm.jitinitialsize (預設為 64K):初始容量 程式碼快取功能程式碼快取會定期 GC,並視需要增加。
    • dalvik.vm.jitmaxsize (預設為 64M):程式碼快取的最大容量。
    • dalvik.vm.jitthreshold (預設為 10000): 「熱度」門檻方法必須依序傳遞 才能進行 JIT 編譯「熱度」則是「計數器」指標 複製到執行階段包含呼叫、反向分支版本等 。
    • dalvik.vm.usejitprofiles (在 Android 13 之前): 未啟用 JIT 設定檔。即使 dalvik.vm.usejit 為 false 仍然可以使用。 請注意,如果這個值為 false,編譯器篩選器 speed-profile 會 未經過 AOT 編譯任何方法,且等同於 verify。開始時間 Android 14 (JIT 設定檔) 一律會啟用,且無法關閉。
    • dalvik.vm.jitprithreadweight (預設為 dalvik.vm.jitthreshold / 20):JIT「樣本」的權重 (請參閱 jitthreshold) 瞭解應用程式 UI 執行緒。用於加快編譯速度 這些方法會直接影響使用者體驗 應用程式。
    • dalvik.vm.jittransitionweight (預設為 dalvik.vm.jitthreshold / 10): 方法的權重 叫用程式碼。這有助於 請確定所有涉及的方法經過編譯,以盡量減少轉場 (也就是 高昂)。

    Dex2oat 選項

    這些選項會影響裝置端編譯 (即 dexopt),其中部分選項也會影響 已清除,但僅限上方「系統 ROM 設定」一節所述的選項 會影響 dexpreopt。

    資源用量控管選項:

    • dalvik.vm.image-dex2oat-threads/dalvik.vm.image-dex2oat-cpu-set (在 Android 11 之前):執行緒數量和 CPU 核心組合 (請參閱 ) 用於開機映像檔。
    • dalvik.vm.boot-dex2oat-threads/dalvik.vm.boot-dex2oat-cpu-set
      • (直到 Android 11 為止) 執行緒數量和 CPU 核心組合 及下文說明 (請參閱下文)。開機映像檔以外的所有物件。
      • (自 Android 12 起) 執行緒數量和 CPU 核心組合 (請見下方說明),在開機期間用於所有檔案,包括開機映像檔。
        • 具體來說,自 Android 14 起,這對應 ART Service 中的優先類別 PRIORITY_BOOT
    • dalvik.vm.restore-dex2oat-threads/dalvik.vm.restore-dex2oat-cpu-set
      • (從 Android 11 開始,到 Android 13) 要用於從雲端還原的執行緒數量和 CPU 核心組合 (請見下方說明) 備份。
      • (自 Android 14 起) 執行緒數量和 CPU 核心組合 (請見下文),針對所有較易受到延遲時間影響的內容 (包括 從雲端備份還原
        • 具體來說,這與優先類別相對應 ART 服務中的 PRIORITY_INTERACTIVE_FAST
    • dalvik.vm.background-dex2oat-threads/ dalvik.vm.background-dex2oat-cpu-set (自 Android 14 起):執行緒數量和 CPU 核心組合 (請參閱 使用於背景。
      • 具體來說,這與PRIORITY_BACKGROUND ART 服務。
    • dalvik.vm.dex2oat-threads/dalvik.vm.dex2oat-cpu-set: 執行緒數量和所有其他項目要使用的 CPU 核心組合。

    應將一組 CPU 核心指定為以半形逗號分隔的 CPU ID 清單。舉例來說 在 CPU 核心 0 到 3 的 dex2oat 上,請設定:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    

    設定 CPU 相依性屬性時,建議您為 符合所選 CPU 數量的 dex2oat 執行緒數量,避免不必要的記憶體和 I/O 爭用情況:

    dalvik.vm.dex2oat-cpu-set=0,1,2,3
    dalvik.vm.dex2oat-threads=4
    

    除了上述系統屬性之外,您還可以使用工作設定檔來控制 dex2oat 資源用量 (請參閱 Cgroup 抽象層)。

    支援的工作設定檔如下:

    • Dex2OatBackground (自 Android 14 起) (預設為沿用 Dex2OatBootComplete): 控管要在背景使用的資源。
      • 具體來說,這與PRIORITY_BACKGROUND ART 服務。
    • Dex2OatBootComplete:
      • (Android 13 以下版本) 控管所有要用的資源 啟動後的符記
      • (從 Android 14 開始) 控管所有要用的資源 而不是在背景執行
        • 具體來說,這與優先類別相對應 ART 中的「PRIORITY_INTERACTIVE_FAST」和「PRIORITY_INTERACTIVE」 售後服務

    如果同時指定系統屬性和工作設定檔,兩者都會生效。

    控管堆積大小的選項:

    • dalvik.vm.image-dex2oat-Xms:啟動映像檔的初始堆積大小。
    • dalvik.vm.image-dex2oat-Xmx:啟動映像檔的堆積大小上限。
    • dalvik.vm.dex2oat-Xms:所有其他項目的初始堆積大小。
    • dalvik.vm.dex2oat-Xmx:其他所有物件的堆積大小上限。

    控制以下項目的初始和最大堆積大小的選項 dex2oat不應減少,因為這可能會限制 則可以編譯

    控制編譯器篩選器的選項:

    • dalvik.vm.image-dex2oat-filter (直到 Android 11 為止): 用於篩選開機映像檔的編譯器。從 Android 12 開始,編譯器 開機映像檔的篩選條件一律為 speed-profile,且無法變更。
    • dalvik.vm.systemservercompilerfilter (自 Android 13 起): 系統伺服器的編譯器篩選器。詳情請參閱 PRODUCT_SYSTEM_SERVER_COMPILER_FILTER
    • dalvik.vm.systemuicompilerfilter (自 Android 13 起): 系統 UI 套件的編譯器篩選器。
    • dalvik.vm.dex2oat-filter (直到 Android 6 為止): 編譯器會篩選所有其他項目。
    • pm.dexopt.<reason> (自 Android 7 起): 編譯器會篩選所有其他項目。詳情請見 Android 適用的 ART 服務設定 14 以上版本,或 的套件管理員設定: Android 13 以下版本。

    控管啟動映像檔以外所有項目的編譯方式:

    • dalvik.vm.dex2oat-very-large (自 Android 7.1 起):Dex 總檔案大小下限 才能停用 AOT 編譯
    • dalvik.vm.dex2oat-swap (自 Android 7.1 起) (預設值:true):允許使用替換功能 dex2oat 檔案這有助於避免記憶體不足當機。請注意 開啟,dex2oat 只會在特定條件下使用替換檔案,例如 的 dex 檔案相當大,條件可能會有所變動。
    • dalvik.vm.ps-min-first-save-ms (從 Android 12 開始): 執行階段首次產生應用程式設定檔前,要等待的最短時間 系統就會啟動應用程式
    • dalvik.vm.ps-min-save-period-ms (從 Android 12 開始): 更新應用程式設定檔前,至少等候多久時間。
    • dalvik.vm.dex2oat64.enabled (自 Android 11 開始) (預設值:false): 是否使用 64 位元版本的 dex2oat。
    • dalvik.vm.bgdexopt.new-classes-percent (自 Android 12 起) (預設值:20): 設定檔中的新類別在 0 到 100 之間,觸發重新編譯作業的百分比下限。 僅適用於設定檔導覽編譯 (speed-profile),一般適用於 背景 dexopt。請注意,除了 50 個新類別之外,還設有至少 50 個新類別的門檻 無法設定百分比門檻
    • dalvik.vm.bgdexopt.new-methods-percent (自 Android 12 起) (預設值:20): 設定檔中新方法的百分比下限 (0 到 100),會觸發重新編譯作業。 僅適用於設定檔導覽編譯 (speed-profile),一般適用於 背景 dexopt。請注意,我們還設有至少 100 個新方法的門檻 無法設定百分比門檻
    • dalvik.vm.dex2oat-max-image-block-size (自 Android 10 開始) (預設值:524288) 壓縮圖片的固體區塊大小上限。大型圖片將畫面分割成一組實心 不要讓任何區塊大於大小上限。
    • dalvik.vm.dex2oat-resolve-startup-strings (從 Android 10 開始) (預設值:true) 如果為 true,將使 dex2oat 解析從標示為 「開機」。
    • debug.generate-debug-info (預設值:false) 是否產生用於原生偵錯 (例如堆疊解開) 的偵錯資訊 資訊、ELF 符號和 Dwarf 區段。
    • dalvik.vm.dex2oat-minidebuginfo (從 Android 9 開始) (預設值:true) 無論是否產生必要的 LZMA 壓縮偵錯資訊 輸出反向追蹤記錄。

    ART 服務選項

    從 Android 14 開始,應用程式端的 AOT 編譯 (又稱 dexopt) 並由 ART 服務處理。如要進一步瞭解如何設定 ART 服務,請參閱 ART 服務設定

    套件管理員選項

    在 Android 14 之前,應用程式的裝置端 AOT 編譯 (又稱 dexopt) 由套件管理員處理如需瞭解如何設定 dexopt 的套件管理工具 請參閱「套件管理員設定」。

    A/B 專屬設定

    ROM 設定

    從 Android 7.0 開始,裝置可能會使用兩個系統分割區來啟用 A/B 系統更新: 如要節省系統分區大小,您可以在 未使用的第二個系統分區並將這些資料複製到資料分區 初次啟動時。

    使用範例 (device-common.mk):

    PRODUCT_PACKAGES += \
         cppreopts.sh
    PRODUCT_PROPERTY_OVERRIDES += \
         ro.cp_system_other_odex=1
    

    在裝置的「BoardConfig.mk」中:

    BOARD_USES_SYSTEM_OTHER_ODEX := true
    

    請注意,開機類別路徑程式碼、系統伺服器程式碼,以及產品專屬核心 應用程式一律會編譯至系統分區根據預設 應用程式會編譯至未使用的第二個系統分區可用的值包括 由 SYSTEM_OTHER_ODEX_FILTER 控制,且其值是由 預設值:

    SYSTEM_OTHER_ODEX_FILTER ?= app/% priv-app/%
    

    背景 OTA dexopt

    在支援 A/B 的裝置上,應用程式可以在背景中編譯,然後再以 新的系統映像檔詳情請參閱「應用程式編譯: 背景,選擇在系統映像檔中加入編譯指令碼和二進位檔。 此編譯使用的編譯篩選器控制:

    pm.dexopt.ab-ota=speed-profile
    

    建議你使用 speed-profile,以啟用個人資料引導 加以編譯,節省儲存空間

    JDWP 選項

    在使用者偵錯版本中,Java 偵錯傳輸通訊協定 (JDWP) 執行緒的建立作業是透過 persist.debug.dalvik.vm.jdwp.enabled 系統屬性。根據預設 未設定,且只會為可偵錯的應用程式建立 JDWP 執行緒。同時啟用 JDWP 執行緒 可進行偵錯和無法進行偵錯的應用程式,請設定 persist.debug.dalvik.vm.jdwp.enabled1。裝置必須重新啟動,屬性變更才會生效。

    如要在使用者偵錯版本上對無法進行偵錯的應用程式進行偵錯,請執行下列指令來啟用 JDWP 指令:

      adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
      adb reboot
      
    ,瞭解如何調查及移除這項存取權。 針對搭載 Android 13 以下版本的裝置,執行階段會建立 JDWP 適用於使用者偵錯版本上可進行偵錯和無法偵錯應用程式的執行緒。也就是說 來附加偵錯工具,或剖析使用者偵錯版本上的任何應用程式。