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

Android App Bundle について

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

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

最適化された APK を配信できる App Bundle をビルドするのは、ほとんどの場合それほど難しくはありません。たとえば、確立された手法に沿ってすでにアプリのコードとリソースを構成している場合、Android Studio またはコマンドラインを使用して、署名済みの Android App Bundle をビルドし、Google Play にアップロードするだけです。これにより、最適化された APK からおのずとメリットがもたらされます。

App Bundle 形式でアプリを公開する場合は、必要に応じて Play Feature Delivery を利用することもできます。これにより、アプリ プロジェクトに機能モジュールを追加できます。このモジュールには、アプリが最初にダウンロード、インストールされるときには含めないことにした機能やリソースを含めます。後でアプリ側から Play Core Library を使用して、このモジュールをダウンロードするようにリクエストできます。それによって、そのモジュールのコードとリソースのみが、Google Play からデバイスに配信されます。

App Bundle を使用してアプリを公開しているゲーム デベロッパーは、Play Asset Delivery を使用できます。これは、大量のゲームアセットを配信するための GooglePlay のソリューションであり、デベロッパーに柔軟な配信方法と高いパフォーマンスを提供します。

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

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

Android Studio 3.2 以上を使用する場合は、数回クリックするだけで Android App Bundle をビルドできます。

このページでは、Android App Bundle のビルド手順と App Bundle に関する重要な概念について説明します。

始める

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

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

App Bundle をビルドする手順は次のとおりです。

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

  2. Play Feature Delivery のサポートを追加する。具体的には、ベース モジュールを組み込み、設定 APK のコードとリソースを整理し、必要に応じて機能モジュールを追加します。

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

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

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

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

Asset Pack を含めて App Bundle を作成する方法は、Play Asset 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 をビルドする、またはアプリを配信する際の既知の問題は次のとおりです。ここに記載されていない問題が発生した場合は、バグを報告してください。

  • サイドローディングされたアプリ(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 は 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 を追加する方法について詳しくは、Play 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 のルートに再配置されます。

分割 APK の概要

最適化されたアプリケーションを提供するための基本的なコンポーネントは、Android 5.0(API レベル 21)以上で利用できる分割 APK のメカニズムです。分割 APK は通常の APK と非常に類似しており、コンパイルされた DEX バイトコード、リソース、Android マニフェストが含まれています。ただし、Android プラットフォームでは、インストールされている複数の分割 APK を 1 つのアプリとして扱うことができます。つまり、共通のコードやリソースにアクセスできる複数の分割 APK をインストールし、1 つのインストール済みアプリとしてデバイスに表示できます。

分割 APK のメリットは、モノリシック APK(アプリがサポートするすべての機能とデバイス構成用のコードとリソースを含む APK)を小さな個別のパッケージに分割して、必要に応じてユーザーのデバイスにインストールできることです。

たとえば、ある分割 APK に少数のユーザーだけが必要とする追加機能のコードとリソースを含め、一方で別の分割 APK には特定の言語や画面密度専用のリソースを含めることが考えられます。こうした各分割 APK は、ユーザーがリクエストしたとき、またはデバイスが必要としたときにダウンロード、インストールされます。

以下では、さまざまなタイプの APK について説明します。これらの APK をまとめてデバイスにインストールして、アプリのフル機能を構成できます。こうした APK をサポートするアプリ プロジェクトの構成方法については、このページの後半のセクションで説明します。

  • ベース APK: この APK は、他のすべての分割 APK からアクセスできるコードとリソースを備え、アプリの基本機能を提供します。ユーザーがアプリのダウンロードをリクエストすると、この APK が最初にダウンロード、インストールされます。ベース APK のマニフェストにのみ、アプリのサービス、コンテンツ プロバイダ、権限、プラットフォームのバージョン要件、システム機能に対する依存関係が完全に記述されているためです。Google Play がプロジェクトのアプリ モジュール(またはベース モジュール)からアプリのベース APK を生成します。アプリの初回ダウンロード サイズの削減について検討する場合は、このモジュール内のコードとリソースはすべて、アプリのベース APK に含まれている点に留意することが重要です。
  • 構成 APK: これらの各 APK には、特定の画面密度、CPU アーキテクチャ、または言語用のネイティブ ライブラリとリソースが含まれます。ユーザーがアプリをダウンロードすると、ユーザーのデバイスを対象とする構成 APK のみがダウンロード、インストールされます。各構成 APK はベース APK または機能モジュール APK の依存関係です。そのため、構成 APK はコードとリソースを提供する APK とともにダウンロード、インストールされます。ベース モジュールおよび機能モジュールとは異なり、構成 APK 用には個別のモジュールは作成しません。標準的な方法でベース モジュールと機能モジュールに構成固有の代替リソースを作成する場合は、Google Play が自動的に構成 APK を生成します
  • 機能モジュール APK: これらの各 APK には、機能モジュールを使用してモジュール化したアプリの各機能のコードとリソースが含まれます。次に、その機能をデバイスにダウンロードするタイミングと方法をカスタマイズできます。たとえば、Play Core Library を使用すると、ベース APK をデバイスにインストールした後、オンデマンドで機能をインストールして、ユーザーに追加の機能を提供できます。たとえばあるチャットアプリで、写真を撮って送信する機能を、ユーザーがリクエストする場合にのみ、ダウンロードしてインストールすることを考えます。機能モジュールはインストール時には利用できないという可能性もあるため、共通で使用するコードやリソースはベース APK に格納する必要があります。つまり、機能モジュールでは、インストール時にベース APK のコードとリソースのみが使用可能であることを想定する必要があります。アプリの機能モジュール APK は、プロジェクトの機能モジュールから Google Play によって生成されます。

機能モジュールが 3 つあり、複数のデバイス設定をサポートしているアプリについて考えます。以下の図 1 に、このアプリのさまざまな APK の依存関係ツリーを示します。ベース APK がツリーのルートを形成し、その他の APK はすべてベース APK に依存します(これらの APK のモジュールが Android App Bundle でどのように表されるのかについて関心をお持ちの場合は、Android App Bundle 形式をご覧ください)。

ベース APK はツリーのルートを形成し、機能モジュール APK はベース APK に依存します。依存関係ツリーのリーフノードを形成する設定 APK には、ベース APK とそれぞれの機能モジュール APK のデバイス設定に応じたコードとリソースが含まれます。

図 1.分割 APK を使用して配信されるアプリの依存関係ツリー

これらの APK をご自分でビルドする必要はありません。Android Studio でビルドした署名済みの 1 つの App Bundle から、Google Play が APK をビルドします。App Bundle 形式とそのビルド方法について詳しくは、Android App Bundle のビルド、デプロイ、アップロードをご覧ください。

Android 4.4(API レベル 19)以前を搭載するデバイス

Android 4.4(API レベル 19)以前を搭載するデバイスは、分割 APK のダウンロードとインストールに対応していないため、代わりに Google Play がデバイスに単一の APK を配信します。これは、「マルチ APK」と呼ばれ、デバイスの構成に合わせて最適化されています。このマルチ APK がアプリのフル機能を表しますが、他の画面密度や CPU アーキテクチャ用のコードとリソースなどの不要なものは含まれません。

ただし、マルチ APK には、アプリがサポートするすべての言語のリソースが含まれます。それによって、たとえばユーザーがアプリの使用言語の設定を変更しても、別のマルチ APK をダウンロードする必要はありません。

マルチ APK には機能モジュールを後からオンデマンドでダウンロードする機能はありません。この APK に機能モジュールを含めるには、機能モジュールの作成時に、オンデマンドを無効にするか、融合を有効にする必要があります。

App Bundle を使用すると、アプリがサポートするデバイス設定ごとに APK のビルド、署名、アップロード、管理を行う必要がなくなります。アプリ全体で 1 つの App Bundle をビルドし、アップロードするだけで、後は Google Play に任せることができます。したがって、Android 4.4 以前を搭載するデバイスをサポートする計画の有無を問わず、Google Play がデベロッパーとユーザーの両方にとって、柔軟な配信メカニズムを提供します。

参考情報

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

サンプル

コードラボ

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

ブログ投稿

動画