[この記事は Anthony Morris、Google Play ソフトウェア エンジニアによる Android Developers Blog の記事 "Improvements for smaller app downloads on Google Play" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
Google Play は急成長を続けており、昨年、Android ユーザーは Google Play Store から 650 億のアプリをインストールしています。また、新しい魅力的なコンテンツの配信、セキュリティ脆弱性のパッチ、ユーザーのフィードバックへのすばやい対応など、デベロッパーは今まで以上に頻繁にアプリをアップデートしています。
しかし、多くのユーザーは使用するデータ量に敏感です。Wi-Fi を使用していない場合には特にです。Google Play は、アプリのインストールやアップデートの際に転送する必要があるデータを削減しつつ、ユーザーに対するデータのコストを透過的にするという改善に投資しています。
本記事では、アップデートの仕組みや APK のサイズを最適化する方法についてのヒントを紹介します。
Chrome の例:
未圧縮のネイティブ ライブラリがないアプリのサイズは、以前の差分アルゴリズムに比べて平均 5% 減少します。
*1: Colin Percival, Naive differences of executable code, http://www.daemonology.net/bsdiff/, 2003.
例 1: APK の新しい「ダウンロード サイズ」の表示
例 2: APK の新しい「アップデート サイズ」の表示
Chrome の例:
Posted by Yoshifumi Yamaguchi - Developer Relations Team
Google Play は急成長を続けており、昨年、Android ユーザーは Google Play Store から 650 億のアプリをインストールしています。また、新しい魅力的なコンテンツの配信、セキュリティ脆弱性のパッチ、ユーザーのフィードバックへのすばやい対応など、デベロッパーは今まで以上に頻繁にアプリをアップデートしています。
しかし、多くのユーザーは使用するデータ量に敏感です。Wi-Fi を使用していない場合には特にです。Google Play は、アプリのインストールやアップデートの際に転送する必要があるデータを削減しつつ、ユーザーに対するデータのコストを透過的にするという改善に投資しています。
本記事では、アップデートの仕組みや APK のサイズを最適化する方法についてのヒントを紹介します。
アプリのアップデートのサイズを減少させる新たな差分アルゴリズム
Play Store の約 98% のアプリのアップデートは、ダウンロードした APK ファイルの変更(差分)と既存のファイルへのマージであるため、アップデートのサイズを減らすことができます。先日、差分アルゴリズムの bsdiff (*1) が導入されました。これは、以前のアルゴリズムと比べて最大 50% 以上のパッチを削減することができます。bsdiff は、ネイティブ ライブラリの効率的な差分を生成することに特化しており、バージョン間でコンパイル済ネイティブ コードが変わるような特別な手法を活用しています。効率を上げるため、ネイティブ ライブラリは未圧縮の状態で格納します(圧縮すると、差分アルゴリズムに悪影響を与えます)。Chrome の例:
パッチの説明 | 以前のパッチサイズ | bsdiff のサイズ |
M46 から M47 へのメジャー アップデート | 22.8 MB | 12.9 MB |
M47 マイナー アップデート | 15.3 MB | 3.6 MB |
未圧縮のネイティブ ライブラリがないアプリのサイズは、以前の差分アルゴリズムに比べて平均 5% 減少します。
APK 拡張ファイルに差分アルゴリズムを適用し、さらにアップデート サイズを削減する
APK 拡張ファイルを使うと、サイズが 2 GB までの大きなファイル(高解像度グラフィック、メディア ファイルなど)をアプリに追加できます。これはゲームなどでよく使われます。APK に加え、APK 拡張ファイルに適用する差分アルゴリズムと圧縮アルゴリズムも拡張されています。これによって、平均で初回インストール時には 12%、アップデート時には 65% のダウンロード サイズを削減できます。Play Store のサイズ情報の明確化
ダウンロード サイズの削減と合わせて、Play Store の使用データ量やダウンロード サイズの情報を明確に表示するような改善も行われています。Play Store には、APK のファイルサイズではなく、実際のダウンロード サイズが表示されます。既にアプリをインストールしている場合は、アップデート サイズのみが表示されます。この変更は現在公開されています。*1: Colin Percival, Naive differences of executable code, http://www.daemonology.net/bsdiff/, 2003.
ダウンロード サイズを減らすためのヒント
- 1. 正しいサイズ計測のための最適化:ユーザーは、ダウンロード サイズ(アプリのインストールやアップデートでどのくらいのバイトが転送されるか)やディスクサイズ(アプリがどのくらいのディスクを使用するか)を気にしています。このどちらもが元の APK ファイルサイズと同じではなく、相関性があるとも限らないことを知っておくことが重要です。
Chrome の例:
圧縮済みのネイティブ ライブラリ | 未圧縮のネイティブ ライブラリ | |
APK サイズ | 39 MB | 52 MB(+25%) |
ダウンロード サイズ(インストール) | 29 MB | 29 MB(変更なし) |
ダウンロード サイズ(アップデート) | 29 MB | 21 MB(-29%) |
ディスクサイズ | 71 MB | 52 MB(-26%) |
Chrome では、APK のネイティブ ライブラリを圧縮していないので初回ダウンロード サイズは同じですが、Google Play ではダウンロード用の圧縮が既に行われているため、APK のサイズは増加しています。未圧縮ファイルでは差分の効率が上がっているためアップデート サイズが減少し、圧縮済みネイティブ ライブラリをコピーする必要がなくなっているためディスクサイズも減少しています。
2. APK サイズの減少:使用されていないリソースやコードなど、不要なデータを APK から削除します。
3. APK の構成要素のサイズを減らすことによる最適化:たとえば、JPEG ではなく WebP を使用するなど効率的なファイル形式を使ったり、未使用コードを削除するために Proguard を使用したりします。
Posted by Yoshifumi Yamaguchi - Developer Relations Team