Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

Android App Bundle について

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

Google Play は App Bundle から、デバイス設定ごとに最適化した APK を生成、配信します。それによって、個々のデバイスでアプリを実行するのに必要なコードとリソースだけがダウンロードされます。デベロッパー側では、多様なデバイスのサポートを最適化するために複数の APK をビルド、署名、管理する必要がなくなり、ユーザー側では、よりサイズが小さく、最適化された APK をダウンロードできるようになります。

また、「動的機能モジュール」をアプリ プロジェクトに追加して、App Bundle に組み込むこともできます。このモジュールには、アプリが最初にダウンロード、インストールされるときには含めないことにした機能やアセットを含めます。後でアプリ側から Play Core Library を使用して、このモジュールをダウンロードするようにリクエストできます。それによって、そのモジュールのコードとリソースのみ、Google Play からデバイスに配信されます。これを、圧縮しないネイティブ ライブラリのサポートと組み合わせれば、ゲームなどの大きなアプリでも、ストレージ要件を軽減でき、ユーザー維持率の向上をはかることができます。

Android App Bundle を使用したアプリの公開が推奨される理由について、次の動画をご覧ください。

Android App Bundle を使用した圧縮ダウンロード サイズの制限は 150 MB になりました。App Bundle と APK 拡張ファイルの併用はできません。

Android Studio 3.2 以上を使用する場合は、数回クリックするだけで 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 に公開する

Asset Pack を含めて App Bundle を作成する方法は、Dynamic Asset Delivery についてをご覧ください。

Android App Bundle の形式

Android App Bundle は 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 つの動的機能モジュール、2 つの Asset Pack が含まれる Android App Bundle のコンテンツ

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

  • base/、feature1/、feature2/: これらの最上位ディレクトリは、アプリの各種モジュールを表します。アプリのベース モジュールは常に App Bundle の base ディレクトリにあります。ただし、各動的機能モジュールのディレクトリは、そのモジュールのマニフェストの split 属性で指定された名前になります。詳細については、動的機能モジュールのマニフェストをご覧ください。
  • asset_pack_1/、asset_pack_2/: グラフィックを多用する大型のアプリやゲームの場合、アセットを Asset Pack にモジュール化することができます。Asset Pack はサイズの上限が大きいのでゲームに最適です。各 Asset Pack をいつ、どのようにデバイスにダウンロードするかは、インストール時、高速フォロー、オンデマンドの 3 つの配信モードによってカスタマイズできます。Asset Pack はすべて Google Play でホストされ、配信されます。App Bundle に Asset Pack を追加する方法については詳しくは、Dynamic Asset Delivery についてをご覧ください。
  • 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 をビルドできます。次に、App Bundle を Play Console にアップロードし、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 にInstant 版を追加できます。各種 Instant 版のサイズ制限について詳しくは、Google Play Instant の概要をご覧ください。

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

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

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

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

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

既知の問題

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

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

参考情報

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

サンプル

コードラボ

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

ブログ投稿

動画