bundletool

Android App Bundle をビルドした後は、Google Play でどのように使用されて APK が生成されるか、また APK がデバイスにデプロイされるとどのように動作するかをテストする必要があります。App Bundle をテストするには、2 つの方法が考えられます。bundletool コマンドライン ツールをローカルに使用する方法と、Play Console に App Bundle をアップロードしてテストトラックを使用することで Google Play でテストする方法です。このページでは、bundletool を使用して App Bundle をローカルにテストする方法について説明します。

bundletool は、Gradle、Android Studio、Google Play が Android App Bundle をビルドしたり、App Bundle を各種 APK に変換してデバイスにデプロイしたりする際に基盤となるツールです。bundletool はコマンドライン ツールとしても利用できるため、アプリの APK に対する Google Play のサーバー側のビルドを再作成、テスト、検証することが可能です。

Android App Bundle をビルドして署名するには、Android Studio と Android Plugin for Gradle を使用する必要があります。 ただし、IDE を使用しない場合(継続的なビルドサーバーを使用しているなどの理由で)、コマンドラインから App Bundle をビルドして、jarsigner を使って署名することもできます。

デフォルトでは、アプリをローカル デバイスにデプロイしてテストする際、IDE は App Bundle を使用しません。ただし、実行 / デバッグ構成を変更し、App Bundle から APK をデプロイする方法を選択することで、アプリの実行に及ぼす影響を確認できます。

bundletool をダウンロードする

まだダウンロードしていない場合は、GitHub リポジトリから bundletool をダウンロードしてください。

App Bundle から APK のセットを生成する

bundletool が App Bundle から生成する APK は、APK セット アーカイブと呼ばれるコンテナに格納されます。このアーカイブは .apks ファイル拡張子を使用します。アプリがサポートするすべてのデバイス設定に対する APK セットを App Bundle から生成するには、下記のように bundletool build-apks コマンドを使用します。

    bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

APK をデバイスにデプロイする場合、下記のコマンドのように、アプリの署名情報も含める必要があります。署名情報を指定しない場合、bundletool はデバッグ鍵を使用して APK の署名を試みます。

    bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    --ks=/MyApp/keystore.jks
    --ks-pass=file:/MyApp/keystore.pwd
    --ks-key-alias=MyKeyAlias
    --key-pass=file:/MyApp/key.pwd
    

下記の表で、bundletool build-apks コマンドを使用する際に設定できるさまざまなフラグとオプションについて説明します。--bundle--output のみが必須で、それ以外のフラグはすべて省略可能です。

フラグ 説明
--bundle=path (必須)Android Studio を使ってビルドした App Bundle へのパスを指定します。詳細については、プロジェクトのビルドをご覧ください。
--output=path (必須)出力する「.apks」ファイルの名前を指定します。これには、そのアプリのすべての APK アーティファクトが含まれます。このファイル内のアーティファクトをデバイス上でテストするには、接続されているデバイスに APK をデプロイする方法についてのセクションをご覧ください。
--overwrite --output オプションを使って指定したパスを持つ既存の出力ファイルを上書きする場合に、このフラグを指定します。このフラグを指定せず、出力ファイルがすでにある場合、ビルドエラーが発生します。
--aapt2=path AAPT2 へのカスタムパスを指定します。デフォルトで、bundletool には独自のバージョンの AAPT2 が含まれています。
--ks=path APK の署名に使用するデプロイ キーストアへのパスを指定します。このフラグは省略可能です。指定しない場合、bundletool はデバッグ署名鍵を使用して APK の署名を試みます。
--ks-pass=pass:password
または
--ks-pass=file:/path/to/file
キーストアのパスワードを指定します。パスワードを書式なしテキストで指定する場合は、pass: を付けます。パスワードが記載されているファイルへのパスを渡す場合は、file: を付けます。--ks-pass を指定せずに --ks フラグを使用してキーストアを指定する場合、コマンドラインからパスワードを入力するように bundletool から求められます。
--ks-key-alias=alias 使用する署名鍵のエイリアスを指定します。
--key-pass=pass:password
または
--key-pass=file:/path/to/file
署名鍵のパスワードを指定します。パスワードを書式なしテキストで指定する場合は、pass: を付けます。パスワードが記載されているファイルへのパスを渡す場合は、file: を付けます。

このパスワードがキーストアのパスワードと同じであれば、このフラグを省略できます。

--connected-device 接続されているデバイスの設定を対象とする APK をビルドするように bundletool に指示します。このフラグを指定しない場合、bundletool はアプリがサポートするすべてのデバイス設定を対象に APK を生成します。
--device-id=serial-number 接続されているデバイスが複数ある場合、アプリをデプロイするデバイスのシリアル ID をこのフラグで指定します。
--device-spec=spec_json 対象とするデバイス設定を指定する .json ファイルへのパスをこのフラグで指定します。詳細については、デバイス仕様の JSON ファイルを作成して使用する方法についてのセクションをご覧ください。
--mode=universal アプリがサポートするすべてのデバイス設定に APK が対応できるよう、アプリのコードとリソースをすべて含む単一の APK のみを bundletool でビルドする場合は、モードを universal に設定します。

注: bundletool は、マニフェストに <dist:fusing dist:include="true"/> の指定がある動的機能モジュールのみをユニバーサル APK に含めます。詳細については、動的機能モジュールのマニフェストをご覧ください。

こうした APK は特定のデバイス設定用に最適化された APK よりもサイズが大きくなることに注意する必要があります。ただし、複数のデバイス設定でアプリをテストする社内テスターとの共有などは簡単になります。

--local-testing ローカルテスト用の App Bundle を有効にするには、このフラグを使用します。ローカルテストでは、テストサイクルをすばやく繰り返し実行できます。しかも、Google Play サーバーへのアップロードが必要ありません。

--local-testing フラグを使用してモジュール インストールをテストする方法の例については、モジュール インストールをローカルでテストするをご覧ください。

接続されているデバイスに APK をデプロイする

APK のセットを生成した後、bundletool は、そのセットから APK の適切な組み合わせを、接続されているデバイスにデプロイできます。

たとえば Android 5.0(API レベル 21)以降を搭載しているデバイスが接続されている場合、bundletool はそのデバイスでアプリを実行するために必要な基本 APK、動的機能 APK、設定 APK をプッシュします。または、Android 4.4(API レベル 20)以下を搭載しているデバイスが接続されている場合、bundletool は互換性のあるマルチ APK を探して、そのデバイスにデプロイします。

APK セットからアプリをデプロイするには、下記のように install-apks コマンドを使用して、--apks=/path/to/apks フラグで APK セットのパスを指定します(複数のデバイスが接続されている場合、--device-id=serial-id フラグを追加して、対象のデバイスを指定します)。

    bundletool install-apks --apks=/MyApp/my_app.apks
    

デバイス固有の APK セットを生成する

アプリがサポートするすべてのデバイス設定に対する APK セットをビルドする代わりに、下記のように --connected-device オプションを使用して、接続されているデバイスの設定のみを対象とする APK をビルドできます(複数のデバイスが接続されている場合、--device-id=serial-id フラグを追加して、対象のデバイスを指定します)。

    bundletool build-apks --connected-device
    --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

デバイス仕様の JSON ファイルを生成して使用する

bundletool は JSON ファイルに指定されたデバイス設定を対象とする APK セットを生成できます。接続されているデバイスについて JSON ファイルを生成するには、次のコマンドを実行します。

    bundletool get-device-spec --output=/tmp/device-spec.json
    

bundletool はデバイスの JSON ファイルを、自身が置かれているディレクトリに作成します。次に下記のように、そのファイルを bundletool に渡して、その JSON ファイルに記載されている設定のみを対象とする APK セットを生成できます。

    bundletool build-apks --device-spec=/MyApp/pixel2.json
    --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
    

デバイス仕様の JSON を手動で作成する

APK セットをビルドする対象のデバイスにアクセスできない場合(たとえば、デベロッパーの手元にないデバイスで友だちがアプリを試そうとする場合)、次の形式に沿って JSON ファイルを手動で作成できます。

{
      "supportedAbis": ["arm64-v8a", "armeabi-v7a"],
      "supportedLocales": ["en", "fr"],
      "screenDensity": 640,
      "sdkVersion": 27
    }
    

その後、前述のように、この JSON を bundle extract-apks コマンドに渡すことができます。

既存の APK セットからデバイス固有の APK を抽出する

既存の APK セットから、特定のデバイス設定を対象とする APK のサブセットを抽出する場合、次のように extract-apks コマンドを使用して、デバイス仕様の JSON を指定します。

    bundletool extract-apks
    --apks=/MyApp/my_existing_APK_set.apks
    --output-dir=/MyApp/my_pixel2_APK_set.apks
    --device-spec=/MyApp/bundletool/pixel2.json
    

APK セット内の APK の推定ダウンロード サイズを見積もる

圧縮されて有線で配信される APK セット内の APK の推定ダウンロード サイズを見積もるには、get-size total コマンドを使用します。

    bundletool get-size total --apks=/MyApp/my_app.apks
    

次のフラグを使用して get-size total コマンドの動作を変更できます。

フラグ 説明
--apks=path (必須)ダウンロード サイズを見積もる既存の APK セットのファイルへのパスを指定します。
--device-spec=path 照合に使用するデバイス仕様のファイル(get-device-spec からまたは手動で構成)へのパスを指定します。部分的なパスを指定して、設定のセットについて見積もることもできます。
--dimensions=dimensions 推定サイズを見積もるのに使用するディメンションを指定します。SDKABISCREEN_DENSITYLANGUAGE のカンマ区切りのリストを指定できます。すべてのディメンションにわたって見積もるには、ALL を指定します。
--instant インストール版 APK ではなく、Instant 対応 APK のダウンロード サイズを見積もります。デフォルトで、bundletool はインストール版 APK のダウンロード サイズを見積もります。
--modules=modules 見積もりで考慮する APK セットのモジュールをカンマ区切りのリストで指定します。bundletool コマンドでは、指定したセットの依存関係モジュールが自動的にすべて含まれます。デフォルトで、このコマンドは初回ダウンロードでインストールされるすべてのモジュールのダウンロード サイズを見積もります。

参考情報

bundletool の使用方法について詳しくは、下記のリソースをご覧ください。

コードラボ

  • 初めての Android App Bundle: Android App Bundle の基本原則を探り、Android Studio を使って独自のビルドをすぐに始める方法を示すコードラボです。このコードラボは、bundletool を使用して App Bundle をテストする方法についても紹介します。