6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

Android App Bundle に対応できるように Instant App を移行する

Android Instant App モジュールに対して、サポート終了済みの機能 Android Gradle プラグイン(com.android.feature)を依然として使用している場合は、ベースアプリ プラグイン(com.android.application)と動的機能プラグイン(com.android.dynamic-feature)を使用するように移行する必要があります。

Android Gradle プラグイン 3.3.0 以降の場合、ベースアプリ プラグインに Instant 版アプリのサポートが含まれています。そのため、ベースアプリ モジュールが Instant 版アプリの要件を満たしていれば、自動的に Instant 版アプリのメリットが得ることができます。そのうえで、動的機能プラグインを使用することで、ユーザーがオンデマンドでダウンロードできる追加機能を Instant 版アプリに組み込むことができます。このセットアップにより、単一のプロジェクトからインストール版アプリと Instant App 版アプリの両方を簡単にサポートできるようになり、Android App Bundle を使用して公開することで得られるメリットを享受できるようになります。

移行先のプラグインを次の表に示します。

モジュールの説明 古いプラグイン 現在のプラグイン
インストール版アプリや Instant App 版アプリの基本的なコード、リソース、機能を格納しているモジュール com.android.featurebaseFeature = true に設定) com.android.application

注: このモジュールには、アプリを Android App Bundle や APK としてビルドしてパッケージ化するために必要なすべてのマニフェストと署名情報が含まれています。

ユーザーがオンデマンドでダウンロードできるモジュール式追加機能 com.android.feature com.android.dynamic-feature(モジュールのマニフェストで dist:instant="true"dist:onDemand="false" に設定)
インストール版アプリでのみ利用できる機能のコードとリソース com.android.application com.android.dynamic-feature(モジュールのマニフェストで dist:instant="false"dist:onDemand="false" に設定)

このページでは、既存の Instant App プロジェクトを移行して、Instant 対応 Android App Bundle をビルドする方法について説明します。また、Instant 対応 Android App Bundle をビルド、テスト、公開する方法についても説明します。

アプリの Instant 版を新しく作成する場合は、Instant 対応動的機能モジュールを作成するをご覧ください。

変更点について理解する

旧式のプラグインに代わって動的機能プラグインを使用するようにプロジェクトを移行する際、Android App Bundle は、アプリをビルド、公開するための新しい方法をサポートしています。これにより、最適化された APK をユーザーに向けて配信する手順が大幅に簡素化されます。

App Bundle は、アップロードするアプリのコンパイル済みコードとリソースをすべてパッケージ化して配信を簡素化します。ただし、APK の生成と署名は Google Play で行います。そして、Google Play の新しいアプリ配信モデルである「Dynamic Delivery」が、App Bundle を使用して、個々のユーザーのデバイス構成に合わせて最適化した APK を生成、配信します。そのため、各ユーザーは、アプリの実行に必要なコードとリソースをダウンロードするだけで済みます。これにより、デベロッパー側では、多様なデバイスをサポートするために複数の APK を生成、署名、管理する必要がなくなり、ユーザー側では、サイズの小さい最適化された APK をダウンロードできるようになります。

以前は、機能プラグイン(現在はサポート終了済み)を使用する場合、Instant App をビルドするには、Instant App モジュールを含むすべてのモジュールが共有するコードとリソースを格納したベース機能モジュールを作成する必要がありました。残りのコードは、Instant 版アプリのエントリ ポイントを含む複数の非ベース機能モジュールに格納されていました。また、インストール版アプリにのみ必要なコードとアクティビティを含む個別のアプリ モジュールをプロジェクト内に含める必要がありました。

Android App Bundle に対応できるようにアプリを移行すると、アプリ モジュールがベース モジュールの役割を担うようになります。そして、インストール版アプリ用や Instant 版アプリ用の追加機能を動的機能モジュールとして整理します。つまり、以降後の Instant App プロジェクトは標準的なアプリ プロジェクトによく似た形式になり、Instant 対応のベース モジュールに、Instant 版用の追加モジュールを組み合わせていくことになります。

既存の Instant App プロジェクトを移行し、Android App Bundle の最適化配信モデルを採用する手順については、下記のセクションをご覧ください。

ベース機能モジュールをアプリ モジュールに変換する

ベース機能モジュールの build.gradle ファイルを編集してから、メインアプリ モジュールに変換します。

  1. baseFeature true 行を削除します。
  2. feature 依存関係構成または application 依存関係構成を使用する依存関係をすべて削除します。

    dependencies {
          ...
          // delete any lines that look like
          // feature project(":foo")
          // feature project(":bar")
          // application project(":app")
        }
        
  3. applicationId を現在の com.android.application モジュールから com.android.feature モジュールに移動します。また、ベースアプリ モジュール内に含める他のビルド スクリプト構成も一緒に移動します。下記の例をご覧ください。このステップは、build.gradle セットアップによっては、以前のアプリ モジュールから build.gradleandroid ブロックをコピーして、新しいアプリ モジュールの build.gradle ファイルに貼り付ける方が簡単な場合もあります。ただし、この方法を行う際には注意が必要です。

    android {
            ...
            defaultConfig {
                // You need to move the application ID from the app module
                // to your feature module.
                applicationId "com.example.myapp"
                …
            }
            // Some additional build configurations you might want to
            // copy from your current ‘app’ module may include ProGuard
            // rules and code shrinking settings.
            buildTypes {
                release {
                    minifyEnabled true
                    proguardFiles getDefaultProguardFile(
                      'proguard-android-optimize.txt'),
                      'proguard-rules.pro'
                }
            }
        }
        
  4. 適切なバンドル配信タグをマニフェストに追加することで、機能モジュールを Instant 対応としてマーキングします。以下の例をご覧ください。

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
            <dist:module dist:instant="true" />
            ...
        </manifest>
        
  5. プラグインのタイプを com.android.application に変更することで、機能モジュールをベースアプリ モジュールに変換します。

    // Replace  "apply plugin: 'com.android.feature'"
        // with the following
        apply plugin: 'com.android.application'
        

古いアプリ モジュールをインストール時動的機能モジュールに変換する

古いアプリ モジュール内にコードやリソースが含まれていない場合は、そのまま削除して構いません(前のセクションで説明した手順に沿って、機能モジュールをアプリのベースアプリ モジュールに変換するだけで済みます)。

他方、古いアプリ モジュール内に、アプリのインストール時にユーザーが利用できる機能を実現するためのコードやリソースが含まれている場合は、このセクションの手順に沿って、アプリ モジュールを動的機能モジュールに変換してください。

動的機能モジュールを作成するには、プラグインのタイプを com.android.application から com.android.dynamic-feature に変更したうえで、build.gradle に対して次のような変更を加えます。

  1. プラグインのタイプを com.android.application から com.android.dynamic-feature に変更します。

    // Replace "apply plugin: 'com.android.application'"
        // with the following:
        apply plugin: 'com.android.dynamic-feature'
        
  2. 前のセクションで説明したように、applicationId ルールや proguardFiles ルールなど、com.android.application プラグインが必要とするビルド構成を、ベースアプリ モジュールに移動しているか確認します。

  3. 下記の手順に沿って、モジュールの名前を「installed_feature」などに変更します。

    1. メニューバーから [View] > [Tool Windows] > [Project] を選択して、[Project] パネルを開きます。
    2. 動的機能モジュールを右クリックして、[Refactor] > [Rename] を選択します。
    3. 表示されたダイアログで、[Rename module] を選択して、[OK] をクリックします。
    4. モジュールの新しい名前を入力して、[OK] をクリックします。
  4. ステップ 3 と同様に、前のセクションで作成した新しいアプリ モジュールの名前を「app」などに変更します。

  5. 動的機能モジュールの build.gradle ファイル内の「app」モジュールに実装依存関係を追加します。以下の例をご覧ください。

    dependencies {
          ...
          // In the dynamic feature module, add an implementation dependency
          // on the base app module.
          implementation project(":app")
        }
        
  6. 動的機能を新しいアプリ モジュールの build.gradle ファイルに追加します。

    android {
          ...
          // In the base app module, specify each dynamic feature module.
          dynamicFeatures = [":installed_feature"]
        }
        
  7. 動的機能モジュールのマニフェストに対し、適切なバンドル配信タグを追加することで、動的機能モジュールをインストール可能モジュールとしてマーキングします。

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
            <dist:module dist:instant="false" dist:onDemand="false"
                    dist:title="@string/title_dynamic_feature">
                <dist:fusing dist:include="true" />
            </dist:module>
            ...
        </manifest>
        

他の機能モジュールを Instant 対応動的機能モジュールに変換する

アプリの追加機能を複数の機能モジュールにモジュール化していた場合は、このセクションの手順に沿って、Instant 対応動的機能モジュールに変換します。

プロジェクト内に残っているすべての機能モジュールに関して、以下の手順に沿って、それぞれ Instant 対応動的機能に変換してください。

  1. build.gradle ファイル内のプラグインのタイプを com.android.dynamic-feature に変更します。以下の例をご覧ください。

    // Replace'com.android.feature' with 'com.android.dynamic-feature'.
        apply plugin: 'com.android.dynamic-feature'
        
  2. マニフェストに以下を追加することで、各動的機能モジュールを Instant 対応としてマーキングします。

    <manifest ... xmlns:dist="http://schemas.android.com/apk/distribution">
            <dist:module dist:instant="true" dist:onDemand="false"
                    dist:title="@string/title_dynamic_feature">
                <dist:fusing dist:include="true" />
            </dist:module>
            ...
        </manifest>
        
  3. 新しいアプリ モジュールの build.gradle ファイルに動的機能を追加します。このファイルの動的機能のリストには、以前 installed_feature を追加済みです。

    android {
          ...
          dynamicFeatures = [":installed_feature", ":feature_1", ":feature_2"]
          // or whichever name exists for the instant enabled dynamic features
        }
        

新しい Instant 対応 App Bundle をビルド、テスト、公開する

このページの手順を完了すると、プロジェクトは、Android App Bundle という単一のアーティファクトを生成できるようになります。Android App Bundle を使用することで、インストール版アプリと Instant 版アプリの両方を Google Play Console に公開し、それぞれ個別にインストール版トラックと Instant 版トラックにロールアウトできます。また、App Bundle を使用すると、各ユーザーのデバイス構成に合わせて最適化された APK を配信する Dynamic Delivery を利用できるため、ユーザーはアプリの実行に必要なコードとリソースをダウンロードするだけで済みます。これにより、デベロッパー側では、多様なデバイスをサポートするために複数の APK を生成、署名、管理する必要がなくなり、ユーザー側では、サイズの小さい最適化された APK をダウンロードできるようになります。

Instant 対応 App Bundle のビルドとテストを開始する場合は、App Bundle をビルドするをご覧ください。