開機映像檔設定檔

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

取得啟動設定檔資訊

啟動映像檔設定檔是從關鍵使用者歷程 (CUJ) 期間執行的應用程式設定檔衍生而來。在特定裝置設定中,ART 會擷取 (做為 JIT 設定檔的一部分) 的啟動類別路徑方法和類別,然後在應用程式設定檔中記錄這些資訊 (例如 /data/misc/profiles/cur/0/com.android.chrome/primary.prof),其中資訊是由開機類別路徑 Dalvik EXecutable (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 檔案的套件名稱為每個 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: …

在上述範例中:

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

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

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

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

建議

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

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

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

  • 與執行實際 CUJ 的測試裝置相比,單一裝置執行的資料形狀十分不同。如果您沒有大量測試裝置,請使用同一部裝置執行多個 CUJ,藉此提高啟動映像檔設定檔的最佳化作業在實際工作環境中順利運作的信心 (這個情況如下所述)。

設定裝置

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

  • 方法 1:手動設定項目 (可重新啟動):

    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 說明頁面或原始碼。