はじめに
業務でAndroidアプリの画像読み込みライブラリの選定をしました。所謂技術選定は初めての経験でだいぶ手探りではありましたが、せっかくなのでやったことや考えを書き残しておきます。
最終的にGlideを使うことになりましたが、プロダクトやチーム、選定する時期などによって、どのライブラリが適切かは変わると思いますので、Glideが最強!という話ではありません。またこの記事では、ライブラリの機能や使い方の説明をしてるわけではありません。予めご了承ください。
前提
- チーム内に画像読み込みライブラリについての有識者はいませんでした。
- チーム内で「このライブラリを使いたい!」という希望はありませんでした。
- チーム内にライブラリ選定の経験者はいませんでした。
画像読み込みライブラリとは
ChatGPTに文章をいくつか作ってもらいました。自分の認識と相違なかったのでそのまま載せておきます。
- 画像読み込みライブラリは、Androidアプリ開発において画像の取り込みや表示に関する機能を提供するツールです。このライブラリを使用することで、効率的かつスムーズな画像読み込みや表示を実現することができます。
- 「画像読み込みライブラリ」とは、Androidアプリ内での画像操作に特化したライブラリのことです。このライブラリを使用することで、高速な画像読み込みや異なる画像形式のサポート、画像のキャッシュ管理などが容易に行えます。
- 画像読み込みライブラリは、Androidアプリにおいて画像ファイルの読み込みと表示に関連する機能を提供します。このライブラリを利用することで、メモリ効率の最適化や遅延読み込み、オンデマンドな画像のダウンロードなどが実現できます。
選定をすることになった経緯
LINEのトークリストのような画面をイメージしてください。画面にはユーザーやグループに設定したアイコンが並びます。自分が開発に携わっているアプリでのアイコンを表示は、キャッシュを利用せず毎回サーバーから取得するようになっていたため、通信回数と表示速度に問題がありました。これを解決するために、画像読み込みライブラリを使ってキャッシュを利用することで通信回数の削減と表示速度の向上を行う方針とし、画像読み込みライブラリの選定を行うことになりました。
選定までの流れ
情報共有と認識合わせのためにドキュメントを作った方がいいと判断し、Googleドキュメントで作りながら選定しました。
要件を書き出す
今回であれば以下のようなことを書きました。
- キャッシュに読み込んだ画像を保存しておき再読み込み時に利用したい。
- 拡張子〇〇と〇〇に対応したい。
- サーバーから画像取得時にリクエストヘッダーを付与したい。
選定基準を書き出す
今回は以下を選定基準としました。
機能
当たり前ですが、要件を満たす機能がないと意味がありませんので最重要です。ただし要件に書いたこと全てを満たさなくとも、プラスαでコードを書けば実現できたり、要件を完璧に満たさなくても妥協できたりする場合がありますので、候補を決める段階ではざっくり把握し、調査段階でちゃんと調べる流れにしました。
使いやすさ
継続的に使っていく以上、使いにくいライブラリを選んでしまうと不満が出ますし、後悔します。意味が重なる部分も多いですが、以下の点を「使いやすさ」の判断基準としました。
- 直感的な設計になっていること。
- 可読性の高いコードが書けること。
- 公式ドキュメントが充実してること。
パフォーマンス
同じようなライブラリであれば、当然パフォーマンスが良い方を使いたいです。パフォーマンスとだけ書いても何を気にすればいいか明確ではないので、ググってパフォーマンスに関する参考記事があればそれを紹介しつつ、以下の点を自分で確かめることにしました。
- 画像の読み込み速度
- メモリ/CPUへの負荷
アップデート状況
継続的にアップデートされてなかったり、しばらくリリースされてないとなると、脆弱性や不具合、最新のOSへの対応ができてないなど何かしら問題がある可能性があります。そういったライブラリはリスクが高いのでなるべく避けたいです。
人気
人気があればあるほど、検索した時の情報量や、今後のアップデートの継続性の高さに繋がるのではないかと思っています。
候補を調べる
ある程度候補を絞り込まないと調査ができないので、ググったりChatGPTに聞いて候補を調べました。この時点でリポジトリを見てすぐわかる項目については確認し、適切でなければ候補から外します。例えばライセンスや費用などです。今回であれば以下が最初の候補になりました。CoilはKotlinでの利用が推奨されていることに途中で気づき、今回はJavaでの利用だったので外しました。
- Glide
- Picasso
- Fresco
- Coil
ちなみにChatGPTにはGlideとPicassoをオススメされました。
選定基準について調査する
候補と選定基準が決まったら調査してまとめます。
機能
ググったり、ChatGPTに聞いたり、公式ドキュメントを見たりして、要件を実現できるか確認しました。調べてみたところ、候補とした3つのライブラリ全て要件を満たしそうだったので実際にコードを書いて、本当に実現できるか確かめました。この時点で使いやすさも把握することができます。
調査結果とサンプルコードはドキュメントに記載しました。後は押さえておきたい仕様などがあればそれも書いておきました。
使いやすさ
機能の確認で使いやすさも把握できたので、簡単にまとめて書きました。この部分はドキュメント作成時にはどうしても自分の感想になってしまいますが、仕方がないと思っています。
パフォーマンス
パフォーマンスについてはググったら以下の記事が見つかったので、まずこれらの紹介をしました。
その上で実際にアプリにライブラリを簡易的に組み込んで、画像の読み込み速度と、メモリ/CPUへの負荷を比較しました。
画像の読み込み速度については、キャッシュがある場合とない場合で30件読み込む計測を2回ずつ行い、平均値を表にしました。以下のようなイメージです。
キャッシュあり
Glide | Picasso | |
---|---|---|
1回目平均 | 〇〇 ms | 〇〇 ms |
2回目平均 | 〇〇 ms | 〇〇 ms |
上記の平均 | 〇〇 ms | 〇〇 ms |
キャッシュなし
Glide | Picasso | |
---|---|---|
1回目平均 | 〇〇 ms | 〇〇 ms |
2回目平均 | 〇〇 ms | 〇〇 ms |
上記の平均 | 〇〇 ms | 〇〇 ms |
メモリ/CPUへの負荷については、Android Profilerを使ってざっくり確認し、Android Profilerのスクショを貼って、どんな感じだったかを書きました。
今回試した結果としては、画像の読み込み速度もメモリ/CPUへの負荷もGlideが優れていました。
アップデート状況
GitHubのReleases > Tagで直近3つを確認して書き出しました。2023/04/19時点では以下の通りで、直近1年以内のアップデート色を変えて目立たせてます。こうして見るとGlideは活発にアップデートされていることがわかります。
- Glide:2023/03/14, 2023/02/25, 2022/10/08
- Picasso:2020/08/10, 2018/03/08, 2015/03/21
- Fresco:2023/03/18, 2021/10/02, 2021/06/08
人気
Google Trendsで直近1年の人気度を確認してスクショとリンクを貼り、GutHubのスター数を書き出しました。2023/04/19時点では以下の通りでした。
- Glide:33.5k
- Picasso:18.5k
- Fresco:16.9k
メンバーに確認してもらう
ドキュメントをメンバーに確認してもらい、どのライブラリを使うか最終決定をします。今回は自分の方で、「こういう感じの調査結果なのでこれを使います」というところまでドキュメントに書いて見てもらい、「質問や意見がなければこれで進めたいと思います」といった感じで進めました。
選定結果
自分が定めた選定基準で、自分が調査した限りでは、Glideが最も適切なライブラリでした。「こういう部分はこっちのライブラリの方がいいんだけどな〜」みたいなのがほとんどなく、全ての選定基準において優れていました。メンバーからの異論もなかったのですんなり決まりました。
最終的なドキュメントの構成
- 選定結果
- 前提
- 選定期間
- 要件
- 候補
- 選定基準
- 機能
- 使いやすさ
- パフォーマンス
- アップデート状況
- 人気
- 調査結果
- 機能
- 使いやすさ
- パフォーマンス
- アップデート状況
- 人気
- 参考:パフォーマンス計測記録
実際に作ったドキュメントは見出しによってはもう一段階細かく分けてあったりしますが、構成は上記の通りで作りました。
選定結果は、「最後まで読まないとどのライブラリ選んだのかわからないのはどうなんだ」と思い最初に書きました。
パフォーマンス計測記録は、文章量が多かったので一番下に持っていきました。調査結果にはパフォーマンス計測記録へのリンクを貼って「詳細は〜をご確認ください」みたいにしました。
反省/改善点
ライセンス
選定基準にライセンスを含め、各ライブラリのライセンスと自分の解釈を書くべきでした。今回は候補を絞り込む段階で確認しましたが。自分の解釈が間違っている可能性があり、ドキュメントに書かないことでメンバーからの指摘をもらえないかもしれないからです。これについては次の機会があれば必ず書こうと思います。
IssueとPull Request
IssueとPull Requestの対応状況を1つの基準にした方が良いという考え方があると思います。これについては、対応状況と言っても具体的に何を判断材料とするべきかがピンときていませんので、次の機会に調べて挑戦したいと思います。
ライブラリの情報を表にする
ふわっとしたイメージしかありませんが、ライブラリの情報を表にして載せた方がわかりやすかったかなーと思っています。以下のようなイメージです。調査結果も合体できそうなら合体しちゃえば一目でわかるので良い気がしています。
Glide | Picasso | Fresco | |
---|---|---|---|
GutHubリポジトリ | リンク | リンク | リンク |
公式ドキュメント | リンク | リンク | リンク |
ライセンス | 〇〇 | 〇〇 | 〇〇 |
費用 | 無料 | 無料 | 無料 |
GutHubのスター数 | 33.5k | 18.5k | 16.9k |
おわりに
今回初めてライブラリの選定を経験し、技術選定の方法や考え方について学ぶ機会となりました。ただこの記事に書いたことが正解であるとは思っておらず、選定基準やドキュメントの構成については見直す余地があると感じています。今後より良い技術選定ができるようにレベルアップしていきたいと思います。ご覧いただきありがとうございます。