點陣圖通常是應用程式中耗用最多記憶體的物件。解碼和縮放作業經常位於影格算繪的關鍵路徑上。最佳化點陣圖記憶體用量可減少卡頓、ANR 和記憶體不足相關的程序終止,大幅提升 UI 回應速度、電池續航力及整體穩定性。
找出點陣圖記憶體用量偏高的情形
Android Vitals 會彙整 Android 裝置的資料,提供應用程式點陣圖記憶體用量的指標。這些指標包括以時間週期為準 (例如 28 天) 的每個套件和程序的百分位數。這類資料有助於找出不同裝置類型和版本在記憶體效率方面的趨勢和潛在回歸。
Android Vitals 會依下列程序狀態,提供應用程式的點陣圖記憶體用量:
- 前景:應用程式的程序可見。在前景中,P99 預計會明顯高於其他程序狀態,但如果 P99/P50 比率顯著 (例如高於 3.5 倍),開發人員應進行調查,因為這通常表示有點陣圖記憶體流失。您可以查看一般用量 (P50) 和離群值用量 (P99) 之間的差異,找出這個問題;一般資產膨脹會使所有百分位數的記憶體用量一致增加,但記憶體洩漏會隨著時間累積,大幅扭曲尾端資料 (P99)。確認應用程式轉換至其他狀態後,前景點陣圖配置不會不必要地持續存在。
- 使用者感知服務:應用程式的程序正在可察覺狀態下執行。包括前景服務、加速工作和使用者啟動的資料移轉工作。應用程式在轉換至這些狀態時,不得保留大量前景點陣圖分配。因為這些服務是為長時間執行的工作而設計,保留大型資產會降低整體使用者體驗,並迫使記憶體不足終止工具 (LMKD) 終止優先順序較低的程序,以回收記憶體。
- 背景:應用程式正在執行背景服務,或最近剛進入背景,但尚未快取。由於這個程序狀態的重要性低於前景或可感知程序,應用程式應在此明確釋出大型點陣圖資產,以減輕記憶體壓力。
- 已快取:應用程式處於快取狀態。這個狀態對系統記憶體壓力 (例如 LMK) 非常敏感。應用程式必須主動減少此狀態下的點陣圖記憶體用量,以免遭到 OS 逐出。
導致點陣圖記憶體用量偏高的原因
計算結果也可能包含從未使用過的虛擬記憶體。如果發現點陣圖記憶體用量異常偏高,請確認您未分配未使用的記憶體。
資源
在 Android Studio 中分析點陣圖
Android Studio 位元對應剖析
使用記憶體分析器即時檢查記憶體配置情形、擷取記憶體快照資料,以及分析物件是否有記憶體流失問題;此外,您也可以使用堆積分析器偵測記憶體流失、找出重複的點陣圖配置,以及以視覺化方式呈現物件保留情形。
使用 LeakCanary 自動偵測記憶體流失
整合 LeakCanary 程式庫,自動偵測應用程式中的記憶體流失問題。LeakCanary 會自動分析堆積,找出本應進行垃圾收集,但仍保留在記憶體中的物件,例如遭刪除的活動或片段保留的點陣圖。
點陣圖效能說明文件
這些資源提供全面指引,說明如何有效處理不同 Android 元件中的點陣圖。
開發人員檢查清單:最佳化點陣圖記憶體用量
如要盡量減少點陣圖記憶體用量,請遵循以下三項核心原則:減少、重複使用及回收。
- 減少:載入或顯示點陣圖時,盡量減少初始記憶體用量。
- 重複使用:導入快取機制,避免多餘的點陣圖配置。
- 回收:主動釋出資源,讓作用中程序重新分配記憶體。
您可以參考下列開發人員檢查清單,盡可能減少點陣圖記憶體用量。
| 核心原則 | 領域 | 說明 |
|---|---|---|
| 減少 | 消除重複的點陣圖 | 使用記憶體分析器分析記憶體快照資料,偵測多餘的點陣圖配置。請參閱「管理點陣圖記憶體」指南。 |
| 善用圖片載入程式庫 | 使用 Glide 和 Coil 等程式庫,自動執行執行緒、快取和有效率的解碼作業。 | |
| 實作下取樣 | 解碼圖片,以符合目標 UI 容器尺寸,而非載入完整解析度的素材資源。 | |
| 不透明圖片使用 RGB_565 | 針對沒有透明度的圖片,從 ARGB_8888 切換至 16 位元設定,即可減少 50% 的記憶體用量。 |
|
| 優先處理 VectorDrawable | 圖示和基本圖形使用向量,確保縮放時清晰銳利,並將記憶體負擔降至最低。 | |
| 最佳化伺服器端圖片傳送 | 設定後端 API,提供符合裝置密度和 ImageView 尺寸的圖片。 | |
| 消除透明邊框 | 請使用 InsetDrawable 或版面配置邊框間距,而非內建邊界,避免為「隱形」像素分配記憶體。請參閱「設計記憶體效能良好的 Android 應用程式」。 | |
| 重複使用 | 設定最佳快取大小 | 根據裝置 RAM 和螢幕解析度調整記憶體和磁碟快取限制。請參閱「快取點陣圖」。 |
| 回收 | 在背景清除資源 | 實作 TRIM_MEMORY_BACKGROUND,在系統記憶體壓力過大時清除快取,並提升程序存活率。 |
| 在 UI 隱藏時釋出資產 | 當應用程式不再向使用者顯示時,請使用 TRIM_MEMORY_UI_HIDDEN 發布點陣圖快取。 |
|
| 監控記憶體流失 | 使用 LeakCanary 和記憶體分析器,找出在 LifecycleOwner 遭到刪除後保留的點陣圖。請參閱「管理應用程式的記憶體」。 |