各位戰士,歡迎來到第十二天的戰場!昨天,我們深入了解了 Baseline Profiles 這款「預編譯神器」的作戰原理。我們知道它能在 App 安裝期間就為我們備好糧草(AOT 編譯),讓使用者在第一次發動攻擊(冷啟動)時,就能體驗到閃電般的疾速。
理論的號角已經吹響,今天就是我們親手鑄造這把神兵利器的時刻。拿起你的鍵盤,開啟你的 Android Studio,我們要一步步為我們的應用產生並應用 Baseline Profile。
我們不能在主應用程式 (:app
) 模組中直接產生 Profile,這會污染我們的正式程式碼。因此,我們需要建立一個專門用於測試和產生 Profile 的新模組。
:app
)。:baselineprofile
即可。Android Studio 會為你完成所有繁重的工作:建立一個新的 Gradle 模組,並配置好所有必要的依賴項,例如 benchmark-macro-junit4
和 uiautomator
。
同時,它也會在你的 :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
。
腳本寫好了,接下來就是執行它。
重要前提:產生 Baseline Profile 必須使用實體 Root 手機或 Android Emulator (模擬器)。這是因為產生器需要存取系統層級的資訊。
在 Android Studio 的右上角,找到執行設定 (Run Configurations),你會發現多了一個名為 Generate Baseline Profile
的選項。
選擇你的目標模擬器或 Root 手機。
點擊旁邊的 ▶️ (Run) 按鈕。
測試會開始運行。它會自動安裝並多次啟動你的 App 來收集足夠的數據。這個過程可能會花費幾分鐘,請耐心等待。
執行成功後,見證奇蹟的時刻到了!
切換回 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
這個關鍵檔案。不過,一個完美的啟動體驗,除了速度快,還需要一個優雅的過渡。明天,我們將來探討【閃屏頁 (Splash Screen) 的最佳實踐】,確保使用者在等待 App 啟動的短暫瞬間,也能擁有最佳的視覺體驗。
我們明天見!