Register now for Android Dev Summit 2019!

何十億人ものユーザーに受け入れられるデータのコスト削減

一部の国では、データプランのコストに標準的なユーザーの月収の 10% 以上かかることがあります。そのため、アプリのダウンロード サイズを最小限に抑え、アプリのデータ使用をユーザーが制御できるようにすれば、目に見える大きなメリットを多くのユーザーに提供できます。ダウンロード サイズを小さくすることは内部ストレージ(一部の端末ではこれが不足しがちです)の容量を節約するためにも役立ちます。

ここでは、ネットワーク上と内部ストレージ内の両方でアプリが使用するデータの量を最適化するための戦略について説明します。

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

アプリのサイズを削減することは、ネットワーク データと内部ストレージの両面でユーザーのデータ消費を節約する根本的な方法の 1 つです。このセクションでは、アプリのサイズを削減するいくつかの方法を取り上げます。

APK のグラフィック アセット サイズを削減する

  • グラフィック アセットは多くの場合、APK のサイズに最も影響を及ぼします。グラフィック アセットのサイズを最適化すると、ダウンロード サイズが削減されるため、ユーザーによるインストール時間を短縮できます。
  • アイコンなどのグラフィック アセットには Scalable Vector Graphics(SVG)形式を使用します。SVG 画像はビットマップ グラフィックに比べてサイズが小さく、実行時に任意の解像度でレンダリングできます。Android Support Library により、ベクター リソース実装の Android 2.1(API レベル 7)に対する下位互換性が提供されます。ベクターについては、まずこちらの Medium の投稿をご覧ください。
  • 写真など、ベクター以外の画像には WebP を使用して画像の読み込み時間を短縮し、ネットワーク帯域幅を節約します。WebP を使用すると、PNG や JPG を使用した場合よりもファイルサイズが小さくなり、画質は同等以上になることが実証されています。不可逆圧縮の設定でも、WebP は元の画像とほぼ同等の画像を生成できます。Android では、不可逆圧縮の WebP サポートは Android 4.0(API レベル 14: Ice Cream Sandwich)以降、可逆圧縮 / 透過モードの WebP は Android 4.2(API レベル 17: Jelly Bean)以降で提供されています。
  • サイズの大きい画像を多数使用し、複数の密度に対応する場合は、複数 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 トレーニングで詳細をご覧ください。