unity 2020.1以降の環境下でfirebase on the android実機を動かす

こんにちは。[もぐめっと](https://twitter.com/mogmet)です。

![IMG_4533.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/6ced314d-4a50-dd57-621e-11714a830d68.jpeg)

最近、お酒を飲みすぎてやらかしたので禁酒してます。

表題の件で、unity2020でfirebaseを使おうとすると、少しトラップがあったので共有しておきます。

## 概要

unity 2020.2.0a21 という攻めたα環境でandroidでのビルドを行ったところ下記エラーが発生しました

```
E/Unity: Failed to read Firebase options from the app's resources. Either make sure google-services.json is included in your build or specify options explicitly.
```

そのエラーに対する探検歴です。

## 解決法

調べたところマニュアルに対策が書かれていました。

[Add Firebase to your Unity project / Missing Firebase Android config file in Unity 2020.](https://firebase.google.com/docs/unity/setup#missing_firebase_android_config_file_in_unity_2020)

ちなみにマニュアル開くところからトラップなんですけど、↑のページなのですが、言語を日本語から英語にしないと出てきません。
しかも結構日本語で書かれてない他のKnown issuesがワラワラ出てくる。
Unity Package ManagerのインストールがUnityの外部依存関係マネージャー（略してEDM4U、以前はPlay Services ResolverまたはUnity Jar Resolverとかよばれていた）とコンフリクトしてるとか、
Unity 2018でUnity Package Managerを介してインストールするとネイティブ依存関係の一部を検出できないとかとか。。

詳しくは英語で見てくださいっ！

話を戻すと、かのURLに書いてあることは、こんな事が書いてあります。
> In order to support versions of Unity that do not have the ability to customize the Gradle build, the Firebase editor tool generates Assets/Plugins/Android/Firebase/res/values/google-services.xml as an Android resource to be packaged into an Android build, so that the Firebase SDK can use it to initialize the default FirebaseApp instance.
> In Unity 2020, all Android resources must be in directories with a .androidlib suffix. If your project is using a Firebase SDK that generates an Assets/Plugins/Android/Firebase directory, rename it to Assets/Plugins/Android/Firebase.androidlib. Make sure it contains AndroidManifest.xml, project.properties and res/values/google-services.xml.

つまり、Unity2020からはandroidのリソースをおいてるディレクトリは.androidlibのsuffixついてないとだから、**Assets/Plugins/Android/Firebase**にgoogle-services.xmlとか諸々必要ファイルおいてあったら **Assets/Plugins/Android/Firebase.androidlib** にディレクトリ名変えてくれよな！

ってことらしい。

ディレクトリ名を変えてみたら無事androidのビルドが通ることができました。

## 恒久対応

この対応ですとなにかのはずみでAssets/Plugins/Android/Firebaseディレクトリが復活したりして二重管理みたいになってました。
そのため、その対応策としてとりあえずシンボリックリンクを張ってどちらでも同じファイルを見るように解決できました。

```
$ ln -s Assets/Plugins/Android/Firebase Assets/Plugins/Android/Firebase.androidlib
```

## その他の対応方法

公式firebaseアカウントがリツイートしていましたが、こんな方法もあるようです。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Firebase does work with Unity 2020.1, but it requires a little configuration right now. Temporary workaround as a thread.<br><br>1/n</p>&mdash; 🔥👾Patrick👾🔥 (@pux0r3) <a href="https://twitter.com/pux0r3/status/1288522140988223488?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">First I&#39;d recommend using the Unity Package Manager so you can update when needed. This isn&#39;t required.<a href="https://t.co/7IVGq8ixLL">https://t.co/7IVGq8ixLL</a><br><br>2/n <a href="https://t.co/fn97Pjrm7q">pic.twitter.com/fn97Pjrm7q</a></p>&mdash; 🔥👾Patrick👾🔥 (@pux0r3) <a href="https://twitter.com/pux0r3/status/1288522372912316416?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Next you&#39;ll want to use a custom main gradle template and a custom gradle properties template.<br><br>3/n <a href="https://t.co/K3RpashXnf">pic.twitter.com/K3RpashXnf</a></p>&mdash; 🔥👾Patrick👾🔥 (@pux0r3) <a href="https://twitter.com/pux0r3/status/1288522734402588672?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Add this block of code to the end of your `mainTemplate.gradle` file:<a href="https://t.co/8Ze5ZK5q0g">https://t.co/8Ze5ZK5q0g</a><br><br>This is so Firebase can read the google-services.xml file generated by EDM4U from your google-services.json file.<br><br>4/n</p>&mdash; 🔥👾Patrick👾🔥 (@pux0r3) <a href="https://twitter.com/pux0r3/status/1288523324444696577?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Now in `<a href="https://t.co/zcvL5FxDr1">https://t.co/zcvL5FxDr1</a>`, add the following two lines to the end:<br>```<br>android.useAndroidX=true<br>android.enableJetifier=true<br>```<br><br>This is added to `mainTemplate.gradle` by EDM4U, but the way that happens doesn&#39;t work with Unity 2020.1<br><br>5/n</p>&mdash; 🔥👾Patrick👾🔥 (@pux0r3) <a href="https://twitter.com/pux0r3/status/1288523661977108480?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Finally: restart Unity. Unity 2020.1 doesn&#39;t pick up on these changes and the project in your `Temp/` directory will still be in a bad state.<br><br>Now you should be able to Build and Run in Unity. Again, this is a temporary workaround.<br><br>6/n, n=6</p>&mdash; 🔥👾Patrick👾🔥 (@pux0r3) <a href="https://twitter.com/pux0r3/status/1288524065330704384?ref_src=twsrc%5Etfw">July 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

同じ方法はこの[issue](https://github.com/firebase/quickstart-unity/issues/677)でも上がってました。

ただ、結局マニュアルに書いてある方法で解決できたためこちらの方法は試してはいないです。

## [@mogmet](https://twitter.com/mogmet)の所感

unity2020自体がまだ出たてで少し発展途上なところがあるので使う方は人柱覚悟で行く必要がありそうです。
ただ、unity2020.2からはC#8になって、目玉機能であるnull許容参照型が使えるようになるので早くまともに使えるようになってほしいですね。