ビットマップは、アプリ内で最もメモリを消費するオブジェクトであることが多く、デコードとスケーリングのオペレーションは、フレーム レンダリングのクリティカル パスに頻繁に存在します。ビットマップのメモリ使用量を最適化すると、ジャンク、ANR、OOM 関連のプロセスの強制終了が減少し、UI の応答性、バッテリー寿命、全体的な安定性が大幅に向上します。
ビットマップのメモリ使用量が多い原因
使用されていない仮想メモリも計算に含まれることがあります。ビットマップのメモリ使用量が予想以上に高い場合は、未使用のメモリを割り当てていないことを確認します。
リソース
Android Studio でビットマップを分析する
ビットマップの Android Studio プロファイリング
Memory Profiler を使用して、メモリ割り当てをリアルタイムで検査し、ヒープダンプをキャプチャして、メモリリークのオブジェクトを分析します。また、ヒープ アナライザを使用して、メモリリークを検出し、重複するビットマップ割り当てを特定し、オブジェクト保持を可視化します。
LeakCanary によるリークの自動検出
LeakCanary ライブラリを統合して、アプリ内のメモリリークの検出を自動化します。LeakCanary は、自動ヒープ分析を提供し、ガベージ コレクションされるはずなのにメモリ内に残っているオブジェクト(破棄されたコンポーネントによって保持されているビットマップなど)を特定します。
ビットマップ パフォーマンスのドキュメント
これらのリソースでは、さまざまな Android コンポーネントでビットマップを効率的に処理するためのベスト プラクティスについて包括的なガイダンスを提供しています。
ビットマップ メモリ使用量を最適化するためのデベロッパー チェックリスト
ビットマップのメモリ効率を最適化するには、削減、再利用、リサイクルの 3 つの原則に従います。
- 削減: ビットマップの読み込みまたは表示時の初期メモリ使用量を最小限に抑えます。
- 再利用: 冗長なビットマップ割り当てを回避するために、キャッシュ メカニズムを実装します。
- リサイクル: リソースを積極的に解放し、アクティブなプロセスでメモリを再割り当てできるようにします。
次のデベロッパー向けチェックリストは、ビットマップ メモリの使用量を最適化するうえで役立ちます。
| 基本原則 | 地域 | 説明 |
|---|---|---|
| 削減 | 重複するビットマップを排除する | Memory Profiler を使用してヒープダンプを分析し、冗長なビットマップ割り当てを検出します。ビットマップ メモリの管理ガイドを参照してください。 |
| 画像読み込みライブラリを活用する | Glide や Coil などのライブラリを使用して、スレッド処理、キャッシュ保存、効率的なデコードを自動化します。 | |
| ダウンサンプリングを実装する | 画像をデコードして、フル解像度のアセットを読み込むのではなく、ターゲット UI コンテナのサイズに合わせます。 | |
| 不透明な画像には RGB_565 を使用する | 透過性のない画像で ARGB_8888 から 16 ビット構成に切り替えることで、メモリ使用量を 50% 削減します。 |
|
| VectorDrawable の優先順位付け | アイコンや基本的なグラフィックにベクターを使用して、メモリ オーバーヘッドを最小限に抑えながらシャープなスケーリングを実現します。 | |
| サーバーサイドの画像配信を最適化する | デバイスの密度と UI コンテナのサイズに合わせて調整された画像を提供するようにバックエンド API を構成します。 | |
| 透明な余白を削除する | 組み込みのマージンの代わりに InsetDrawable またはレイアウト パディングを使用して、「見えない」ピクセルのメモリ割り当てを回避します。メモリ パフォーマンスに優れた Android アプリの設計をご覧ください。 | |
| 再利用 | 最適なキャッシュ サイズを構成する | デバイスの RAM と画面の解像度に基づいて、メモリとディスク キャッシュの上限を調整します。ビットマップのキャッシュ保存を参照してください。 |
| リサイクル | バックグラウンドでリソースをパージする | TRIM_MEMORY_BACKGROUND を実装して、キャッシュをクリアし、システム メモリ不足時のプロセスの生存率を向上させます。 |
| UI が非表示のときにアセットを解放 | アプリがユーザーに表示されなくなったときに、TRIM_MEMORY_UI_HIDDEN を使用してビットマップ キャッシュを解放します。 |
|
| メモリリークをモニタリングする | LeakCanary と Memory Profiler を使用して、LifecycleOwner が破棄された後も保持されているビットマップを見つけます。アプリのメモリを管理するを参照してください。 |