[Flutter] Signing problem when building Android App Bundle in release mode

問題

先看我遇到的問題,以下是我遇到的 Error message。

E/flutter (17797): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null, null)
E/flutter (17797): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:582:7)
E/flutter (17797): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:159:18)
E/flutter (17797): <asynchronous suspension>
E/flutter (17797): #2      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:332:12)
E/flutter (17797): #3      MethodChannel.invokeMapMethod (package:flutter/src/services/platform_channel.dart:359:49)
E/flutter (17797): #4      MethodChannelGoogleSignIn.signIn (package:google_sign_in_platform_interface/src/method_channel_google_sign_in.dart:45:10)
E/flutter (17797): #5      GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:233:42)
E/flutter (17797): <asynchronous suspension>
E/flutter (17797): #6      GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:288:18)
E/flutter (17797): #7      GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:359:9)

環境及版本

我用的版本如下

  • Flutter: 1.22.5
  • Dart: 2.10.4
  • firebase_core: ^0.5.3
  • firebase_auth: ^0.18.4
  • google_sign_in: ^4.5.1
  • firebase_messaging: ^8.0.0-dev.10

遇到問題的歷程

除夕這天,我嘗試著利用 Flutter 打包一個 Android release 版本的 appbundle 到 Google Play,但發佈到 Google Play 的內部測試以後,怎麼樣都無法登入(如同上面列的,我登入是用 firebase 搭配 google sin in),出現的錯誤訊息就是上面的列出的。

我的打包的方式是參考官網(Signing the app)的做法。

這邊要打包 release 版本的設定順序基本上是:

  1. Create a keystore
  2. Reference the keystore from the app
  3. Configure signing in gradle
  4. Building the app for release

由於我以前沒寫過 App,所以對 Android 不太了解。但從 Flutter 的官方文件看來

我的理解是:如果要 release 一個 Android 版本,需要先建立一個憑證,然後用這個憑證對 App 簽章打包成我們要的檔案。

然後我看到打包有兩種格式:

  • App bundle (preferred)
  • APK

接下來如果設定都有參照官網,再加上我有用到 flavor 去切分 devprod 環境,那打包時,就簡單的執行 build 指令就可以完成。

以我的情況,我的 cmd 如下:

$ flutter build appbundle --release --flavor prod -t lib/main_prod.dart

or

$ flutter build apk --split-per-abi --release --flavor prod -t lib/main_prod.dart

奇怪的是,我打包好 release apk 好幾次,每次測試都可以順利登入。但當我一丟到 Google Play 以後,怎麼樣就是登入不了,再花了非常多時間以後,我終於發現問題所在。

過程中,我有看到錯誤訊息跟我很像的這篇 [google_sign_in] PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null) #56235

當我在完成上述的 Create a keystore 這個步驟後,我把憑證的sha1 丟到 Firebase project,這邊當然沒問題,因為這樣做,當我用同一個憑證 去對 App 做簽章的動作時,我才能夠利用 firebase 登入。

問題出在打包成 appbundle 時,我以為也是用同一個憑證去做簽章,但事實上並不是,只有打包成 apk 時,我們需要自己建立一個憑證去做簽章,並且好好保管這個憑證

打包成 appbundle 時,我們需要到 Google Play 讓 Google Play 幫我們建立好憑證,因為打包的 appbundle 會是 Google Play 用這個憑證去對我的們 App 做簽章的動作。所以我們只需要把 Google Play 產生的的 sha1 丟到我們 Firebase project 裡面就行了。

Google Play 畫面如下:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *