何十億人ものユーザーのデータコストを削減

データプランのコストは、一部の国では標準的なユーザーの月収の 10% を超える可能性があります。つまり、アプリのダウンロード サイズを最小限に抑え、アプリによるデータの使用方法をユーザー側でコントロールすることで、ユーザーは大きなメリットを得られます。また、ダウンロード サイズを最小限に抑えることで、一部のデバイスにとっては希少な内部ストレージの容量を節約することもできます。

ネットワーク上と内部ストレージ内の両方でアプリが使用するデータ量を最適化するための戦略を以下に示します。

アプリのサイズを削減する

アプリのサイズを削減することは、ネットワーク データと内部ストレージの両面において、ユーザーのデータ使用量を抑える基本的な方法の 1 つです。このセクションでは、アプリのサイズを縮小するいくつかの方法について説明します。

APK のグラフィカルなアセットのサイズを縮小する

  • 多くの場合、グラフィカルなアセットは APK のサイズに最も大きく影響します。グラフィカルなアセットを最適化すると、ダウンロード サイズが削減されるため、ユーザーによるインストール時間を短縮できます。
  • アイコンなどのグラフィック アセットの場合は、Scalable Vector Graphics(SVG)形式を使用します。SVG 画像はビットマップ グラフィックに比べてサイズが小さく、実行時に任意の解像度でレンダリングできます。Android サポート ライブラリを使うことで、ベクター リソースに対する下位互換性のある実装を Android 2.1(API レベル 7)で実現できます。 ベクターの使い方は、こちらの Medium の投稿をご覧ください。
  • 写真など、ベクター以外の画像には WebP を使用して画像の読み込み時間を短縮し、ネットワーク帯域幅を節約します。WebP は、PNG や JPG で提供した場合よりもファイルサイズが小さくなり、しかも画質は同じです。不可逆圧縮の設定でも、WebP は元の画像とほぼ同等の画像を生成できます。Android 4.0(API レベル 14: Ice Cream Sandwich)以降では、不可逆圧縮の WebP サポートの対象となり、Android 4.2(API レベル 17: Jelly Bean)以降では、WebP は可逆圧縮と透明度に対応しています。
  • サイズの大きい画像を多数使用し、複数の密度に対応する場合は、マルチ APK のサポートを使用して密度ごとに APK をスプリットすることを検討してください。この方法では特定の密度を対象にしたビルドが可能になるため、低密度のデバイスを使用するユーザーが、使用しない高密度のアセットをダウンロードする必要は生じません。
  • APK のサイズを小さくする方法について詳しくは、APK のサイズを小さくするおよびコードとリソースの圧縮をご覧ください。また、こちらの Medium の一連の記事で、APK のサイズを小さくする方法に関する詳細なガイドをご覧ください。

コードサイズを小さくする

  • Android プロジェクト内のライブラリはどれも、使用されない可能性のあるコードを APK に追加します。外部ライブラリは、モバイルアプリで使用するように常に設計されているわけではないため、特に注意が必要です。アプリで使用しているライブラリが、モバイルでの使用に合わせて最適化されていることを確認してください。
  • ProGuard などのツールを使用してコンパイルしたコードを最適化することを検討してください。ProGuard は、未使用のコードを特定して APK から削除します。また、build.gradleminifyEnabled=trueshrinkResources=true を設定することで、ビルド時にリソース圧縮を有効化します。これにより、未使用のリソースが APK から自動的に削除されます。
  • Google Play 開発者サービスを使用するときは、必要な API のみを APK に選択的に含める必要があります。
  • APK のコードサイズの削減については、依存関係挿入フレームワークの回避に関する Android トレーニングをご覧ください。

外部ストレージ(SD)へのアプリの移動を許可する

  • 低コストのデバイスでは、デバイス上のストレージが不足する場合がよくあります。ユーザーは SD カードを使用してストレージを拡張できます。ただし、ユーザーが外部ストレージに移動する前に、外部ストレージへのインストールをサポートしていることをアプリで明示的に宣言する必要があります。
  • AndroidManifest.xml で android:installLocation フラグを使用して、外部ストレージにアプリをインストールできるようにします。外部ストレージへのアプリの移動を有効にする方法について詳しくは、アプリのインストール場所に関する Android ガイドをご覧ください。

インストール後のアプリのディスク使用量を削減する

  • アプリのディスク使用量を少なく抑えることができれば、デバイスの空き容量が少なくなったときにユーザーがアプリをアンインストールする可能性が低くなります。キャッシュへの保存に上限を設けることが重要です。そうすれば、アプリのディスク使用が際限なく拡大するのを防ぐことができます。キャッシュに保存したデータは getCacheDir() で取得した場所に格納してください。ここに配置されたファイルはシステムが必要に応じて削除できるため、アプリ側で利用できるストレージとして認識されることはありません。

構成可能なネットワーク使用を提供する

Android プラットフォームには、ユーザーがアプリのネットワーク使用を制御でき、ユーザー独自のニーズに合わせて最適化する方法がいくつかあります。たとえば、アプリの初回使用時に、ネットワーク関連の各種設定をユーザーに提示できます。 アプリの外部からネットワーク設定画面を指定することもできます。

ユーザーのネットワーク選択に合わせて開始画面を提供する

  • データ通信量が多いアプリであっても、ユーザー側で通信量を削減できるようにすることで、ユーザーの評価は上がります。動画ストリーミング アプリなど、アプリが大量の帯域幅を使用する場合、ネットワークの使用を構成できる利用開始画面を提供できます。たとえば、モバイル ネットワークでは低ビットレートの動画ストリームをユーザーが強制的に選べるようにします。
  • データの同期、プリフェッチ、ネットワークの使用動作を制御するための追加設定(たとえば、Wi-Fi でのみスター付きニュース カテゴリをすべてプリフェッチするなど)によって、ユーザーが自分のニーズに合わせてアプリの動作を調整できるようになります。
  • ネットワークの使用の管理について詳しくは、ネットワーク使用状況の管理に関する Android トレーニングをご覧ください。

ネットワークの設定画面を提供する

  • ネットワークの設定画面を使用すると、アプリの外部からアプリのネットワーク設定に移動できます。この画面は、システム設定画面またはシステムデータ使用量画面のいずれかから呼び出すことができます。
  • ユーザーが、アプリ内だけでなく、システム設定からもアクセスできるネットワーク設定画面を提供するには、ACTION_MANAGE_NETWORK_USAGE アクションをサポートするアクティビティをアプリに含めます。
  • ネットワークの設定画面の追加については、設定アクティビティの実装に関する Android トレーニングをご覧ください。

参考情報

このトピックの詳細については、次のリソースをご覧ください。

ブログ投稿