基準設定檔總覽

基準設定檔避免了包含程式碼路徑的解譯和 just-in-time (JIT) 編譯步驟,因此從首次啟動後,已將程式碼執行速度提高約 30%。

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

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

基準設定檔的優點

基準設定檔可預先編譯重要使用者互動中的程式碼,例如啟動應用程式、切換不同畫面或捲動內容,讓這些互動從首次執行起就更順暢。基準設定檔會提升應用程式的執行和回應速度,進而吸引更多每日活躍使用者,並提高平均回訪率。

基準設定檔可提供常見的使用者互動,改善應用程式從一開始啟動的執行階段,引導您完成應用程式啟動以外的最佳化作業。引導式 AOT 編譯不需要使用者裝置,且可在開發機器 (而非行動裝置) 上各版本進行一次。發布提供基準設定檔的版本時,應用程式最佳化作業的速度會比只依賴雲端設定檔時更快。

不使用基準設定檔時,所有應用程式程式碼都會在解譯後於記憶體中進行 JIT 編譯,或是在裝置處於閒置狀態時從背景寫入 odex 檔案。在安裝或更新應用程式後,使用者首次執行應用程式的體驗會較差,需等到新程式碼路徑完成最佳化才會改善。許多應用程式經過最佳化調整後,測得的效能可以提升約 30%。

啟動設定檔

啟動設定檔與基準設定檔類似,但前者是在編譯時間使用,而不是用於裝置端最佳化期間,目的是將 DEX 版面配置最佳化,進而加快啟動速度。如要進一步瞭解啟動設定檔與基準設定檔的差異,請參閱「比較基準設定檔和啟動設定檔」。如要進一步瞭解 DEX 版面配置最佳化,請參閱「DEX 版面配置最佳化和啟動設定檔」。

開始使用

如要開始最佳化現有應用程式的效能,請參閱「建立基準設定檔」一文。

設定檔產生與發布子版本

請務必瞭解產生基準和啟動設定檔 (例如 baseline-prof.txtstartup-prof.txt) 時,以及建構最終發布 APK 並使用這些設定檔時,所需的建構設定差異。

產生設定檔時 (例如 benchmark):

為確保產生的設定檔規則與程式碼的方法簽章完全相符,您必須關閉用於產生設定檔的建構變數的模糊化和最佳化 (R8) 功能。這個變體必須與啟用混淆處理和最佳化的發布建構變體不同。如要達成這個目標,請為設定檔產生建構變體設定 isMinifyEnabled = false。如果您未使用基準設定檔 Gradle 外掛程式,也請務必套用 -dontobfuscate-dontoptimize基準設定檔 Gradle 外掛程式會自動為您處理這項設定。

建構最終發布版 APK 時:

發行版本應一律包含 isMinifyEnabled = true,才能享有模糊處理、壓縮和最佳化功能。R8 會自動重新編寫未模糊化設定檔中的規則,以符合發布 APK 中模糊化和最佳化的程式碼。如要有效進行DEX 版面配置最佳化 (由啟動設定檔驅動),發布的應用程式必須經過模糊處理,並使用 R8 且啟用所有最佳化功能。

依附元件鏈結會提供穩定版和開發版的發布版本。如要產生及安裝基準設定檔,請使用以下支援的 Android Gradle 外掛程式、Macrobenchmark 程式庫和設定檔安裝程式版本 (包括較新的版本)。這些依附元件會在不同時間發揮作用,並以工具鏈的形式搭配運作,達成基準設定檔最佳化。

  • Android Gradle 外掛程式:com.android.tools.build:8.0.0
  • Macrobenchmark 程式庫:androidx.benchmark:benchmark-macro-junit4:1.4.1
  • 設定檔安裝程式: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 檔案,以正確的方式封裝基準設定檔。
  • D8 和 R8 支援從 isMinifyEnabled 設為 false 的建構作業產生啟動設定檔。

可辨識變體的設定檔來源設定

針對應用程式使用 Android Gradle 外掛程式 (AGP) 8.0 版,針對程式庫使用 AGP 8.3 版,即可將基準設定檔規則放在專屬的來源集目錄中,擺脫單一固定路徑 (例如 src/main/baseline-prof.txt) 的限制,並啟用多個檔案。

這有助於支援各種變化版本,讓您定義專為特定建構變種版本和類型量身打造的 Baseline Profile (例如使用 src/variant/baselineProfiles/ 等目錄),確保效能最佳化規則能準確套用至每個不重複的應用程式或程式庫二進位檔。

設定檔產生範例

以下範例類別使用建議的 Macrobenchmark 程式庫,為應用程式啟動作業以及多個導覽和捲動事件建立基準設定檔:

class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun appStartupAndUserJourneys() {
        baselineProfileRule.collect(packageName = PACKAGE_NAME) {
            uiAutomator {
                // App startup journey.
                startApp(PACKAGE_NAME)

                // Find and click elements using the new DSL
                onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
                onElement { viewIdResourceName == "myLazyColumn" }.also {
                    it.fling(Direction.DOWN)
                    it.fling(Direction.UP)
                }
                pressBack()
            }
        }
    }
}

如要進一步瞭解如何使用 UI Automator 程式庫自動執行使用者歷程,請參閱「使用 UI Automator 編寫自動化測試」。

您可以在 GitHub 上的效能範例中查看此程式碼的完整背景資訊和更多詳細資料。

包含的內容

在應用程式中使用基準設定檔時,您可以加入應用程式啟動程式碼和常見的使用者互動操作,例如捲動或切換畫面的導覽操作。您也可以收集整個流程,例如註冊、登入或付款。凡是您認為重要的使用者歷程,只要能夠改善執行階段效能,即可從基準設定檔中受益。

如果您正在嘗試不同的做法,希望能夠改善應用程式效能,請考慮同時在兩個實驗組中都加入基準設定檔。這麼一來,您就能確保所有使用者都能在相同的基準下執行編譯程式碼,讓結果更容易解讀。

程式庫可提供專屬的基準設定檔,並與發布版本一起供應,改善應用程式效能。如需範例,請參閱「Jetpack Compose 效能」中的「使用基準設定檔」一節

基準設定檔的運作方式

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

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

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

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

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

比較基準設定檔和啟動設定檔

您可以使用基準設定檔 Gradle 外掛程式定義及產生設定檔。這個外掛程式會掛鉤至建構程序,AGP 會將這些人類可讀的設定檔規則編譯為二進位格式,並封裝為 APK 或 AAB 中的 baseline.prof,供 ART 有效用於裝置端編譯 (前提是大小小於 1.5 MB)。

產生的設定檔檔案通常命名為 startup-prof.txtbaseline-prof.txt。雖然兩者內容有時可能相似 (特別是如果您主要專注於啟動),但用途不同,且會在不同階段影響成效:

基準設定檔

基準設定檔檔案包含一整套規則,Android 執行階段 (ART) 會使用這些規則預先編譯常用程式碼路徑,進一步提升應用程式效能,而不僅是啟動程序。

基準設定檔檔案通常是啟動設定檔中規則的超集。這個檔案包含應用程式啟動最佳化所需的所有規則 (透過 baselineProfile Gradle 工作產生),以及其他重要使用者歷程的額外設定檔。例如捲動及瀏覽不同畫面。

無論 includeInStartupProfile 設定欄位的值為何,系統都會產生這些額外的非啟動規則。

啟動設定檔

啟動設定檔檔案包含專為應用程式啟動路徑最佳化的規則。在編譯期間,D8 會將 Java 位元碼轉換為 DEX 格式。接著,R8 會使用這個檔案影響 DEX 檔案的版面配置,確保重要啟動程式碼會放在主要 DEX 檔案中,以便更快執行。一般來說,您應該只針對應用程式初始顯示畫面不可或缺的測試情境,將 includeInStartupProfile 設為 true。詳情請參閱「建立啟動設定檔」。

雲端設定檔

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

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

其他資源

為您推薦