FlutterをAndroidでリリースする場合とかに署名用の証明書が必要。
いつも調べてるので、まとめてみたときの備忘録(*´ω`*)
公式だとこの辺り
リリース用の証明書作成と署名
keystoreの作成
まずは署名するためのkeystore(秘密鍵)を作成。
秘密鍵なので、公開しないように注意。
$ keytool -genkey -v -keystore upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload $ cp ~/upload-keystore.jks android/app
ビルド時に参照するpropertiesを作成
次に、設定したパスワードとかを含めて、
key.properties
にkeystoreの情報をまとめておく
$ cat [project]/android/key.properties storePassword=<password from previous step> keyPassword=<password from previous step> keyAlias=upload storeFile=./upload-keystore.jks
propertiesとkeystoreを使って署名
key.properties
を使ってビルド時に署名するように、
android/app/build.gradle
を変更する
// [project]/android/app/build.gradle // key.propertiesを読み込む def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { // ... // key.propertiesの値を使って署名関連を設定 signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } } // releaseビルド時に、設定したsigningConfigsで署名するように指定 buildTypes { release { signingConfig signingConfigs.release } } }
Androidアプリのビルド
あとは、build
コマンドでビルドすればOK
$ flutter build apk --debug --flavor dev -t lib/main_debug.dart $ flutter build appbundle --release --flavor stag -t lib/main_stag.dart
Google認証
Firebase AuthenticationでGoogle認証を使う場合、 証明書のSHA1の登録が必要
- Android で Google を使用して認証する | Firebase Authentication
- クライアントの認証 | Google Play services | Google for Developers
証明書のSHA1は、以下のどちらかのコマンドで確認できる
- shellで、
cd android && ./gradlew app:signingReport
- Android Studioで
Task :app:signingReport
Google Play側でアプリ署名鍵を管理している場合は、
Play Consoleの「設定>アプリの署名」にあるSHA1を利用する
小ネタ: flavorごとに証明書を変える
flavorを利用していると、flavorごとに署名を変えたい場合もある。
(同じapplicationIdとSHA1の組み合わせで複数のFirebase Projectに登録できない...)
そういう場合は、こんな感じにすると対応できる
// [project]/android/app/build.gradle // リリース用のkeystore def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } // 開発用のkeystore def devKeystoreProperties = new Properties() def devKeystorePropertiesFile = rootProject.file('dev.key.properties') if (devKeystorePropertiesFile.exists()) { devKeystoreProperties.load(new FileInputStream(devKeystorePropertiesFile)) } android { productFlavors { dev { } stag { } prod { } } signingConfigs { // 開発用署名の設定 develop { keyAlias devKeystoreProperties['keyAlias'] keyPassword devKeystoreProperties['keyPassword'] storeFile devKeystoreProperties['storeFile'] ? file(devKeystoreProperties['storeFile']) : null storePassword devKeystoreProperties['storePassword'] } // リリース用署名の設定 release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } } buildTypes { release { // flavorごとに利用する署名の設定を指定 productFlavors.dev.signingConfig = signingConfigs.develop productFlavors.stag.signingConfig = signingConfigs.develop productFlavors.prod.signingConfig = signingConfigs.release } } }
以上!! 地味にめんどくさいのでテンプレート化とかしたいね(*´ω`*)
参考にしたサイトさま
- Build and release an Android app | Flutter
- Android で Google を使用して認証する | Firebase Authentication
- クライアントの認証 | Google Play services | Google for Developers
- ProductFlavorごとに署名する証明書を変えたい #Android - Qiita
- Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)の対処法 #Flutter - Qiita
- firebase - how to get sha1 of android app in Vs code - Stack Overflow