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 の新しいアプリ配信モデルが、App Bundle を使用して、個々のユーザーのデバイス設定に合わせて最適化された APK を生成、配信するので、ユーザーは、アプリの実行に必要なコードとリソースをダウンロードするだけで済みます。これにより、デベロッパー側では、多様なデバイスをサポートするために複数の APK をビルド、署名、管理する必要がなくなり、ユーザー側では、サイズの小さい最適化された APK をダウンロードできるようになります。

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

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

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

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

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

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

    Groovy

    dependencies {
        ...
        // delete any lines that look like
        // feature project(":foo")
        // feature project(":bar")
        // application project(":app")
    }
    

    Kotlin

    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 ファイルに貼り付ける方が簡単な場合もあります。ただし、この方法は慎重に行ってください。

    Groovy

    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'
            }
        }
    }
    

    Kotlin

    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 {
            getByName("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 に変更することで、機能モジュールをベースアプリ モジュールに変換します。

    Groovy

    // Replace  "plugins { id 'com.android.feature' }"
    // with the following
    plugins {
      id 'com.android.application'
    }
    

    Kotlin

    // Replace  "plugins { id("com.android.feature") }"
    // with the following
    plugins {
        id("com.android.application")
    }
    

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

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

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

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

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

    Groovy

    // Replace "plugins { id 'com.android.feature' }"
    // with the following:
    plugins {
      id 'com.android.dynamic-feature'
    }
    

    Kotlin

    // Replace "plugins { id("com.android.application") }"
    // with the following:
    plugins {
        id("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」モジュールに実装依存関係を追加します。以下の例をご覧ください。

    Groovy

    dependencies {
        ...
        // In the feature module, add an implementation dependency
        // on the base app module.
        implementation project(":app")
    }
    

    Kotlin

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

    Groovy

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures = [":installed_feature"]
    }
    

    Kotlin

    android {
        ...
        // In the base app module, specify each feature module.
        dynamicFeatures.addAll(listOf(":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 に変更します。以下の例をご覧ください。

    Groovy

    // Replace 'com.android.feature' with 'com.android.dynamic-feature'
    plugins {
      id 'com.android.dynamic-feature'
    }
    

    Kotlin

    // Replace "com.android.feature" with "com.android.dynamic-feature"
    plugins {
        id("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 を追加済みです。

    Groovy

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

    Kotlin

    android {
       ...
       dynamicFeatures.addAll(listOf(":installed_feature", ":feature_1", ":feature_2"))
       // or whichever name exists for the instant enabled feature module
    }
    

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

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

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