如要提供流暢、穩定且省電的應用程式體驗,您必須找出並解決常見的效能瓶頸,包括穩定性、UI 算繪、記憶體用量、背景工作、啟動延遲和建構最佳化。
本節的指南會說明各類型問題的基礎 Android 平台行為,並逐步說明如何使用 Android Studio 分析器、Perfetto、Logcat 和 ApplicationExitInfo 等工具診斷、分析及修正問題。
穩定性
- ANR:診斷並修正因 UI 執行緒遭封鎖、主執行緒 I/O、鎖定爭用或廣播接收器速度緩慢而導致的應用程式無回應 (ANR) 錯誤。
- 當機:讀取堆疊追蹤、檢查 Logcat 輸出內容,以及避免未處理的例外狀況和原生訊號。
轉譯和啟動
- 轉譯速度緩慢:找出並修正因耗用大量資源的版面配置、繫結傳遞或主執行緒停滯而導致的捨棄或凍結 UI 影格 (
>16ms和>700ms)。 - 緩慢工作階段 (僅限遊戲):
使用
SurfaceFlinger測量影格放送速度,並使用 Android Frame Pacing (Swappy)、Vulkan 和 Android 動態效能架構 (ADPF) 最佳化遊戲影格速率。 - 應用程式啟動時間:瞭解冷啟動、暖啟動和熱啟動的內部運作方式,測量初始顯示時間 (TTID) 和完整顯示時間 (TTFD),並最佳化啟動作業。
記憶體管理
- 記憶體不足終止工具 (LMK):瞭解 Android 記憶體不足終止工具 Daemon (
lmkd) 如何透過oom_adj_score排定程序優先順序,以及如何在 Android Studio、Unity 和 Unreal Engine 中分析記憶體用量。 - 記憶體用量 (匿名 RSS + 交換空間): 測量並減少應用程式在前景、服務和背景狀態下的匿名常駐集大小 (RSS) 和交換空間記憶體用量。
- 點陣圖記憶體用量: 診斷過大或洩漏的點陣圖分配情形,並在 UI 元件移至背景時釋放圖形緩衝區。
電池與背景作業
- Wake Lock 過多:避免長時間保留部分 Wake Lock,並將背景工作遷移至
WorkManager或JobScheduler。 - 部分 Wake Lock 停滯:請確保所有執行和錯誤路徑中,取得的部分 Wake Lock 都已正確釋出。
- 喚醒次數過多:減少精確鬧鐘喚醒次數,並批次處理或延後排定的背景工作。
- 背景掃描 Wi-Fi 次數過多: 盡量減少背景掃描 Wi-Fi 頻率,並使用被動或批次位置和連線能力 API。
- 背景網路用量過大:
使用
WorkManager限制,批次處理並延後背景行動網路傳輸作業。 - 電池用量過高: 分析 CPU、感應器和無線電活動,診斷行動裝置和 Wear OS 裝置的電池耗電量過高問題。
權限和建構最佳化
- 拒絕授予權限:在適當情境下要求執行階段權限,並向使用者清楚說明權限要求原因。
- DEX 程式碼最佳化: 設定 R8 縮減、模糊化和最佳化規則,縮減 DEX 大小並提升執行階段效能。