點陣圖通常是應用程式中耗用最多記憶體的物件。解碼和縮放作業經常位於影格算繪的關鍵路徑上。最佳化點陣圖記憶體用量可減少卡頓、ANR 和 OOM 相關的程序終止情形,大幅提升 UI 回應速度、電池續航力及整體穩定性。
導致點陣圖記憶體用量偏高的原因
計算結果也可能包含從未使用過的虛擬記憶體。如果發現點陣圖記憶體用量異常偏高,請確認您未分配未使用的記憶體。
資源
在 Android Studio 中分析點陣圖
Android Studio 位元對應剖析
使用記憶體分析器即時檢查記憶體配置情形、擷取記憶體快照資料,以及分析物件是否發生記憶體流失;此外,您也可以使用堆積分析器偵測記憶體流失、找出重複的點陣圖配置,以及以視覺化方式呈現物件保留情形。
使用 LeakCanary 自動偵測記憶體流失
整合 LeakCanary 程式庫,自動偵測應用程式中的記憶體流失問題。LeakCanary 會自動分析堆積,找出應該已進行垃圾收集,但仍保留在記憶體中的物件,例如已毀損元件保留的點陣圖。
點陣圖效能說明文件
這些資源提供全面指引,說明如何有效處理不同 Android 元件中的點陣圖。
開發人員檢查清單:最佳化點陣圖記憶體用量
如要盡量減少點陣圖記憶體用量,請遵循以下三項核心原則:減少、重複使用及回收。
- 減少:載入或顯示點陣圖時,盡量減少初始記憶體用量。
- 重複使用:導入快取機制,避免多餘的點陣圖配置。
- 回收:主動釋出資源,允許為作用中程序重新分配記憶體。
您可以參考下列開發人員檢查清單,進一步最佳化點陣圖記憶體用量。
| 核心原則 | 領域 | 說明 |
|---|---|---|
| 減少 | 消除重複的點陣圖 | 使用記憶體分析器分析記憶體快照資料,偵測多餘的點陣圖配置。請參閱「管理點陣圖記憶體」指南。 |
| 善用圖片載入程式庫 | 使用 Glide 和 Coil 等程式庫,自動執行執行緒、快取和有效率的解碼作業。 | |
| 實作降採樣 | 解碼圖片,以符合目標 UI 容器尺寸,而非載入完整解析度的素材資源。 | |
| 不透明圖片使用 RGB_565 | 針對沒有透明度的圖片,從 ARGB_8888 切換至 16 位元設定,即可減少 50% 的記憶體用量。 |
|
| 優先使用 VectorDrawable | 圖示和基本圖形使用向量,確保縮放時清晰銳利,並將記憶體負擔降至最低。 | |
| 最佳化伺服器端圖片傳送 | 設定後端 API,提供符合裝置密度和 UI 容器尺寸的圖片。 | |
| 消除透明邊界 | 請使用 InsetDrawable 或版面配置邊框間距,而非內建邊界,避免為「隱形」像素分配記憶體。請參閱「設計記憶體效能良好的 Android 應用程式」。 | |
| 重複使用 | 設定最佳快取大小 | 根據裝置 RAM 和螢幕解析度調整記憶體和磁碟快取限制。請參閱「快取點陣圖」。 |
| 回收 | 在背景清除資源 | 實作 TRIM_MEMORY_BACKGROUND,在系統記憶體壓力過大時清除快取,並提高程序存活率。 |
| 隱藏 UI 時釋出資產 | 當應用程式不再向使用者顯示時,請使用 TRIM_MEMORY_UI_HIDDEN 發布點陣圖快取。 |
|
| 監控記憶體流失 | 使用 LeakCanary 和記憶體分析器,找出在 LifecycleOwner 遭到終止後仍保留的點陣圖。請參閱「管理應用程式的記憶體」。 |