くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutter x Androidでリリース&Google認証のために証明書を用意する

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の登録が必要

証明書のSHA1は、以下のどちらかのコマンドで確認できる

  • shellで、cd android && ./gradlew app:signingReport
  • Android StudioTask :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
    }
  }
}

以上!! 地味にめんどくさいのでテンプレート化とかしたいね(*´ω`*)

参考にしたサイトさま