開機映像檔設定檔

Android 11 以上版本支援產生啟動映像檔設定檔,可封裝各種系統層級元件 (例如系統伺服器和啟動 classpath) 的程式碼相關資訊。Android 執行階段 (ART) 會使用這項資訊執行系統層級最佳化作業,其中部分作業對 Android 效能至關重要,並會影響所有非原生程式碼 (系統或應用程式層級) 的執行作業。在某些情況下,開機映像檔設定檔可能會影響執行效能和記憶體用量,並造成兩位數百分比的影響。

取得啟動設定檔資訊

啟動映像檔設定檔是從關鍵使用者歷程 (CUJ) 期間執行的應用程式設定檔衍生而來。在特定裝置設定中,ART 會擷取應用程式使用的啟動類別路徑方法和類別 (做為 JIT 設定檔的一部分),然後在應用程式設定檔 (例如 /data/misc/profiles/cur/0/com.android.chrome/primary.prof) 中記錄該資訊,並由啟動類別路徑 Dalvik 執行檔 (DEX) 檔案建立索引 (請參閱「ART 設定檔格式」)。

查看 CUJ 期間記錄的應用程式設定檔,判斷啟動路徑集的哪個部分最常使用,以及哪個部分最需要最佳化 (如需範例,請參閱「ART 設定檔格式」)。包含所有方法或類別會對效能造成負面影響,因此請專注於最常用的程式碼路徑。舉例來說,如果單一應用程式使用啟動 classpath 中的某個方法,則該方法不應是啟動設定檔的一部分。每部裝置都應根據 CUJ 選項和測試產生的資料量,設定方法/類別選項。

如要匯總裝置上所有個別應用程式設定檔的啟動類別路徑資訊,請執行 adb shell cmd package snapshot-profile android 指令。您可以使用匯總資訊做為處理和方法/類別選取作業的基礎,而無須手動匯總個別設定檔 (但您也可以這麼做)。

開機映像檔設定檔

圖 1. 取得啟動映像檔設定檔的程序

開機映像檔設定檔資料

啟動映像檔設定檔包含下列檔案和資料。

  • 開機類別路徑 (frameworks/base/config/boot-image-profile.txt) 的設定檔。決定要最佳化開機類別路徑中的哪些方法、開機 .art 映像檔包含哪些類別,以及如何版面配置對應的 DEX 檔案。

  • 預先載入的類別清單。判斷 Zygote 中預先載入的類別。

  • 系統伺服器元件 (frameworks/base/services/art-profile) 的設定檔。決定系統伺服器要進行哪些方法的最佳化/編譯、開機 .art 映像檔包含哪些類別,以及對應的 DEX 檔案如何安排。

ART 設定檔格式

ART 設定檔會擷取每個已載入的 DEX 檔案中的資訊,包括值得最佳化的方法和啟動期間使用的類別。啟用啟動映像檔分析功能後,ART 也會在設定檔中加入啟動路徑和系統伺服器 JAR 檔案,並在每個 DEX 檔案中加上使用該檔案的套件名稱註解。

舉例來說,您可以使用下列指令轉儲原始的開機映像檔設定檔:

adb shell profman --dump-only --profile-file=/data/misc/profman/android.prof

這會產生類似以下的輸出內容:

=== Dex files  ===
=== profile ===
ProfileInfo [012]

core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
        hot methods: 520[], 611[] …
        startup methods: …
        classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
        hot methods: 520[], 521[]…
        startup methods: …
        classes: …

在上述範例中:

  • core-oj.jar 會由 com.google.android.ext.servicescom.android.systemui 使用。每個項目都會列出 core-oj.jar 使用的兩個套件。

  • 兩個程序都使用 DEX 索引 520 的這個方法,但只有 systemui 程序使用 DEX 索引 521 的這個方法。其他設定檔部分 (例如啟動類別) 也適用相同的理由。

在資料處理期間,根據使用情形篩選方法/類別,將優先順序給予系統層級程序 (例如系統伺服器或 systemui),或給予可能不常使用但仍重要的方法 (例如相機應用程式使用的程式)。

設定檔格式會在內部為每個方法加上多個標記 (啟動、啟動後、熱門、abi),比只顯示的轉儲格式多。如要使用所有信號,請修改可用的指令碼。

建議

請遵循下列指南,以獲得最佳結果。

  • 將用於產生開機映像檔設定檔的設定部署至多個測試裝置,並在產生最終開機映像檔設定檔前匯總結果。profman 工具支援匯總及選取多個引導映像檔設定檔,但只適用於相同版本的引導映像檔 (相同的引導類別路徑)。

  • 為系統程序使用的類別/方法指定選取優先順序。這些方法/類別可能會使用其他應用程式不常使用的程式碼,但這些程式碼仍是最佳化的重要元素。

  • 單一裝置執行作業的資料形狀,與執行真實 CUJ 的測試裝置有很大差異。如果您沒有大量的測試裝置機群,請使用同一部裝置執行多個 CUJ,提高啟動映像檔設定檔最佳化功能在實際工作環境中運作良好的信心 (請參閱下文所述的這個情況)。

設定裝置

如要透過系統屬性啟用啟動設定檔設定,請使用下列任一方法。

  • 選項 1:手動設定 props (可在重新啟動前運作):

    adb root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • 選項 2:使用 local.prop (永久生效,直到檔案遭到刪除為止)。方法如下:

    1. 建立含有下列內容的 local.prop 檔案:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. 執行下列指令:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • 選項 3:使用裝置設定來設定下列伺服器端屬性:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

產生開機映像檔設定檔

請按照下列操作說明,在單一裝置上進行測試,產生基本開機映像檔設定檔。

  1. 設定裝置。

    1. 按照「設定裝置」一節的說明設定裝置。

    2. (選用) 新設定檔格式需要時間清理並取代其他設定檔。如要加快設定檔收集作業,請重設裝置上的所有設定檔。

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. 在裝置上執行 CUJ。

  2. 使用下列指令擷取設定檔:

    adb shell cmd package snapshot-profile android
  3. 使用下列指令擷取設定檔:

    adb pull /data/misc/profman/android.prof
  4. 使用下列指令前往啟動類別路徑 JAR 檔案:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. 使用下列 profman 指令產生啟動映像檔設定檔。

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. 使用資料,並使用可用的選取門檻標記調整 profman 指令。

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    如需完整清單,請參閱 profman 說明頁面或原始碼。