Flutter で作ったアプリを Google Play Console に公開する作業をしたのですが、想像以上に大変でした。後で自分で読み返せるように、ここに経緯を残しておきます。
署名まわりでつまずく
最初の大きな壁は アプリ署名(SHA-1) でした。
Google Play Console にアップロードするためには keystore(.jks ファイル)を使ってアプリに署名しなければなりません。
ただ、この keystore を読み込む設定がどうしても上手くいかず、android/app/build.gradle.kts を何度も書き直す羽目に…。
何十回どころではなく、文字通り「何百回」と言っていいほど修正とビルドを繰り返しました。
それでも Gradle 側からは「署名情報が null」と言われたり、正しい JKS を android/ 直下に置いているのに読み取ってくれない、といった問題に悩まされました。
keytool と SHA-1 の確認
途中で keytool を使って JKS 内の証明書情報を確認。
その結果出てきた SHA-1 が Google Play Console 側で求めていた値と一致していることがわかり、ようやく道が開けました。
AAB のビルドとアップロード
ようやく署名が通り、./gradlew bundleRelease で app-release.aab が生成されました。
今度はそれを Google Play Console にアップロード。
なんとか審査へ
最終的に Google Play Console でエラーが消え、アプリを「審査中」に持ち込むことができました。
たどり着くまでに膨大な試行錯誤がありましたが、ようやく「公開までの入り口」に立てたという感覚です。
⸻
今回学んだこと
• keystore は正しい場所に置いても、Gradle 側の設定を間違えると認識してくれない
• android/app/build.gradle.kts の設定はシビアで、ほんの一行違うだけで署名が無効になる
• pubspec.yaml のバージョン番号(1.1.1+9 → 1.1.2+10 など)は必ず更新が必要
• エラーにあきらめず何度も試すしかない
⸻
まとめ
keystore 設定
• android/ 直下に guitarnote.jks を配置。
• android/key.properties に以下を記述。
• android/app/build.gradle.kts にて signingConfigs を設定。
XXXXXXの部分・・最終的には以下のように直接storePasswordにして安定。
signingConfigs {
create("upload") {
val ks = file("/Users/.../_guitar_note_26cards/android/guitarnote.jks")
println(">>> Using keystore: ${ks.absolutePath} exists=${ks.exists()}")
storeFile = ks
storePassword = "XXXXXX"
keyAlias = "key0"
keyPassword = "XXXXXX"
}
}
• 署名が反映されているか確認するために ./gradlew :app:signingReport を実行。
ここで出力された SHA-1 と keytool で確認した値が一致していることを確認。
下記が覚えたコマンドです
つまりこのコマンドは
✅ keystore が壊れていないか
✅ どの SHA-1 を使えばよいか
✅ Google Play / Firebase に登録する fingerprint が正しいか
を確認するために使う「最後のチェックツール」ですね。
keytool -list -v \
-keystore android/app/guitarnote.jks \
-alias key0
用途
• keystore 内の 証明書情報(Fingerprint, 有効期限, 発行者など) を確認する。
• 特に重要なのは SHA-1 / SHA-256 Fingerprint。
• Firebase / Google Play Console に登録する時に必要。
• apksigner で出した値と突き合わせて「正しく署名されているか」を確認できる。
ポイント
• -alias には key.properties に書いた keyAlias(例: key0)を指定。
• パスワード入力を求められるので、storePassword を入力する。
• SHA1 の値が Google Play Console や Firebase コンソールに登録したものと一致すれば OK。
AAB 作成:
cd android
./gradlew clean
./gradlew :app:bundleRelease --no-configuration-cache --rerun-tasks
出力:
android/app/build/outputs/bundle/release/app-release.aab
• 署名確認:
$ANDROID_HOME/build-tools/*/apksigner verify --print-certs \
app/build/outputs/bundle/release/app-release.aab
学び
1. keystore のパス指定は相対ではなく絶対パスで安定。
2. signingConfigs の設定は release ビルドで必ず適用する。
3. signingReport で SHA-1 を確認してから Google Play Console に登録すると混乱が減る。
4. pubspec.yaml の versionCode/Name はリリースごとに更新が必要。
5. targetSdkVersion は最新に追従すること。