bundletool

Android App Bundle をビルドしたら、Google Play で App Bundle を使用して生成される 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 をダウンロードする

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

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 フラグを使ってキーストアを指定し、--ks-pass を指定しない場合、コマンドラインからパスワードを入力するように 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 モードを universal に設定して、アプリのコードとリソースをすべて含めた単一の APK のみ bundletool でビルドします。それによって、このアプリでサポートするすべてのデバイス設定と互換性のある APK となります。

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

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

接続されているデバイスに 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 をテストする方法についても紹介します。