android Flutter

Android App Bundleを実機にインストールして試すために使うbundletoolの使い方

はじめに

Flutterなどで開発したAndroidアプリを自分の手元にある実機にインストールして試したい場合はbundletoolを使用するようFlutterの公式ドキュメントに記載されています。ただ、常識であるためなのか詳しい使い方が書かれておらず戸惑ったのでメモしておきます。

前提と環境

以下の通りです。

  • OS : Ubuntu18.04(ただしおそらくmacOSやWindowsでもやることは同じだと思います)
  • Android App Bundle(aabファイル)は作成済とする。
  • Java Runtime Environemntはインストール済とする。

Java Runtime Environemnt(Javaの実行環境)については、Android StudioがインストールされていればすでにJDKと一緒にインストールされていると思います。
また、bundletoolの使い方についての公式ドキュメントは以下になります。合わせて見てみてください。

bundletool  |  Android デベロッパー  |  Android Developers

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

bundletoolをダウンロードする

こちらの公式リポジトリのリリースページから最新のbundletoolのjarファイルをダウンロードします。執筆時点では最新版は0.11.0でファイル名はbundletool-all-0.11.0.jarでした。

なお、macOSでbrewを使用している場合は以下でインストールできるようです。

$ brew install bundletool

Android App BundleからAPKセットを作成する

わかりやすくするために、以下の画像のようにダウンロードしたbundletool-all-0.11.0.jarと作成済のAndroid App Bundleファイル(画像内のapp.aab)を適当なディレクトリの中に置きます。ここでは、新しくmyapp-bundleという適当なディレクトリを作成してそこに両方を置きました。なお、bundletool-all-0.11.0.jarbundletool.jarに名前変更しています。

後は端末またはターミナルを開いてmyapp-bubndleディレクトリに移動し、以下のコマンドを実行します。macOSでbrewを使ってインストールした場合はjava -jar bundletool.jarbundletoolに置き換えてください。

myapp-bundle$ java -jar bundletool.jar build-apks --bundle=app.aab --output=app.apks \
--ks=/home/username/key.jks \
--ks-pass=pass:yourpassword \
--ks-key-alias=key \
--key-pass=pass:yourkey

上記コマンド内のオプションの説明は以下です。

項目内容
app.aab作成済のAndroid App Bundleファイル名
app.apks作成済するAPKファイル名
–ks=/home/username/key.jks作成済の署名キーストアファイルのパス(上記では/home/username/key.jks
–ks-pass=pass:yourpassword作成済の署名キーストアファイルのパスワード(上記ではyourpasswordがパスワード)。パスワードを文字列でそのまま渡す場合は上記のようにpass:パスワード文字列とする。パスワードをファイルに格納してそれを読み込ませる場合は--ks-pass=file:パスワードファイルパスとする。
–ks-key-alias=key作成済の署名キーストアファイルで指定したエイリアス名(上記ではエイリアス名がkey
–key-pass=pass:yourkey作成済の署名キーストアファイルで指定したキー。パスワードと同じ場合は同じものを入力。パスワードと同様にファイルでの指定も可能。

上記を実行すると以下のようにapksファイルが作成されます。

apksファイルは、アプリがサポートするすべてのデバイス設定に対するAPKセットです。これについても冒頭に載せたこちらの公式ドキュメントに記載されています。

なお、もしapksファイルがすでにある場合は上書きはしてくれないため、すでにある古いものを一度削除してからでないと以下のようにエラーが表示されます。

$ java -jar bundletool.jar build-apks --bundle=app.aab --output=app.apks --ks=/home/username/key.jks --ks-pass=pass:yourpassword --ks-key-alias=key --key-pass=pass:yourkey
[BT:0.11.0] Error: File 'app.apks' already exists.
java.lang.IllegalArgumentException: File 'app.apks' already exists.
        at com.google.common.base.Preconditions.checkArgument(Preconditions.java:204)
        at com.android.tools.build.bundletool.model.utils.files.FilePreconditions.checkFileDoesNotExist(FilePreconditions.java:29)
        at com.android.tools.build.bundletool.commands.BuildApksManager.validateInput(BuildApksManager.java:424)
        at com.android.tools.build.bundletool.commands.BuildApksManager.execute(BuildApksManager.java:98)
        at com.android.tools.build.bundletool.commands.BuildApksCommand.execute(BuildApksCommand.java:532)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:74)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:46)

APKセットをAndroid実機にインストールする

aabファイルから作成したapksファイルをAndroid実機にインストールするには以下のコマンドを実行します。Android実機がすでにパソコンにUSB接続されている前提です。以下はapksファイル名がapp.apksの場合です。

$ java -jar bundletool.jar install-apks --apks=app.apks

以上でインストールが完了です。Android実機で自身のアプリを使えるようになります。

なお、上記を実行した時に以下のようなエラーが表示される場合があります。

$ java -jar bundletool.jar install-apks --apks=app.apks
The APKs have been extracted in the directory: /tmp/5529016054457319908
12:58:39 E/SplitApkInstaller: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package your.app.name signatures do not match the previously installed version; ignoring!
[BT:0.11.0] Error: Installation of the app failed.
com.android.tools.build.bundletool.model.exceptions.InstallationException: Installation of the app failed.
        at com.android.tools.build.bundletool.model.exceptions.InstallationException$Builder.build(InstallationException.java:47)
        at com.android.tools.build.bundletool.model.exceptions.InstallationException$Builder.build(InstallationException.java:41)
        at com.android.tools.build.bundletool.device.DdmlibDevice.installApks(DdmlibDevice.java:133)
        at com.android.tools.build.bundletool.device.ApksInstaller.installOnDevice(ApksInstaller.java:94)
        at com.android.tools.build.bundletool.device.ApksInstaller.installApks(ApksInstaller.java:82)
        at com.android.tools.build.bundletool.device.ApksInstaller.installApks(ApksInstaller.java:44)
        at com.android.tools.build.bundletool.commands.InstallApksCommand.execute(InstallApksCommand.java:165)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:88)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:46)
Caused by: com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package your.app.name signatures do not match the previously installed version; ignoring!
        at com.android.ddmlib.SplitApkInstaller.install(SplitApkInstaller.java:91)
        at com.android.ddmlib.Device.installPackages(Device.java:928)
        at com.android.tools.build.bundletool.device.DdmlibDevice.installApks(DdmlibDevice.java:117)
        ... 6 more

上記は、すでにAndroid実機にアプリがインストールされているものの、そのアプリの署名が今回インストールしようとしているアプリの署名と一致しないために発生します。
したがって、各自の状況にもよりますが、もし以前インストールしたものが消して問題なければ以下のようにadbコマンドでAndroid実機から古いアプリを削除してしまえばエラーは消えます。your.app.nameが各自のアプリIDです。

$ adb uninstall your.app.name
adb server version (41) doesn't match this client (40); killing...
* daemon started successfully

まとめ

bundletoolの使い方についてまとめました。公式ドキュメントにもあまり詳しくは記載されていなかったためメモしておきます。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。