開機映像檔設定檔

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

取得啟動設定檔資訊

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

查看在 CUJ 期間記錄的應用程式設定檔,判斷啟動類別路徑中哪個部分最常使用,且最需要最佳化 (如需範例,請參閱 ART 設定檔格式)。納入所有方法或類別會對效能造成負面影響,因此請著重於最常用的程式碼路徑。舉例來說,如果單一應用程式使用啟動類別路徑中的方法,該方法就不應屬於啟動設定檔。每個裝置都應根據 CUJ 選項和測試產生的資料量,設定方法/類別選取項目。

如要匯總裝置上所有個別應用程式設定檔的啟動類別路徑資訊,請執行 adb shell cmd package snapshot-profile android 指令。您可以根據匯總資訊處理資料,並選取方法/類別,不必手動匯總個別設定檔 (但如果需要,也可以這麼做)。

開機映像檔設定檔

圖 1. 取得開機映像檔設定檔的程序

開機映像檔設定檔資料

開機映像檔設定檔包含下列檔案和資料。

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: …

在上述範例中:

  • 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:使用裝置設定設定下列伺服器端屬性:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

產生開機映像檔設定檔

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

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