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の使い方についての公式ドキュメントは以下になります。合わせて見てみてください。
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.jar
をbundletool.jar
に名前変更しています。
後は端末またはターミナルを開いてmyapp-bubndle
ディレクトリに移動し、以下のコマンドを実行します。macOSでbrewを使ってインストールした場合はjava -jar bundletool.jar
をbundletool
に置き換えてください。
$ 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の使い方についてまとめました。公式ドキュメントにもあまり詳しくは記載されていなかったためメモしておきます。
関連記事
- 公開日:2022/08/30 更新日:2022/08/30
FlutterアプリでAndroid StudioのGenerate Signed Bundle/APKが表示されない時の対処法
FlutterアプリをGoogle Play Storeに公開するためにAndroid Studioを使ってアップロード鍵を生成しようとしたところ、公式ドキュメントに書かれている「Build」→「Generate Signed Bundle/APK」というメニューが見つかりませんでした。この解決法をメモします。
- 公開日:2022/08/15 更新日:2022/08/15
webview_flutterを使ってFlutterアプリ内でWebページを開く
FlutterでURLをタップした時にアプリ内でそのURLのWebページを開く方法についてまとめます。この記事では、Flutter公式のプラグインであるwebview_flutterを使用した実装例をメモします。
- 公開日:2022/08/14 更新日:2022/08/14
FlutterでURLへのリンクを作成してアプリ外でWebページを開く
FlutterでURLをタップしたらブラウザが開いてそこでURL先を表示したい場合があります。この記事では、Flutter公式のプラグインを使用した実装例をメモします。
- 公開日:2019/12/23 更新日:2019/12/23
複数デバイス間でローカルのファイルを無制限に同期できるSyncthingをLinuxで使用する手順
Syncthingはローカルにあるファイルを複数のデバイス間で同期することができるオープンソースソフトウェアです。クラウド経由でファイルを同期するのではなく、ローカル同士で同期します。この記事ではUbuntuとAndroidでSyncthingを使用してファイルを同期するまでをまとめます。
- 公開日:2019/12/09 更新日:2019/12/09
Google Play Consoleに登録してデベロッパーアカウントを作成する手順
Android用にアプリをGoogle Play Storeで公開して配布するには、まずGoogle Play Consoleに登録してデベロッパーアカウントを作成する必要があります。この記事ではこの手順をまとめます。