【Flutter】 Firebaseとの連携ができず奮闘しています。2<原因がわかったかもしれない>

【Flutter】 Firebaseとの連携ができず奮闘しています。 - odekakeneko’s blog
前回の記事の続きです。
もうこの問題、3週間くらい奮闘しています。GWに丸何日もこの問題にささげたおかげで、もしかして解決の兆しが見えてきたのでその途中経過を書きます。

その前に振り返りから

・UdemyでFlutter学習コースを購入
・インスタグラムのクローンアプリが作れる、というコース。
Googleの認証でエラーが出た

signinSilentlyのcatcherrorで必ず下記のようなエラーコードが出る

I/flutter (18667): Error Message:MissingPluginException(No implementation found for method init on channel plugins.flutter.io/google_sign_in)

Runボタンのbuildは通るが、このエラーが必ず出てくるで消したい。ということでした。


===

話はそれますが、Udemyのこのコースの講師に質問してみたところ、

「OK,助けるよ。」

というような言葉を英語で頂き、現に未解決ながら4~5往復のメッセージやり取りをさせてもらっていて、じわじわ解決に近づいている気がします。Udemy講師親切でありがたいなぁ。

===

Firebaseプロジェクトの生成

本筋に入る前に、またちょっと話がそれます。

皆さんFirebaseのプロジェクトがどのようにGoogleに認識されているかご存じですか?
下記のエラーをご覧ください。

f:id:odekakeneko:20200505005957p:plain
普段とは別のGmailアカウントで「同じプロジェクト」を作ったらエラーになった。


確たる証拠になるドキュメントなどは見つからなかったのですが、このコースを反復しているうちにこういうことじゃないかということに気が付いて、講師に質問したら「(概ね)君は正しいよ」というような言葉をいただきました。

f:id:odekakeneko:20200505010513p:plain
Firebaseプロジェクト作った後の画面
説明します。これは最初にプロジェクトを作成してアプリと関連付ける画面でわかる人は良く見るものですね。
そこに、「com.company.appname」というAndroidパッケージ名があって、それはFlutterのappレベルのbuild.gradleからとってこれるものでした。アプリのニックネームは省略可でその下の、デバッグ用のSHA-1キーも省略可ではあるのですが、実はこれ(SHA1キー)と先ほどのAndroidパッケージ名のペアでもって、GoogleはこのFirebaseに関連付けられているアプリをグローバルに一意(ユニーク)なものとして認識しているようなのです。

そして、SHA-1キーはPCが発行するPC自身の識別番号のようなものらしく、同じPCを使っているならば何回調べても同じ番号が出てきます。

先ほどのグローバルに一意とはどういうことかというと、この(PCから成る)SHA-1キーと(「com.company.appname」という)Androidパッケージ名のペアが、世界中のGoogleアカウントの中で一つしかないということです。

最初に見せた画像は、普段とは別のアカウントでFirebaseプロジェクトを作り、同じパッケージ名とSHA-1キーを登録したときに出たエラーです。「もうすでにこのプロジェクトはあるよ」って言っています。

ちなみになんでパッケージ名とSHA-1キーの重複が起きたかというと、私がUdemy講師から学習のためにインストールしたパッケージを使って、私が私のPCで発行したSHA-1キーを使ったからです。

パッケージ名を無断で変えたらほかのエラーが起きるかもしれないし、PCはそうやすやすと変えられません。

しかも、このプロジェクト、削除しても一意のものとしてずっと残るらしいのです。

参考:Understand Firebase projects


ということで講師に質問すると「じゃあパッケージ名を変えてこういう風にして」と指示があったのでそれに従って本日エラーを解いていました。

長くなりましたが前置きは終わりです

===

object heapなんちゃらが出た


SHA1キーを発行するのに、gradlewをopen in Terminalし、「graldlew signingReport」する必要があるのですが、このSHA1キー発行でもエラーが起こりました。

Error occurred during initialization of VM
Could not reserve enough space for 1572864KB object heap


これは、Flutterがビルドをするときに、Gradleというシステムを使っているらしいのですが、そのGradleが、Java Virtual Machine (JVM)という仮想マシンを使ってビルドをしているらしい、その時に十分なスペースがなかった場合に出るエラーのようです。

gradle.propertiesに下記のような記述をして、解決します。

android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true

#↓試行錯誤の跡
#org.gradle.jvmargs=-Xmx4096M
#org.gradle.jvmargs=-XX\:MaxHeapSize\=256m -Xmx256m
#org.gradle.jvmargs=-Xmx4608M
#org.gradle.jvmargs=-Xmx2048M
#org.gradle.jvmargs=-Xmx3072M

要は、「org.gradle.jvmargs=」の後ろに「-Xmx4096M」などのなるべく大きい数値を入れて、十分なスペースを確保しようということみたいです。しかし、これは大きすぎてもいけないらしく、「-Xmx4096M」とすると、
「Invalid maximum heap size: -Xmx4096M
The specified size exceeds the maximum representable size.」
というエラーが出てしましました。「サイズが大きすぎるよ」と言っていますね。

===

ここで、ちょっとまた話が戻るのですが、
Firebaseのプロジェクトを作成してアプリと関連付けるとき、SHA1キーを登録してgoogle-services.jsonをappフォルダ下に設置した後に「アプリを実行してインストールを確認(この工程をスキップする)」という段階がきます。

f:id:odekakeneko:20200505014517p:plain

この時確認アニメーションがクルクルしたままで、他の方はこの工程をスキップする方もいるかもしれないのですが、私はここもスキップせずにクリアしたかったのです。

なので、この時点でアプリを実行していました。

Gradle周りの知識が足りないかもしれない

object heapの話に戻りますが、私が試行錯誤して、SHA1キーを発行するときには、gradle.propertiesは
「org.gradle.jvmargs=-XX\:MaxHeapSize\=256m -Xmx256m」
これだと通り、Run実行は通りませんでした。

その時のエラー内容

* What went wrong:
Gradle build daemon has been stopped: JVM garbage collector thrashing and after running out of JVM memory

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org
Finished with error: Gradle task assembleDebug failed with exit code 1

そして、Runを通すには、先ほどのgradle.propertiesに、
「org.gradle.jvmargs=-Xmx4096M」
を設定する必要がありました。
しかし、これだと「heapsizeが大きすぎるよ」ということでSHA-1キーの発行ができません。

私は、SHA-1キーがPC毎に同じであるという(一応仮説)を信じて、この「gradle.propertiesに記述するheapsizeの違い」を無視して先に進んでいました。Runが通ったので、下の画像のように、FirebaseはOKだよと言っているように見えます。

f:id:odekakeneko:20200505015948p:plain
Firebaseプロジェクト(アプリと連携)作成成功した時

しかし、SHA1キーを発行できた時のヒープサイズと、Runしてビルドが成功した時のヒープサイズが違うのです。これによってビルドされたアプリケーションにがFirebaseによって別のものと認識されている可能性もなくはない。

というわけで、もしかして私が3週間つまづいていたエラーってこういうことかなーということを書きました。

前回の記事ではドメインを取得してサイトを立ち上げまでしたのですが、ちょっとそれは意味がなかったかもしれません、、、

でも前向きに頑張ります。どうしてもFlutterで作りたいアプリがあり、Flutterがうまくなりたいのです。