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
映像檔。預先載入的類別清單。 決定要在 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: …
在上述範例中:
com.google.android.ext.services
和com.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
(永久生效,直到檔案刪除為止)。方法如下:建立
local.prop
檔案,並加入以下內容:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
執行下列指令:
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
產生開機映像檔設定檔
請按照下列操作說明,在單一裝置上進行測試,產生基本開機映像檔設定檔。
設定裝置。
按照「設定裝置」一文的說明設定裝置。
(選用) 新設定檔格式需要一段時間,才能清理及取代其他設定檔。如要加快收集設定檔的速度,請重設裝置上的所有設定檔。
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
在裝置上執行 CUJ。
使用下列指令擷取設定檔:
adb shell cmd package snapshot-profile android
使用下列指令擷取設定檔:
adb pull /data/misc/profman/android.prof
使用下列指令前往啟動類別路徑 JAR 檔案:
m dist
ls $ANDROID_PRODUCT_OUT/boot.zip
使用下列
profman
指令產生開機映像檔設定檔。profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
使用資料,並透過可用的選取門檻旗標調整
profman
指令。--method-threshold
--class-threshold
--clean-class-threshold
--preloaded-class-threshold
--upgrade-startup-to-hot
--special-package
如要查看完整清單,請參閱
profman
說明頁面或原始碼。