ベース モジュールの設定

ほとんどのアプリ プロジェクトでは、Android App Bundle をサポートするのにそれほど労力はかかりません。Android Studio で新しいアプリ プロジェクトを作成する際に、アプリのベース APK 用のコードとリソースを含むモジュールが標準のアプリ モジュールとしてデフォルトで生成されるからです。つまり、下記のアプリ プラグインを build.gradle ファイルに適用するモジュールで、アプリの基本的な機能のコードとリソースが提供されます。

// The standard application plugin creates your app's base module.
apply plugin: 'com.android.application'

アプリの初回ダウンロード サイズを削減したい場合、このモジュール内のコードとリソースはすべて、アプリのベース APK に含まれていることに注意してください。

ベース モジュールには、アプリの中心的な機能に加え、アプリ プロジェクト全体に影響するビルド構成やマニフェスト エントリの多くも含まれます。たとえば、App Bundle の署名はベース モジュールに指定する情報によって判断されます。また、アプリのすべての APK のバージョニングは、ベース モジュールのマニフェストの versionCode 属性で指定されます。ベース モジュールのその他の重要な点については、下記で説明します。

ベース モジュールのマニフェスト

アプリのベース モジュールのマニフェストは、他のアプリ モジュールのマニフェストと同様です。Google Play がアプリのベース APK を生成する際、すべてのモジュールのマニフェストがベース APK のマニフェストに統合されます。したがって、アプリ プロジェクトに機能モジュールを追加することを検討している場合は、ベース APK のマニフェストについて以下の点に留意する必要があります。

  • ベース APK は常に最初にインストールされるので、アプリのメインのエントリ ポイントをベース APK で提供する必要があります。つまり、次のようなインテント フィルタを含むアクティビティを宣言する必要があります。

    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    
  • ダウンロードしたモジュールのコードとリソースにアクセスできるようにするには、SplitCompat ライブラリのサポートをマニフェストに含める必要があります。詳細については、ダウンロードしたモジュールのコードとリソースにアクセスする方法をご覧ください。

  • 同様に、Android 6.0(API レベル 23)以下を搭載するデバイスでは、プラットフォームが新しいマニフェストのエントリを適用する前に、アプリを再起動する必要があります。したがって、機能モジュールをダウンロードした直後に特定の権限またはサービスが必要になる場合は、それらをベース モジュールのマニフェストに含めることを検討してください。

  • Android App Bundle には圧縮されていないネイティブ ライブラリのサポートが含まれています。Android Gradle プラグイン 3.6.0 以上を使用してアプリをビルドすると、ユーザーのディスク使用量を削減するために、プラグインはデフォルトでベース モジュールのマニフェストで次のように設定されます。

    <application
        android:extractNativeLibs="false"
        ... >
    

ベース モジュールのビルド構成

ほとんどの既存のアプリ プロジェクトでは、ベース モジュールのビルド構成に変更を加える必要はありません。ただし、アプリ プロジェクトに機能モジュールを追加することを検討している場合は、ベース モジュールのビルド構成について以下の点に留意する必要があります。

  • アプリの署名: コマンドラインから App Bundle をビルドする場合を除き、ビルド構成ファイルに署名情報を含める必要はありません。それでも署名情報を含める場合は、ベース モジュールのビルド構成ファイルにのみ含めます。詳しくは、Gradle を設定してアプリに署名する場合についての説明をご覧ください。
  • コードの圧縮: アプリ プロジェクト全体で(機能モジュールも含めて)コードの圧縮を有効にする場合は、ベース モジュールの build.gradle ファイルで有効にする必要があります。つまり、機能モジュールにカスタム ProGuard ルールを含めることはできますが、機能モジュールのビルド構成内の minifyEnabled プロパティは無視されます。
  • splits ブロックは無視される: App Bundle をビルドする際、android.splits ブロック内のプロパティは Gradle に無視されます。どのタイプの設定 APK を App Bundle がサポートするかを管理したい場合、代わりに android.bundle を使用して設定 APK のタイプを無効にします。
  • アプリのバージョニング: アプリ プロジェクト全体のバージョン コードとバージョン名は、ベース モジュールによって決まります。詳しくは、アプリの更新を管理する方法についての説明をご覧ください。

設定 APK のタイプを無効にするまたは再度有効にする

デフォルトでは、App Bundle をビルドすると、言語リソース、画面密度リソース、ABI ライブラリの各セットの設定 APK の生成がサポートされます。下記に示すように、ベース モジュールの build.gradle ファイルの android.bundle ブロックを使用して、設定 APK のタイプごとにそのサポートを無効にすることができます。

android {
    // When building Android App Bundles, the splits block is ignored.
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

アプリの更新を管理する

Android App Bundle では、Google Play にアップロードする複数の APK のバージョン コードを管理する必要がなくなりました。下記に示すように、アプリのベース モジュールのバージョン コードを 1 つ管理するだけで済みます。

// In your base module build.gradle file
android {
    defaultConfig {
        …
        // You specify your app’s version code only in the base module.
        versionCode 5
        versionName "1.0"
    }
}

App Bundle をアップロードすると、Google Play がベース モジュール内のバージョン コードを使って、そのバンドルから生成されるすべての APK に同じバージョン コードを割り当てます。それにより、デバイスにアプリがダウンロード、インストールされると、そのアプリの分割 APK はすべて同じバージョン コードを共有します。

新しいコードやリソースを含めてアプリを更新する際は、アプリのベース モジュールのバージョン コードを更新して、新たに App Bundle 全体をビルドする必要があります。その App Bundle を Google Play にアップロードすると、ベース モジュールが指定するバージョン コードに基づいて APK の新しいセットが生成されます。その後で、ユーザーがアプリを更新すると、そのデバイスに現在インストールされているすべての APK の更新版が Google Play から配信されます。それによって、インストールされているすべての APK が新しいバージョン コードに更新されます。

追加の設定 APK をダウンロードする

上記の更新フローにおける例外のひとつは、インストールされているアプリが追加の設定 APK を必要とする場合です。アプリをダウンロードした後に、ユーザーがデフォルトのシステム言語を変更した場合を考えます。アプリがその言語をサポートしていれば、その言語リソース用の追加の設定 APK がデバイスから Google Play にリクエストされ、ダウンロードされます。ただし、アプリのこうした更新方法では、バージョン コードが変更されないので、そのデバイスは必要とする設定 APK だけをダウンロード、インストールします。