iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
Mobile Development

Android 性能戰爭:從 Profiler 開始的 30 天優化實錄系列 第 12

# Day 12:【啟動戰役】實作 Baseline Profiles

  • 分享至 

  • xImage
  •  

各位戰士,歡迎來到第十二天的戰場!昨天,我們深入了解了 Baseline Profiles 這款「預編譯神器」的作戰原理。我們知道它能在 App 安裝期間就為我們備好糧草(AOT 編譯),讓使用者在第一次發動攻擊(冷啟動)時,就能體驗到閃電般的疾速。

理論的號角已經吹響,今天就是我們親手鑄造這把神兵利器的時刻。拿起你的鍵盤,開啟你的 Android Studio,我們要一步步為我們的應用產生並應用 Baseline Profile。


戰前準備:建立你的「基準測試」模組

我們不能在主應用程式 (:app) 模組中直接產生 Profile,這會污染我們的正式程式碼。因此,我們需要建立一個專門用於測試和產生 Profile 的新模組。

  1. 在 Android Studio 中,選擇 File > New > New Module
  2. 在左側選擇 Baseline Profile Generator
  3. Target application 選擇你的主模組 (通常是 :app)。
  4. Module name 保持預設的 :baselineprofile 即可。
  5. Language 選擇 Kotlin
  6. 點擊 Finish

Android Studio 會為你完成所有繁重的工作:建立一個新的 Gradle 模組,並配置好所有必要的依賴項,例如 benchmark-macro-junit4uiautomator

同時,它也會在你的 :app 模組的 build.gradle.kts 中加入一個關鍵依賴:

// In app/build.gradle.kts
dependencies {
    // ... other dependencies
    implementation("androidx.profileinstaller:profileinstaller:1.3.1")
}

這個 profileinstaller 函式庫的作用是在 App 於本機安裝時(非透過 Google Play),幫助系統讀取並安裝 Profile,讓我們在開發和測試時就能看到效果。

步驟一:編寫你的「關鍵使用者旅程」腳本
現在,打開新建立的 :baselineprofile 模組,你會找到一個名為 BaselineProfileGenerator.kt 的檔案。這就是我們的作戰腳本,我們需要在這裡告訴系統,哪些操作是我們的「關鍵使用者旅程」。

對於啟動優化,最關鍵的旅程就是「啟動 App 並等待主畫面載入完成」。

讓我們來編寫這個腳本,它使用了 UIAutomator 函式庫來模擬使用者操作:

// In :baselineprofile/src/main/java/com/example/baselineprofile/BaselineProfileGenerator.kt

package com.example.baselineprofile

import androidx.benchmark.macro.junit4.BaselineProfileRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun startup() {
        // 使用 baselineProfileRule 來記錄這段程式碼區塊內發生的所有類別與方法調用
        baselineProfileRule.collect(
            packageName = "YOUR.APP.PACKAGE.NAME" // <-- ‼️ 請務必替換成你 App 的 Package Name
        ) {
            // 腳本開始:按下 Home 鍵,確保 App 是從乾淨的狀態啟動
            pressHome()
            
            // 啟動我們的目標 App
            startActivityAndWait()

            // [可選] 等待某個特定的 UI 元件出現,確保主畫面已完全載入
            // 例如,等待一個 ID 為 "main_recycler_view" 的列表出現
            // device.wait(Until.hasObject(By.res("main_recycler_view")), 5_000)
        }
    }
}

程式碼解析:

  • @get:Rule: 這是 JUnit 測試框架的規則,BaselineProfileRule 是 Jetpack Macrobenchmark 函式庫提供的核心,負責記錄和產生 Profile。

  • collect(): 這是最關鍵的方法。它會啟動你的 App,然後像錄影一樣,記錄下 startActivityAndWait() 以及後續操作中所有被執行到的程式碼路徑。

  • YOUR.APP.PACKAGE.NAME: 這是唯一需要你手動修改的地方,請將它換成你 :app 模組的 applicationId

步驟二:執行產生器,鑄造神兵

腳本寫好了,接下來就是執行它。

  1. 重要前提:產生 Baseline Profile 必須使用實體 Root 手機或 Android Emulator (模擬器)。這是因為產生器需要存取系統層級的資訊。

  2. 在 Android Studio 的右上角,找到執行設定 (Run Configurations),你會發現多了一個名為 Generate Baseline Profile 的選項。

  3. 選擇你的目標模擬器或 Root 手機。

  4. 點擊旁邊的 ▶️ (Run) 按鈕。

測試會開始運行。它會自動安裝並多次啟動你的 App 來收集足夠的數據。這個過程可能會花費幾分鐘,請耐心等待。

執行成功後,見證奇蹟的時刻到了!

步驟三:部署你的 Profile

切換回 Project 視圖。你會發現 Android Studio 已經自動將產生的 Profile 檔案 baseline-prof.txt 放置到了你主模組的 app/src/main/ 目錄下。

(示意圖:產生的 baseline-prof.txt 檔案會出現在 app/src/main 資料夾)

這個檔案裡面充滿了你不必理解的類別和方法簽名——這就是我們為系統精心準備的「作戰藍圖」。

請務必將 baseline-prof.txt 這個檔案提交到你的版本控制系統 (如 Git) 中。

從現在開始,每當你建構一個 Release 版本 的 App 時,Android Gradle Plugin 都會自動將這個 Profile 打包進去。當使用者從商店下載安裝時,ART 就會利用它來進行 AOT 優化。

戰果驗收

如何驗證我們的努力沒有白費?

最直接的方式:回到我們 Day 8 學到的方法,使用 adb 指令再次測量 Release 版 App 的冷啟動時間,你會看到一個顯著的縮短。

在 Logcat 中確認:安裝 Release 版 App 後,在 Logcat 中篩選 ProfileInstaller 這個 Tag,你應該能看到類似 I/ProfileInstaller: Diagnostics - Success 的日誌,這表示 Profile 已經被成功安裝並編譯。

# Logcat Filter
tag:ProfileInstaller

今日總結

恭喜你,戰士!今天我們完成了一次極具價值的實戰操作。我們:

  • 建立了 一個專門的 :baselineprofile 模組。
  • 編寫了 一個描述啟動旅程的自動化腳本。
  • 成功執行 了產生器,並得到了 baseline-prof.txt 這個關鍵檔案。
  • 學會了 如何將 Profile 部署到我們的 App 中。
    你已經掌握了 Android 性能優化中最有效的武器之一。從今天起,你的 App 將以更快的姿態迎接每一位新使用者。

不過,一個完美的啟動體驗,除了速度快,還需要一個優雅的過渡。明天,我們將來探討【閃屏頁 (Splash Screen) 的最佳實踐】,確保使用者在等待 App 啟動的短暫瞬間,也能擁有最佳的視覺體驗。

我們明天見!


上一篇
# Day 11:【啟動戰役】Baseline Profiles (基準設定檔) 的威力
系列文
Android 性能戰爭:從 Profiler 開始的 30 天優化實錄12
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言