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.feature (baseFeature = 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
ファイルを編集してから、メインアプリ モジュールに変換します。
baseFeature true
行を削除します。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")) }
applicationId
を現在のcom.android.application
モジュールからcom.android.feature
モジュールに移動します。また、ベースアプリ モジュール内に含める他のビルド スクリプト構成も一緒に移動します。下記の例をご覧ください。このステップは、build.gradle
のセットアップによっては、以前のアプリ モジュールからbuild.gradle
のandroid
ブロックをコピーして、新しいアプリ モジュールの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" ) } } }
適切なバンドル配信タグをマニフェストに追加することで、機能モジュールを Instant 対応としてマークします。以下の例をご覧ください。
<manifest ... xmlns:dist="http://schemas.android.com/apk/distribution"> <dist:module dist:instant="true" /> ... </manifest>
プラグインのタイプを
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
を次のように変更します。
プラグインのタイプを
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") }
前のセクションで説明したように、
applicationId
ルールやproguardFiles
ルールなど、com.android.application
プラグインが必要とするビルド構成を、ベースアプリ モジュールに移動したかどうか確認します。下記の手順に沿って、モジュールの名前を「installed_feature」などに変更します。
- メニューバーから [View] > [Tool Windows] > [Project] を選択して、[Project] パネルを開きます。
- 機能モジュールを右クリックして、[Refactor] > [Rename] を選択します。
- 表示されたダイアログで、[Rename module] を選択して、[OK] をクリックします。
- モジュールの新しい名前を入力して、[OK] をクリックします。
ステップ 3 と同様に、前のセクションで作成した新しいアプリ モジュールの名前を「app」などに変更します。
機能モジュールの
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")) }
その機能を新しいアプリ モジュールの
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")) }
機能モジュールのマニフェスト内に、適切なバンドル配信タグを追加することで、機能モジュールをインストール可能モジュールとしてマークします。
<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 対応機能に変換してください。
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") }
マニフェストに以下を追加することで、各機能モジュールを 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>
新しいアプリ モジュールの
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 をビルドするをご覧ください。