これは ZOZO Advent Calendar 2023 シリーズ9の21日目の記事です。
はじめに
先日、Android Dagashiさんの中で65% Smaller APKs and 70% Less Memory: How I Optimized My Android App -Part II (App Memory)という記事がリストアップされていました。ご覧になった方も多いのではないでしょうか。
私も同記事を読んでみたところ、参考になるTipsが多く含まれていました。
そのため、自身が携わっているアプリで試してみることにしました。
計測する
記事に倣って、現在のメモリ消費量を計測します。
今回は手元のデバック環境で試すだけのため、Android Profilerを使用します。
Galaxy SC-51D(Android 13)を使用し、画像を大量に読み込む操作を行ったところ、操作時のメモリ消費量は580MB前後でした。
本来は丁寧にボトルネック箇所を探すべきですが、今回は勉強も兼ねて記事の内容を試してみましょう。
手法を試す
記事で紹介されている手法の内、以下の3つを試しました。
- カラーフォーマットの変更
- offScreenPageLimitの変更
- onViewRecycled時のリクエストのキャンセル
1. カラーフォーマットの変更
対象のAndroidアプリはCoilとPicassoを使用しているため、以下のようにコードを追加しました。
// Coil
ImageRequest.Builder(LocalContext.current).data(url).apply {
// 省略
allowRgb565(true)
// Picasso
// インスタンス生成時にconfigを渡す
Picasso myPicasso = new Picasso.Builder(this.getContext()).defaultBitmapConfig(RGB_565).build();
再度計測すると、535MBまで減少しました🎉
Before | 1 | |
---|---|---|
消費量 | 580MB | 535MB |
2. offScreenPageLimitの変更
offScreenPageLimitを2に設定している箇所があったため、1に変更します。
※コードは省略します
再度計測すると、525MBまで減少しました。
カラーフォーマットほどではありませんが、効果があるようです。
Before | 1 | 1 + 2 | |
---|---|---|---|
消費量 | 580MB | 535MB | 525MB |
3. onViewRecycled時にリクエストをキャンセルする
RecyclerViewの中でPicassoを使用しているため、以下のようにコードを追加します。
public class MyRecyclerView extends RecyclerView {
// 省略
@Override
public void onViewRecycled(@NonNull HogeViewHolder holder) {
Picasso.get().cancelRequest((ImageView)holder.itemView);
}
}
再度計測すると、今回は増加してしまいました。
Before | 1 | 1+2 | 1+2+3 | |
---|---|---|---|---|
消費量 | 580MB | 535MB | 525MB | 555MB |
詳しい原因は追えていませんが、今回は1+2の組み合わせが効果的なようでした。
さいごに
今回は65% Smaller APKs and 70% Less Memory: How I Optimized My Android App -Part II (App Memory)で紹介されている手法の一部を試してみました。
その結果、以下の通りにメモリ消費量を削減できることが分かりました🎉
Before | After | |
---|---|---|
消費量 | 580MB | 525MB |
画像の扱いに悩んでいる方は是非元の記事をご参照ください!