啟動映像設定檔

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.取得啟動映像設定檔的過程

啟動映像設定檔數據

啟動映像設定檔包括以下檔案和資料。

  • 啟動類別路徑的設定檔 ( 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.jarcom.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說明頁面或原始程式碼。