とにかくやるブログ

とにかくやるブログ

プログラムの備忘録とその他雑記を適当にやるブログ

【Androidプログラム】AABファイルの作成やってみた

f:id:tewow:20190706104202j:plain











表題についてやります。


kotlinの勉強も並行してやってるんですが
業務でAABについて扱ってせっかくなので書きます。







そもそもAABファイルとは?

Androidアプリを動かす際
これまではAPKファイルというものを端末に入れたり、ストアに登録したりしていました。


APKファイルにおいては端末やバージョンごとの違いに対して
1つのAPKファイルで対応していました。
そのため、一つのAPKファイルの大きさは場合によってはかなり大きなものになってしまいます。



一方でこのAABファイルというものは
いうなれば「APKファイルの生成機」でそれぞれの端末やバージョンに最適化されたAPKを発行してくれるものになります。


これを使うことで個々のAPKファイルの大きさは小さくなり
アプリのダウンロードサイズを小さくすることができます。







発行の準備


AABファイルの発行には以下の準備が必要になります。

・build.gradle のバージョンを3.2以上にする
・AndroidStudioのバージョンを3.2以上にする



build.gradleについては以下であげることができます。

dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'


gradle/wrapper/gradle-wrapper.properties で

distributionUrlを
"https\://services.gradle.org/distributions/gradle-5.1.1-all.zip"に設定







build.gradleをあげると色々なエラーが起きるので対応していく

エラーの内容はプロジェクトによって千差万別だとは思いますが
自分のプロジェクトで起きたことについて書いていく。




"fablic"周りと思われる箇所でSyncさせた際に以下のようなWARNINGが発生。
WARNING: API 'variant.getJavaCompile()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'

ひとまずググってみるとfabricのバージョンを最新にしてやると直るみたいなことが書いてあったので

stackoverflow.com

gradleのdependenciesにて
classpath 'io.fabric.tools:gradle:1.+'
classpath 'io.fabric.tools:gradle:1.29.0'

を試してみたがこれは意味なかった。





もっと探していくと良さげなサイトを見つけたのでそこに倣ってやっていく

qiita.com


とりあえずエラーの箇所がわからないとどうしようもないので以下のコードでエラー箇所を発見できるようにする。

gradle.properties に
android.debug.obsoleteApi=true と記入。

これでエラーの箇所を特定可能になる。





すると"variant.getJavaCompile"ではなく"variant.javaCompiler"が問題だと判明
"variant.javaCompiler"は"variant.javaCompileProvider.get()"に書き換えられるみたいなので書き換える。



この方法で該当のワーニングはでなくなったが、次は新たに以下のワーニングが発生。
API 'variant.getAssemble()' is obsolete and has been replaced with 'variant.getAssembleProvider()'.



この発生箇所については"current state"とあるだけで具体的な場所ははっきりせず。
ググると無理やり直す方法もあるらしいが、Google様が対応してくれるのを待つ方が良いみたいなので
これは放置しておく。
動かないわけではないし







ついでにandroidxに対応させる

rakuishi.com


「Refactor -> Migrate to AndroidX…」で「Do Refactor」すれば自動でリファクタまでやってくれるのでこれは簡単。

外部ライブラリを使っている場合などは対応できない場合があったりするので
そこはライブラリの更新などを確認して、適宜対応する。







実際にAABを発行してみる

発行自体は簡単で
メニューのBuild>APK/BuildBundles>BuildBundles から発行できる。


発行したら、発行完了の通知とともにファイルの場所も案内されるのでファイルを確認。

https://github.com/google/bundletool/releases

上のjarファイルを使ってaabからapksファイルを発行する。
apksファイルはその名の通り、apkの集合体のようなファイルで
そのままだと結構容量が大きい。

apksを発行するコマンドは以下。
$ java -jar bundletool-all-0.7.1.jar build-apks \
--bundle=app.aab --output=app.apks \
--ks=keystore.jks --ks-pass=pass:PASSWORD --ks-key-alias=ALIAS \
--key-pass=pass:PASSWORD

キーストアとかは無しでも発行自体は可能だが
端末で動かしたりする際は必須。







apksを端末で動かす

端末をPCに繋いで以下のコマンドを叩けばインストールできる。
$ java -jar bundletool-all-0.7.1.jar install-apks --apks=app.apks

なお、環境によっては環境変数の設定を求められることもあるので
その場合は以下のように設定した上でコマンドを叩く。
export ANDROID_HOME="/Users/name/Library/Android/sdk"

コマンドをたたいてその処理が終了するとアプリが端末に自動でインストールされているので、コマンドをたたく前に端末内に同名アプリがある場合は消しておくこと。
デバッグしてる時とかはありがち。







ちなみにbundletoolでデバイス情報が観れるらしいが

$ bundletool get-device-spec --output essential.json
で端末のスペック情報が取得できるらしいが、これは以下のエラーが出る。

[BT:0.10.0] Error: null
java.lang.NullPointerException
at java.nio.file.Files.provider(Files.java:97)
at java.nio.file.Files.exists(Files.java:2385)
at com.android.tools.build.bundletool.commands.GetDeviceSpecCommand.writeDeviceSpecToFile(GetDeviceSpecCommand.java:175)
at com.android.tools.build.bundletool.commands.GetDeviceSpecCommand.execute(GetDeviceSpecCommand.java:164)
at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:83)
at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:46)



色々試したけどこいつは原因不明ダレカタスケテ