基準設定檔總覽

由於不必處理內含程式碼路徑的即時 (JIT) 編譯步驟和解譯,基準設定檔可將首次啟動時的程式碼執行速度加快約 30%。

如果在應用程式或程式庫中提供基準設定檔,Android 執行階段 (ART) 會透過預先 (AOT) 編譯作業提供最佳的程式碼指定路徑,因此每位新使用者和每次應用程式更新都能獲得效能上的提升。這項設定檔引導最佳化 (PGO) 功能可協助應用程式最佳化啟動作業、減少操作卡頓情形,從使用者首次啟動應用程式開始,就持續改善執行階段整體效能。

這樣的效能提升直接反映在業務指標的表現上,例如使用者留存率、交易和評分等等,都能有所改善。如要進一步瞭解效能提升後對業務指標的影響,可以參考 JoshLyftTikTokZomato 的案例。

基準設定檔的優點

基準設定檔可以在首次執行後讓所有使用者互動 (例如啟動應用程式、切換不同畫面或捲動內容) 變得更順暢。藉由提升應用程式的執行和回應速度,基準設定檔能吸引更多每日活躍使用者,並提高平均回訪率。

基準設定檔可提供常見的使用者互動,改善應用程式從一開始啟動的執行階段,引導您完成應用程式啟動以外的最佳化作業。引導式 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
  • 完整來源集區目錄支援 (程式庫模組):可宣告多個基準設定檔來源檔案,並使用變化版本感知目錄 (例如 src/free/generated/baselineProfiles/baseline-prof1.txt),現在可用於程式庫模組和應用程式模組。
  • 基準設定檔包含脫糖類別
8.2
  • R8 重新編寫規則:D8 和 R8 可以轉換人類可讀的基準和啟動設定檔規則,完整擷取最佳化應用程式效能所需的一切規則,將方法的基準設定檔涵蓋率提高約 30%,應用程式效能則提升約 15%。
  • 啟動設定檔:可產生這類新型的基準設定檔,以便傳達 DEX 中的程式碼版面配置,將啟動效能額外提高約 15%;若是大型應用程式,升幅會更加可觀。
8.0 最低建議版本:可使用基準設定檔 Gradle 外掛程式,透過單一 Gradle 工作產生基準設定檔。
  • 完整來源集區目錄支援 (應用程式模組):可宣告多個基準設定檔來源檔案,並使用變化版本感知目錄,例如 src/free/generated/baselineProfiles/baseline-prof1.txt
7.4 最低支援版本:應用程式可以使用程式庫中的基準設定檔,並在 src/main/baseline-prof.txt 檔案中提供自身專屬的基準設定檔。
  • 使用應用程式套件建構 APK 時,系統現在可以正確封裝基準設定檔 (問題 #230361284)。
  • 如果應用程式有多個 .dex 檔案,系統會針對主要 .dex 檔案,以正確的方式封裝基準設定檔。

設定檔產生範例

以下範例類別使用建議的 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 效能」中的「使用基準設定檔」一節

基準設定檔的運作方式

開發應用程式或程式庫時,建議您定義基準設定檔並涵蓋常見的使用者互動,這些互動的轉譯時間和延遲時間都至關重要。運作方式如下:

  1. 系統會產生人類可讀的應用程式設定檔規則,並在應用程式中編譯為二進位檔格式 (可在 assets/dexopt/baseline.prof 中取得)。您隨後可照常將 AAB 上傳至 Google Play。

  2. Google Play 會處理設定檔,並連同 APK 直接向使用者發布。在安裝期間,ART 會預先 (AOT) 編譯設定檔中的方法,加快這些方法的執行速度。如果設定檔含有用於應用程式啟動或影格轉譯的方法,使用者可能會獲得更快速的啟動體驗,卡頓情形也會減少。

  3. 此流程會與雲端設定檔匯總合作,根據應用程式的實際使用情形微調效能。

圖 1. 這張圖表展示從上傳資料到最終發布之間的基準設定檔工作流程,以及該工作流程與雲端設定檔之間的關係。

雲端設定檔

雲端設定檔提供另一種形式的 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 商店內部應用程式分享功能不支援基準設定檔,但內部測試群組則支援。

  • 某些裝置 (例如華為裝置) 的電池效能最佳化設定可能會干擾設定檔的安裝作業。為確保能夠有效安裝設定檔,請停用基準裝置的所有電池效能最佳化設定。

其他資源