[flutter2]Android aabを使ってリリースするまで

Androidアプリのリリース方法は今後aabを使ったものにしなければならない模様。aabとは?詳しい説明は省きますが、今までAndroidアプリは署名やらなんやらしたものをビルドしてストアに配置しそれを公開する流れだったのですが、aab(Android App Bundle)を使うと署名やらなんやらはストア側でやってくれる。というような感じ。
ネイティブでの情報はたくさんありますが、flutter2での情報はあまり世間にはないのでご参考に。

キーストアの作成

まずはキーストアの作成です。これはネイティブでも、従来のAPKファイル方式でも同じかと。

keytool -genkey -v -keystore ~/hoge.jks -keyalg RSA -keysize 2048 -validity 10000 -alias hoge

上記コマンドを実行します。変更点は[-keystore ~/hoge.jks]と[-alias hoge]のhogeです。-keystoreはキーストア名を、-aliasはその中に格納する識別名を意味します。キーストアはキー情報の配列オブジェクト、-aliasは連想配列の参照値と思えばわかりやすいでしょう。

実行するとパスワードとその他情報の入力を求められます。パスワードは必ず控えて置くようにしましょう。

プロジェクト設定

上記のキー情報およびファイルをしっかりとメモし管理できる状態にしたらFlutterアプリ側の設定を行なっていきます。

まずアプリのandroidディレクトリにkey.propertiesという名前でファイルを作成し、以下を入力して保存。

storePassword=ストアパスワード
keyPassword=上と同じ
keyAlias=先程設定したエイリアス
storeFile=/Users/<user name>/キーまでのパス/鍵の名前.jks

次にAndroid/app/build.gradleを開き、以下をandroidブロックの前にコピペ。

def keystoreProperties = new Properties()
   def keystorePropertiesFile = rootProject.file('key.properties')
   if (keystorePropertiesFile.exists()) {
       keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
   }

また、buildTypesブロックを範囲選択し以下に置き換えてください。初期のままだとリリースビルドをしてもデバッグと同じ情報を使っているため、ビルドこそできるものの、ストアで配布できる形ではないのです。

   signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
   }
   buildTypes {
       release {
           signingConfig signingConfigs.release
       }
   }

リリースビルド

次はaab(App Build Bundle) で出力するようにリリースビルドを行います。ここで大事なのがflutter2対応。NullSafetyに対応していないパッケージが存在する場合、エラー文字が出てビルドに失敗します。

flutter build appbundle
普通に実行すると。。。。。

Error: Cannot run with sound null safety, because the following dependencies
don't support null safety:       

この様な文言が出てくる場合は以下のコマンドで実行してください。

flutter build appbundle --no-sound-null-safety

こうすることでNullSafetyでないパッケージも許容することができます。以上でリリースビルドは完了。
パスはプロジェクトのルートから build/app/outputs/bundle/release/app-release.aab となっています。androidフォルダ内ではないことに注意。

[おまけ]バージョン管理について

iOS(AppStore)もAndroid(GooglePlay)も、適切にバージョン情報を更新しないとうまくストアにアップロードできません。Androidの場合、pubspec.yamlにて設定した値が反映されます。

version: 1.0.0+1

のような記述があると思います。1.0.0の方はVersionName(バージョン名・バージョンネーム)と呼ばれるもので、実際に表示されるものです。+1の方はVersionCode(バージョンコード)と呼ばれるもので、こちらがビルドバージョンの通し番号として機能するものです。そのため、ストアにアップするビルドはここが大きくなっていないと弾かれてしまうのです。

iOSの場合はRunnerで設定する際のバージョンが表示としても通し番号としても機能します。自分は統一されている分iOSの方が感覚的に使えて良い気がしますが。。。

GooglePlayへのアップロード

Androidにおいては実機へのテストもGooglePlayにアップロードしてから行う方法を推奨します。理由はオフラインで実機テストを行うためにはツールが必要になることが大きいです。あんまり管理するものは増やしたくないので。勿論ツールを使ったオフラインテストをしたい場合は行ってください。

GooglePlayへの登録手順は他のサイトを参考にしてください。管理画面でアプリプロジェクトを作成するところまで進めてから戻ってきてください。以下の様な画面が表示されているはずです。テストをしたいだけであれば以下の設定は必要ないはず。

ちなみにここで一番下の方に表示されていますが、この時点でストアに表示する画像類や紹介文の準備が必要になってきます。今のうちに準備しておきましょう。

上記が終わった後は、公開する国を選択します。これを行うことで、公開用にリリースビルドをアップロードすることができる様になります。今回はタイトルにもあるとおり、aabを使った配布を目指しているので間違えないように。

公開する国を選択した後は、リリースを作成しテストする必要があります。テストを飛ばして製品版リリースを行うことも可能です。テストの場合は[リリース]-[オープンもしくは内部テスト]を、リリースする場合は[リリース]-[製品版]-[リリースを編集]と進んでください。エミュレータを利用している場合は、リリース用にaabをアップロードした後、署名されたAPKを審査前にダウンロードする事ができるのでお手軽にテストできますよ。

Firebaseを使っている場合

firebaseを使っている場合はリリースビルドで使う署名鍵のSHA-1およびSHA-256を確認・コピーし、Firebase側のプロジェクトで追加し、google-services.jsonを再度ダウンロードしてビルドする必要があります。あまり知識がないので詳しくは解説しませんが、SHA-1はAuthenticationに、SHA-256はFirebaseDynamicLinksに必要とのこと。ただ自分はこの際にと両方設定しています。

一旦aabでリリースビルドをアップロードするところまで進めると、以下の箇所に情報が表示されます。

どちらの証明書も情報をFIrebaseに登録する必要がある様子。なので4つのフィンガープリントをFirebaseに登録したらgoogle-services.jsonをダウンロードし、ビルドし直してアップロードしてください。pubspec.yamlでバージョンコードを上げる作業を忘れないように!

まとめ

昔はAndroidのリリースは審査含め簡単だと言われてましたがこうやって通してみるとそうでもないですね。むしろiOSよりやることや考えることが多い印象でした。一度通してやってしまえば慣れるのでしょうがハードル高めというのが感想です。

言ってもここが最後の難関です。是非乗り越えてあなたの素敵なアプリをリリースしてください!