由於不必處理內含程式碼路徑的即時 (JIT) 編譯步驟和解譯,基準設定檔可將首次啟動時的程式碼執行速度加快約 30%。
如果在應用程式或程式庫中提供基準設定檔,Android 執行階段 (ART) 會透過預先 (AOT) 編譯作業提供最佳的程式碼指定路徑,因此每位新使用者和每次應用程式更新都能獲得效能上的提升。這項設定檔引導最佳化 (PGO) 功能可協助應用程式最佳化啟動作業、減少操作卡頓情形,從使用者首次啟動應用程式開始,就持續改善執行階段整體效能。
這樣的效能提升直接反映在業務指標的表現上,例如使用者留存率、交易和評分等等,都能有所改善。如要進一步瞭解效能提升後對業務指標的影響,可以參考 Josh、Lyft、TikTok 和 Zomato 的案例。
基準設定檔的優點
基準設定檔可以在首次執行後讓所有使用者互動 (例如啟動應用程式、切換不同畫面或捲動內容) 變得更順暢。藉由提升應用程式的執行和回應速度,基準設定檔能吸引更多每日活躍使用者,並提高平均回訪率。
基準設定檔可提供常見的使用者互動,改善應用程式從一開始啟動的執行階段,引導您完成應用程式啟動以外的最佳化作業。引導式 AOT 編譯不需要使用者裝置,且可在開發機器 (而非行動裝置) 上各版本進行一次。發布提供基準設定檔的版本時,應用程式最佳化作業的速度會比只依賴雲端設定檔時更快。
不使用基準設定檔時,所有應用程式程式碼都會在解譯後於記憶體中進行 JIT 編譯,或是在裝置處於閒置狀態時從背景寫入 odex
檔案。在安裝或更新應用程式後,使用者首次執行應用程式的體驗會較差,需等到新程式碼路徑完成最佳化才會改善。許多應用程式經過最佳化調整後,測得的效能可以提升約 30%。
啟動設定檔
啟動設定檔與基準設定檔類似,差別在於前者是在編譯時間使用,而不是用於裝置端最佳化期間。啟動設定檔可用來改善 DEX 檔案的版面配置,以縮短啟動時間。這類設定檔中指定的程式碼位於主要的 classes.dex
檔案中,其他程式碼則位於獨立的 DEX 檔案中,這樣可以減少頁面在應用程式啟動期間出錯的次數,進而縮短啟動時間。如要進一步瞭解啟動設定檔和 DEX 版面配置最佳化程序如何縮短應用程式啟動時間,請參閱「DEX 版面配置最佳化和啟動設定檔」。
開始使用
如要開始最佳化現有應用程式的效能,請參閱「建立基準設定檔」一文。
建議的最低穩定版
依附元件鏈結會提供穩定版和開發版的發布版本。如要產生及安裝基準設定檔,請使用以下支援的 Android Gradle 外掛程式、Macrobenchmark 程式庫和設定檔安裝程式版本 (包括較新的版本)。這些依附元件會在不同時間發揮作用,並以工具鏈的形式搭配運作,達成基準設定檔最佳化。
- Android Gradle 外掛程式:
com.android.tools.build:8.0.0
- Macrobenchmark 程式庫:
androidx.benchmark:benchmark-macro-junit4:1.3.3
- 設定檔安裝程式:
androidx.profileinstaller:profileinstaller:1.4.1
建議您使用最新版的 AGP 建立及管理基準設定檔。以下是各版 AGP 提供的主要功能:
AGP 版本 | 功能 |
---|---|
8.4 | 使用 Gradle 包裝函式指令列工具或 Android Studio 安裝基準設定檔,為非偵錯版本的應用程式進行本機安裝,讓本機發布版本的效能更貼近實際生產環境。這項更新不會影響基準設定檔的實際工作環境效能。 |
8.3 |
|
8.2 |
|
8.0 | 最低建議版本:可使用基準設定檔 Gradle 外掛程式,透過單一 Gradle 工作產生基準設定檔。
|
7.4 |
最低支援版本:應用程式可以使用程式庫中的基準設定檔,並在 src/main/baseline-prof.txt 檔案中提供自身專屬的基準設定檔。
|
設定檔產生範例
以下範例類別使用建議的 Macrobenchmark 程式庫,為應用程式啟動作業以及多個導覽和捲動事件建立基準設定檔:
@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
// App startup journey.
startActivityAndWait()
device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
device.findObject(By.res("myLazyColumn")).also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
device.pressBack()
}
}
}
您可以在 GitHub 的效能範例中查看此程式碼的完整背景資訊和更多詳細資料。
包含的內容
在應用程式中使用基準設定檔時,您可以加入應用程式啟動程式碼和常見的使用者互動操作,例如捲動或切換畫面的導覽操作。您也可以收集整個流程,例如註冊、登入或付款。凡是您認為重要的使用者歷程,只要能夠改善執行階段效能,即可從基準設定檔中受益。
如果您正在嘗試不同的做法,希望能夠改善應用程式效能,請考慮同時在兩個實驗組中都加入基準設定檔。這麼一來,您就能確保所有使用者都能在相同的基準下執行編譯程式碼,讓結果更容易解讀。
程式庫可提供專屬的基準設定檔,並與發布版本一起供應,改善應用程式效能。如需範例,請參閱「Jetpack Compose 效能」中的「使用基準設定檔」一節。
基準設定檔的運作方式
開發應用程式或程式庫時,建議您定義基準設定檔並涵蓋常見的使用者互動,這些互動的轉譯時間和延遲時間都至關重要。運作方式如下:
系統會產生人類可讀的應用程式設定檔規則,並在應用程式中編譯為二進位檔格式 (可在
assets/dexopt/baseline.prof
中取得)。您隨後可照常將 AAB 上傳至 Google Play。Google Play 會處理設定檔,並連同 APK 直接向使用者發布。在安裝期間,ART 會預先 (AOT) 編譯設定檔中的方法,加快這些方法的執行速度。如果設定檔含有用於應用程式啟動或影格轉譯的方法,使用者可能會獲得更快速的啟動體驗,卡頓情形也會減少。
此流程會與雲端設定檔匯總合作,根據應用程式的實際使用情形微調效能。
雲端設定檔
雲端設定檔提供另一種形式的 PGO,是由 Google Play 商店匯總並與基準設定檔一起發布,方便在安裝時編譯。
雖然驅動雲端設定檔的是使用者與應用程式的實際互動,但雲端設定檔在更新後可能需要幾小時甚至數天的時間才能發布,因此可用性有限。在設定檔完整發布前,全新或更新版應用程式的效能會提供較差的使用者體驗。此外,雲端設定檔僅支援搭載 Android 9 (API 級別 28) 以上版本的 Android 裝置,且只能對使用者數量夠多的應用程式進行適當調整。
各版 Android 的編譯行為
各版 Android 平台採用不同的應用程式編譯方式,各有各的優缺點。基準設定檔會為所有已安裝項目提供資料,藉此改善先前的編譯方法。
Android 版本 | 編譯方法 | 最佳化方法 |
---|---|---|
5 至 6 (API 級別 21 至 23) | 完整 AOT | 整個應用程式在安裝作業期間都會進行最佳化,因此會造成長時間等候使用應用程式、RAM 和磁碟空間使用量增加,以及從磁碟載入程式碼的時間拉長等狀況,甚至冷啟動時間也可能會變長。 |
7 至 8.1 (API 級別 24 至 27) | 部分 AOT (基準設定檔) | 第一次執行應用程式時,系統會透過 androidx.profileinstaller 安裝基準設定檔,那時這個依附元件是由應用程式模組定義。ART 可以在應用程式使用期間新增額外的設定檔規則,並在裝置處於閒置狀態時編譯這些規則,達成進一步改善。這樣可以大幅改善磁碟空間並減少從磁碟載入程式碼的時間,進而縮短應用程式的等待時間。 |
9 (API 級別 28) 以上版本 | 部分 AOT (基準 + 雲端設定檔) | Google Play 會在應用程式安裝期間使用基準設定檔,最佳化 APK 和雲端設定檔 (如果有的話)。安裝完畢後,ART 設定檔會上傳至 Google Play 並進行匯總,然後在其他使用者安裝或更新應用程式時,以雲端設定檔的形式提供。 |
已知問題
以下列出已有解決方案的潛在問題,以及解決方法仍在開發中的問題。
部分裝置 (包括 OnePlus 裝置) 的權限設定可能會導致基準設定檔產生失敗。如要解決這個問題,請在「開發人員選項」設定中關閉「停用權限監控」選項。
Firebase Test Lab 裝置 (包括 Gradle 管理的 Test Lab 裝置) 不支援基準設定檔產生功能 (問題 #285187547)。
如要成功為程式庫提供基準設定檔,請至少使用基準設定檔 Gradle 外掛程式 1.2.3 或 AGP 8.3 (問題 #313992099)。
如果您使用
./gradlew app:generateBaselineProfile
指令產生基準設定檔,測試模組中的基準測試也會執行,且結果會遭到捨棄。如果發生這種情況,您可以使用-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
執行指令,只產生基準設定檔。這個問題已在 AGP 8.2 中修正。用於為所有建構類型產生基準設定檔的指令 (
./gradlew app:generateBaselineProfile
) 只會為發布建構類型產生基準設定檔。這個問題已在 AGP 8.1 中修正。Google Play 商店以外的應用程式發布管道可能不支援在安裝時使用基準設定檔。透過這些管道安裝應用程式的使用者,必須等到 dexopt 在背景執行 (可能是隔日) 後,才會看到相關優勢。
Play 商店內部應用程式分享功能不支援基準設定檔,但內部測試群組則支援。
部分裝置 (例如華為裝置) 的電池效能最佳化設定可能會幹擾設定檔的安裝作業。為確保能夠有效安裝設定檔,請停用基準裝置的所有電池效能最佳化設定。
其他資源
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 建立基準設定檔 {:#create-profile-rules}
- 不使用 Macrobenchmark 建立及評估基準設定檔
- DEX 版面配置最佳化和啟動設定檔