Android 11 デベロッパー プレビュー 2 が公開されました。ぜひお試しのうえ、フィードバックをお寄せください

Android App Bundle について

Android App Bundle は、アプリのコンパイル済みコードとリソースをすべて含む新しいアップロード形式です。ただし、APK の生成と署名は Google Play で行います。

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

また、アプリ プロジェクトに動的機能モジュールを追加して、App Bundle に組み込むこともできます。ユーザーが最初にアプリをダウンロードしてインストールするときに、使用しないことを選択した機能やアセットが、モジュールには含まれています。Play Core ライブラリを使用して、後でアプリ側からモジュールを動的機能 APK としてダウンロードするようにリクエストできます。すると、Google Play は Dynamic Delivery を通じて、そのモジュールのコードとリソースのみをデバイスに提供します。

Android App Bundle を使用してアプリをアップロードすることが推奨される理由については、次の動画をご覧ください。

Android App Bundle で公開すると、APK 拡張ファイルを使用しなくてもアプリのサイズ制限が 150 MB に増えます。この制限が適用されるのは、公開サイズではなく実際のダウンロード サイズのみです。そのため、ユーザーは 150 MB のアプリをダウンロードでき、Dynamic Delivery によって、この容量はすべアプリの実行に必要なコードとリソースのみに使用されます。非圧縮ネイティブ ライブラリのサポートと組み合わせれば、ゲームなどの大きなアプリでも、ディスク使用量を軽減でき、ユーザー維持率の向上をはかることができます。

Android Studio 3.2 以降を使用している場合、ほとんどのアプリ プロジェクトで簡単に Dynamic Delivery のサポートを追加でき、数回のクリックだけで Android App Bundle を作成できます。ただし、動的機能モジュールを追加するには、もう少し手間がかかり、アプリのリファクタリングが必要になる場合があります。

このページでは、Android App Bundle の作成手順と App Bundle および Dynamic Delivery に関する重要な概念について説明します。

スタートガイド

App Bundle を作成して Dynamic Delivery をサポートする手順は次のとおりです。

  1. Android Studio 3.2 以降をダウンロードする。動的機能モジュールを追加して App Bundle を作成する最も簡単な方法です。

  2. Dynamic Delivery のサポートを追加する。具体的には、基本モジュールを組み込み、設定 APK のコードとリソースを整理し、任意で動的機能モジュールを追加します。

  3. Android Studio を使用して Android App Bundle を作成する。また、実行 / デバッグ構成を変更し、App Bundle から APK をデプロイするオプションを選択して、アプリを App Bundle から接続デバイスにデプロイすることもできます。このオプションを使用すると、APK のみをビルドおよびデプロイする場合と比較して、ビルド時間が長くなることに注意してください。

  4. Android App Bundle をテストする。App Bundle を使用して、デバイスにデプロイする APK を生成します。

  5. Google Play アプリ署名に登録する。登録しないと、Play Console に App Bundle をアップロードできません。

  6. App Bundle を Google Play に公開する

Android App Bundle 形式

Android App Bundle は、Dynamic Delivery をサポートするために Google Play にアップロードするファイル(ファイル拡張子は .aab)です。

App Bundle は、図 1 に示すように、アプリのコードとリソースをモジュールにまとめる署名付きバイナリです。各モジュールのコードとリソースは APK に含まれるものと同様に構成されています。これらの各モジュールは、個別の APK として生成される場合もあるためです。Google Play は App Bundle を使用して、基本 APK、動的機能 APK、設定 APK、(分割 APK をサポートしないデバイスの場合)マルチ APK など、ユーザーに提供するさまざまな APK を生成します。青色のディレクトリ(drawable/values/lib/ ディレクトリなど)は、モジュールごとに設定 APK を作成するために Google Play が使用するコードとリソースを表します。

App Bundle は、それぞれがモジュールを表すディレクトリにアプリを整理します。各モジュール ディレクトリ内では、コードとリソースは一般的な APK と同様に構成されています。

図 1. 1 つの基本モジュールと 2 つの動的機能モジュールを含む Android App Bundle のコンテンツ。

以下に、App Bundle のファイルとディレクトリの一部について詳細を説明します。

  • base/、feature1/、feature2/: これらの最上位ディレクトリは、アプリの各種モジュールを表します。アプリの基本モジュールは常に App Bundle の base ディレクトリにあります。ただし、各動的機能モジュールのディレクトリは、モジュールのマニフェストの split 属性で指定された名前となっています。詳細については、動的機能モジュールのマニフェストをご覧ください。
  • BUNDLE-METADATA/: このディレクトリにはメタデータ ファイルが含まれています。このファイルには、ツールやアプリストアに役立つ情報が入っています。このようなメタデータ ファイルには、ProGuard マッピングとアプリの DEX ファイルの完全なリストが含まれる場合があります。このディレクトリ内のファイルは、アプリの APK にパッケージ化されません。
  • モジュール プロトコル バッファ(*.pb)ファイル: これらのファイルは、アプリストア(Google Play など)に対し、各アプリ モジュールのコンテンツを説明するメタデータを提供します。たとえば、BundleConfig.pb は App Bundle のビルドに使用されたビルドツールのバージョンなど、バンドル自体に関する情報を提供します。native.pbresources.pb は、各モジュールのコードとリソースについて説明します。これは、Google Play でさまざまなデバイス設定向けに APK を最適化する場合に役立ちます。
  • manifest/: APK とは異なり、App Bundle は各モジュールの AndroidManifest.xml ファイルをこの個別ディレクトリに保存します。
  • dex/: APK とは異なり、App Bundle は各モジュールの DEX ファイルをこの個別ディレクトリに保存します。
  • res/、lib/、assets/: これらのディレクトリは、一般的な APK のディレクトリと同じです。App Bundle をアップロードすると、Google Play はこれらのディレクトリを検査し、ファイルのパスを保存しながら、ターゲット デバイス設定を満たすファイルのみをパッケージ化します。
  • root/: このディレクトリには、このディレクトリが配置されているモジュールを含む APK のルートに後で再配置されるファイルが保存されます。たとえば、App Bundle の base/root/ ディレクトリには、Class.getResource() を使用してアプリが読み込む Java ベースのリソースが含まれることがあります。これらのファイルは、アプリの基本 APK および Google Play が生成するすべてのマルチ APK のルート ディレクトリに後で再配置されます。このディレクトリ内のパスも保持されます。つまり、ディレクトリとそのサブディレクトリも APK のルートに再配置されます。

Android App Bundle のビルドとデプロイ

App Bundle はデバイスにデプロイできない点で APK とは異なります。1 つのビルド アーティファクト内にアプリのコンパイル済みコードとリソースをすべて含むアップロード形式です。そのため、署名付き App Bundle をアップロードすると、Google Play にはアプリの APK をビルドして署名し、Dynamic Delivery を通じてユーザーに提供するために必要なものがすべて揃います。

Android Studio を使用している場合は、数回クリックするだけで署名済みの App Bundle としてプロジェクトをビルドできます。IDE を使用していない場合は、コマンドラインから App Bundle をビルドすることができます。その後、Play Console に App Bundle をアップロードするだけで、Dynamic Delivery でアプリをテストまたは公開できます。

App Bundle をテストする

Android App Bundle をビルドしたら、Google Play で App Bundle を使用して生成される APK と、デバイスにデプロイされた APK の動作をテストする必要があります。

App Bundle のテストには、次のいずれかの方法を使用します。

Play Core Library で動的機能モジュールをダウンロードする

アプリに動的機能が含まれている場合は、動的機能モジュールのダウンロードのリクエスト、監視、管理に Play Core Library を使用する必要があります。詳細については、Play Core Library でモジュールをダウンロードするをご覧ください。

ライブラリの実際の動作を確認するには、Play Core Library サンプルアプリをお試しください。

Instant Apps に関する注意事項

Android Studio 3.2 以降では、アプリのサイズが十分に小さければ、App Bundle にインスタント エクスペリエンスを追加できます。各種インスタント エクスペリエンスのサイズ制限の詳細については、Google Play Instant の概要をご覧ください。

圧縮ダウンロード サイズの制限

Android App Bundle を使用して公開すると、最小ダウンロード サイズでアプリをインストールできますが、圧縮ダウンロード サイズは 150 MB に制限されます。つまり、ユーザーがアプリをダウンロードする場合、アプリのインストールに必要な圧縮 APK の合計サイズ(基本 APK および設定 APK など)は 150 MB 以下にする必要があります。オンデマンドでの動的機能(およびその設定 APK)のダウンロードなど、後続のダウンロードも、この圧縮ダウンロード サイズの制限に従う必要があります。

App Bundle をアップロードしたときに、アプリやそのオンデマンド機能のダウンロードのいずれかが 150 MB を超えていることが Play Console で検出されると、エラーが発生します。

なお、Android App Bundle は APK 拡張(*.obb)ファイルに対応していません。そのため、App Bundle の公開時にこのエラーが発生した場合は、次のリソースのいずれかを使用して、圧縮 APK ダウンロード サイズを削減してください。

  • 必ず設定 APK ごとに enableSplit = true を設定して、すべての設定 APK を有効にします。これにより、ユーザーがデバイスでアプリを実行するために必要なコードとリソースのみをダウンロードするようになります。
  • 未使用のコードやリソースを削除してアプリを縮小します
  • おすすめの方法に従ってアプリのサイズを削減します
  • 一部のユーザーのみが使用する機能を動的機能モジュールに変換して、アプリが後でオンデマンドでダウンロードできるようにすることを検討します。アプリのリファクタリングが必要になる場合もありますので、先に説明したその他のヒントをまずお試しください。

既知の問題

Android App Bundle をビルドする、または Dynamic Delivery を使用してアプリを配信する際の既知の問題は次のとおりです。ここに記載されていない問題が発生した場合は、バグを報告してください。

  • リソース テーブルを動的に変更するツールを使用すると、App Bundle から生成された APK が予期しない動作をする場合があります。そのため、App Bundle をビルドする場合は、そのようなツールを無効にすることをおすすめします。
  • 動的機能モジュールのマニフェストでは、基本モジュールに存在しないリソースを参照しないでください。Google Play でアプリの基本 APK が生成されると、すべてのモジュールのマニフェストが基本 APK のマニフェストに統合されるためです。基本 APK のマニフェストが基本 APK に存在しないリソースを参照していると、リソースのリンクは壊れます。
  • Android Studio 3.2 Canary 14 現在、アプリの基本モジュールのビルド バリアントを変更しても、基本モジュールに依存する動的機能モジュールに対して同じビルド バリアントが自動的に選択されることはありません。そのため、アプリのビルド中にエラーが発生する場合があります。基本モジュールとそれに依存する他のモジュールに同じビルド バリアントを選択するようにしてください。
  • 現状では、動的機能モジュールのビルド構成に、基本(または他の)モジュールのプロパティと競合するプロパティを構成できてしまいます。たとえば、基本モジュールで buildTypes.release.debuggable = true を設定し、動的機能モジュールでは false に設定できます。このような競合が発生すると、ビルドとランタイムの問題が起こります。デフォルトでは、動的機能モジュールは基本モジュールから一部のビルド構成を継承します。したがって、動的機能モジュールのビルド構成で、保持する必要がある設定と省略すべき設定を把握しておいてください。
  • アプリのインストールには複数の APK(基本 APK とそのいくつかの設定 APK)のダウンロードが必要になることがあるため、アプリの APK を手動でデバイスに転送する(サイドローティングとも言う)場合は注意が必要です。そうしないと、コードやリソースが見つからないため、アプリでランタイムの問題が発生する可能性があります。
  • 現在のところ、Google Play では動的機能モジュールのすべてのコードとリソースが 1 つの APK に含まれています。近いうちに、Android 5.0(API レベル 21)以降のデバイスでは、設定 APK を使用するように配信が最適化されます。
  • 動的機能モジュールをダウンロードするには、デバイスに最新バージョンの Play ストア アプリがインストールされている必要があります。アプリに動的機能モジュールが含まれている場合、ごく一部のユーザーのダウンロードが、最適化された単一のマルチ APK にフォールバックする可能性があります。これは、Android 4.4(API レベル 20)以下が搭載されたデバイスのダウンロード エクスペリエンスと同じです。

参考情報

Android App Bundle の詳細については、次のリソースをご覧ください。

サンプル

コードラボ

  • 初めての Android App Bundle: Android App Bundle の基本原則を探り、Android Studio を使って独自のビルドをすぐに始める方法を示すコードラボです。 このコードラボでは、bundletool を使用した App Bundle のテスト方法についても説明します。
  • オンデマンド モジュール: オンデマンドで動的機能をダウンロード、インストールするアプリの作成方法について紹介します。

ブログ投稿

動画