Instant App のサイズを小さくする

Google Play Instant では、ウェブリンクをタップするだけで、リッチなネイティブ エクスペリエンスが提供されます。ユーザーはあらかじめインストールしなくてもアプリを体験できるため、高水準で質の高いエンゲージメントを実現します。ただし、通常のモバイル ウェブページと同じくらい高速に Instant App を読み込むには、適切に構造化された効率的な Instant App を作成する必要があります。Instant App のバイナリが小さいほど、読み込みが速くなり、ユーザー エクスペリエンスが改善されます。

このドキュメントでは、アプリの構造とバイナリサイズを調整して、心地よい Instant App エクスペリエンスを実現するためのベスト プラクティスを紹介します。これはインストール可能なアプリにも適用できます。

複数の機能モジュールにリファクタリングする

アプリを複数の機能モジュールにリファクタリングすると、アプリのバイナリサイズが格段に小さくなります。基本機能モジュールから、テーマに関連するワークフローをそれ専用の機能モジュールに抽出します。各機能モジュールに開始アクティビティと一意の URL を割り当て、ユーザーがモジュールのワークフローを完了できるようにします。

機能モジュールを作成する際は、基本機能モジュールをできるだけ小さくします。特に、アプリ内で依存ライブラリにアクセスする必要がある場合には細心の注意が必要です。あるライブラリを使用する機能モジュールが 1 つだけの場合は、そのライブラリを基本機能モジュールではなく、その機能モジュールにインポートします。なんらかの機能モジュール用に Instant App をリリースする場合、その機能モジュールと基本機能モジュールの合計サイズを 4 MB 未満にする必要があります。

おすすめの方法

アプリをリファクタリングする際は、次の点に注意してください。

両方のアプリタイプで同じコードベースを使用する
モジュール化された同じコードベースを使用して、インストール済みアプリと Instant App の両方を作成することにより、アプリのプロジェクト管理プロセスを単純化します。
機能モジュールが複数になることを意識して設計する
アプリにワークフローが 1 つしかなく、当面 1 つの機能モジュールしか必要ない場合でも、機能モジュールが複数になることを意識して設計することをおすすめします。これにより、元の機能モジュールのサイズに影響を与えずに、既存のモジュールをアプリに追加できます。
最初から機能モジュールのサイズ制限に注目しない
機能モジュールのサイズ制限は、ローカルビルドされたバイナリには適用されません。内部テストトラックから Instant App をリリースすることもできます。この場合、機能モジュールのサイズが 10 MB に制限されます。アルファ トラックと製品版トラックのみに 4 MB の上限が適用されます。

アプリのリソースを更新する

一部のアプリ、特にコードベースの履歴が長いアプリには、アプリのバイナリが使用しなくなったリソースが含まれています。アプリのモジュールを小さくする方法として、以下にあげる不要なコードの一般的な発生源を確認してください。

画像のファイルサイズを小さくする

PNG の代わりに WebP ファイル形式を使用すると、アプリのドローアブルの合計サイズを大幅に縮小できます。Google Play Instant では、透過や可逆圧縮を含め、WebP を完全にサポートしているため、画質は変わりません。

可能であれば、他の PNG 画像を使用するための下位互換性に必要なものをすべて削除します。PNG 画像を使用する必要がある場合は、アプリのビルドとインストールに使用するモジュールに配置します。

余分な言語を削除する

アプリが複数の言語に対応している場合は、できる限り多くのローカライズされたリソースを減らします。この手順は、android.support.v7.appcompat などの「app compat」ライブラリを使用する場合に特に有効です。このライブラリにはさまざまな言語のメッセージが含まれていますが、アプリによってはサポートされていないものもあります。

詳しくは、未使用の代替リソースを削除する方法をご覧ください(特に未使用の言語)。

余分なファイルを削除する

プロジェクトにインポートしたリソースの一部をアプリが使用しなくなる可能性があります。このようなリソースを削除するために、Android Studio には、この状況に対する Lint チェックがあります。このツールを使用する手順は次のとおりです。

  1. Ctrl + Alt + Shift + I を押します(Mac OS の場合は Command + Alt + Shift + I)。
  2. 表示されたダイアログで、"unused resources" と入力します。
  3. [Unused resources] オプションを選択して、リソース使用状況検査プロセスを開始します。

アプリに大きなリソースが残っている場合は、パッケージ化を解除してアプリから取り出し、アプリの使用開始後に独立したファイルとしてダウンロードできるかどうかを検討してください。このような画像読み込みの遅延には通常、コードの変更が必要ですが、ユーザーが明示的にリクエストするリソースのみをダウンロードすることで、Instant App のファイルサイズを大幅に縮小できます。

未使用のライブラリを削除する

アプリの規模が大きくなるにつれ、驚くほど多くの依存関係、特に次のタイプの依存関係が発生する可能性がでてきます。

  • ネイティブ ライブラリ: Instant App が実行しないネイティブ コードを含んだライブラリ。
  • 推移的な依存関係: アプリがインポートしたライブラリが依存するライブラリ。

Android Studio には、アプリのプロジェクト内の無関係な依存関係を特定するための便利なツールがいくつかあります。

外部ライブラリ

Android Studio の [Project] ビューには [External Libraries] セクションがあります。

このセクションには、ネイティブ コードやすべての推移的な依存関係など、アプリが使用するすべてのライブラリが含まれます。このビューで、アプリが必要としない未使用または重複したライブラリを探します。

APK Analyzer

APK Analyzer ツールを使用すると、Instant App のビルドなど、さまざまなビルドを比較できます。

アプリに必要とされないライブラリがわかったら、Gradle ビルドファイルに次のような行を追加してそれらを除外します。

<feature_module>/build.gradle

dependencies {
        implementation('some-important-but-large-library') {
            exclude group: 'com.example.imgtools', module: 'native'
        }
    }
    

アプリの依存関係の合計インポート サイズを減らす方法については、Gradle の依存関係の管理に関するガイドをご覧ください。