---
# System prepended metadata

title: '[Video Note] [Android] [Performance] Philipp Lackner - THIS Is How You Measure the Performance of Your Android App'
tags: [Performance, Android, Video Note]

---

# 引言

這段影片將示範如何測量應用程式的性能，包括啟動時間、關鍵用戶操作（如滾動和點擊）以及如何自動化這些測量。接著，會展示如何利用基線配置文件優化應用性能。

# 簡介

影片中，我們會使用Jetpack Macro Benchmark Library來測量應用程式的性能，並在後續影片中介紹如何優化這些性能。
- 影片中使用的應用程式非常簡單，包含一個按鈕和一個懶加載的列表。

# 建立測試模組

要開始測量性能，我們需要建立一個新的Gradle模組。
- 切換到專案視圖。
- 右鍵選擇根目錄，新增模組。
- 選擇Benchmark模組類型並配置相關設定。

# 設定測試環境

設置完成後，Android Studio會生成一個範例啟動基準測試類。
- 測試類會導航到設備主螢幕並啟動預設活動。
- 必須確保專案的活躍建置變體設為Benchmark。
- 添加profileable標籤到應用程式的清單檔案。

# 範例啟動基準測試

範例測試程式碼將啟動應用並測量其啟動時間。
- 設置測試包名和測量指標（如啟動時間）。
- 設置迭代次數以獲取更準確的測量值。
- 使用冷啟動模式測量應用的啟動時間。

# 不混淆代碼

在進行基準測試時，應避免混淆代碼。
- 創建Benchmark rules.pro檔案。
- 在Benchmark的Gradle文件中引用這個檔案。

# 執行基準測試

設置完成後，可以在實體設備上執行基準測試。
- 選擇Benchmark建置變體並執行測試。
- 測試會多次啟動應用以測量啟動時間。

# 依賴問題

測試過程中可能會遇到Baseline profiles相關的錯誤。
- 添加Profile Installer依賴解決問題。

# 測試結果

測試結果會顯示應用啟動的時間數據。
- 最重要的是中位數值，顯示應用平均啟動時間。

## 重點整理
- **影片目標**：測量和優化應用性能。
- **使用工具**：Jetpack Macro Benchmark Library。
- **步驟**：
  - 創建新的Benchmark模組。
  - 設置測試環境（profileable標籤）。
  - 編寫範例啟動基準測試。
  - 避免代碼混淆（Benchmark rules.pro）。
  - 執行基準測試並解析結果。
- **測試結果**：展示應用啟動時間的詳細數據，主要關注中位數。

## 補充
- **Baseline Profiles**：在後續影片中介紹，優化應用性能的重要工具。
- **實體設備測試**：基準測試應在實體設備上進行，以獲取最接近真實使用情境的數據。

# 測量應用程式效能的測試

# 介紹
- 測量應用程式啟動時間外，還需要測量滾動、關鍵用戶操作等效能。

# 關鍵用戶操作
- 指大多數用戶在啟動應用程式後可能進行的操作。
- 例子：筆記應用程式，用戶打開應用程式後，進行搜索、點擊筆記、編輯等。

# 創建滾動性能測試
## 步驟
1. 複製啟動基準測試代碼，並命名為`scrollAndNavigate`。
2. 不測量啟動時間，而是測量幀時間指標（frame timing metrics）。

## 擴展功能
- 使用`macroBenchmarkScope`來與UI自動化測試庫（UI Automator）結合。
- 外部創建擴展功能，以便重用`macroBenchmarkScope`。

## 查找按鈕和列表
- 使用`UI Automator`查找按鈕和列表。
- 透過文本查找按鈕，例如`"Click me"`。
- 為列表設置測試標籤（test tags），如`"itemList"`，使其可被查找。

## 點擊按鈕並滾動列表
- 點擊按鈕30次以添加30個項目到列表中，使其可滾動。
- 設置滾動手勢邊距，避免觸發設備導航手勢。
- 執行滾動手勢並點擊列表中的最後一項。

## 等待詳細屏幕加載
- 點擊列表中的最後一項，等待詳細屏幕顯示特定文本。

## 結果分析
- 測試結果包含幀持續時間和幀超過時間兩種指標。
- 使用百分位數（P50、P90等）來表示大部分幀的速度。
- 幀超過時間負值表示幀在截止時間前完成，正值表示超過截止時間。

# 結論
- 根據應用程式的用戶數量和需求，決定是否進行效能優化。
- 性能優化應與用戶體驗和功能改進相平衡。

# 關鍵字
- **App Launch Time (應用程式啟動時間)**: 應用程式從點擊圖示到初次顯示畫面的時間。
- **Critical User Journey (關鍵用戶旅程)**: 用戶在應用程式中進行的主要操作流程，例如滾動、點擊項目、導航到詳細頁面等。
- **Frames Dropped (丟幀)**: 在滾動或動畫過程中應用程式未能按預期刷新畫面，導致的畫面卡頓。
- **Jetpack Macro Benchmark Library (Jetpack宏基準庫)**: 一個用於測量應用程式整體性能的庫，包括啟動時間、滾動性能等。
- **Macro Benchmark (宏基準測試)**: 測量應用程式主要性能指標的大範圍基準測試。
- **Micro Benchmark (微基準測試)**: 測量應用程式較小範圍性能指標的基準測試。
- **Gradle Module (Gradle模組)**: 一個構建單元，包含應用程式的相關配置和依賴項。
- **Profileable (可分析)**: 一個標記，使應用程式允許性能數據的收集和分析。
- **Instrumented Test (儀器化測試)**: 在真實設備上運行的測試，用於測量應用程式的性能。
- **Startup Timing Metric (啟動時間指標)**: 用於測量應用程式啟動時間的性能指標。
- **Iterations (迭代次數)**: 測試重複運行的次數，以確保測量結果的準確性。
- **Startup Mode (啟動模式)**: 測試啟動時間的不同模式，包括冷啟動（cold）、熱啟動（hot）等。
- **Proguard (代碼混淆工具)**: 用於壓縮和混淆應用程式代碼的工具。
- **Baseline Profiles (基線配置檔案)**: 預先定義的性能配置，用於優化應用程式啟動和運行性能。
 