Oculus Integration で Firebase Analytics と Crashlytics を設定する

# はじめに
Oculus アプリで Firebase Analytics と Crashlytics を実装したので、備忘録としてまとめました。

### Firebase とは
アプリを開発の際に、ユーザーベースを拡大、収益を高めるためのツールです。Firebaseを使えば、インフラ構築に手間取ることなくビジネスを収益化し、効率よくアプリを開発し、運用・管理することができるようになります。
![image00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/8d29a53d-8d7d-b57c-48fc-2b3acd2e3e4b.png)

* スマホアプリでの実装
  * [Flutter アプリに Firebase を追加する](https://qiita.com/nekoharuyuki/items/88ad77d8025ada858404)
  * [FlutterとFirebaseでログイン画面を実装する](https://qiita.com/nekoharuyuki/items/4bc57b8252ef9814ef32)
* Firebaseの基礎的な使い方
  * [サーバーレス開発プラットフォーム Firebase入門](https://amzn.to/3wkAM4y)

# 事前準備

* [Oculus Integration](https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022?locale=ja-JP)
* [Firebase](https://firebase.google.com/) のアカウント
  * 詳細 : [Analytics / Crashlytics](https://firebase.google.com/products-release)

# 実装

## Firebaseをインストールする
* 1.["UnityプロジェクトにFirebaseを追加する"](https://firebase.google.com/docs/unity/setup) の記事に記載されているステップ1〜4に従って実装します。
※　ステップ5はサンプルコードに含まれているため、必須ではありません。
  * [ステップ 1: Firebase プロジェクトを作成する](https://firebase.google.com/docs/unity/setup#create-firebase-project)
  * [ステップ 2: アプリを Firebase に登録する](https://firebase.google.com/docs/unity/setup#register-app)
  * [ステップ 3: Firebase 構成ファイルを追加する](https://firebase.google.com/docs/unity/setup#add-config-file)
  * [ステップ 4: Firebase Unity SDK を追加する](https://firebase.google.com/docs/unity/setup#add-sdks)

* 2.ダウンロードした `firebase_unity_sdk`から、` dotnet4 / FirebaseAnalytics.unitypackage`と `dotnet4 / FirebaseCrashlytics.unitypackage`をインポートします。
  * Firebase Unity SDK は [こちら](https://firebase.google.com/download/unity) からもダウンロードできます。
 
* 3.AndroidAuto-Resolver が有効でない場合、必ず有効に設定します。
`Assets > Play Serveces Resolver > Android Resolver -> Settings`
![スクリーンショット 2022-01-31 16.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/afcc5f3d-a009-9709-911c-c921eae93d9c.png)
* 4.テンプレート `google-services.json`を独自のものに置き換えます。
テンプレートは下記の場所に保存されているので上書きします。
![スクリーンショット 2022-01-31 16.00.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/75785def-f233-6607-6417-cb45f17135c0.png)

## プロジェクトコードを有効にする
Firebase Analytics と Crashlytics がプロジェクトに追加されたら、Oculusメニューからサンプルコードを有効にします： `Oculus> Samples> Firebase> Enable Firebase Sample`
![スクリーンショット 2022-01-31 15.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/fc2c79ae-c4b6-add7-a670-081830adfa8f.png)

## 'unsafe'を許可する
クラッシュを強制する的に発生させるために、Crashlyticsサンプルでは `C＃`の `unsafe`キーワードを使用しています。これはデフォルトでは禁止されているのでunityで設定して動作できるようにする必要があります。`unsafe`キーワードは、プレーヤーの設定で有効にする事ができます。 ： `Edit > Project Settings... > Player > Android settings > Allow 'unsafe' code`
![スクリーンショット 2022-01-31 16.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/0104aace-f881-6410-4b77-82c482caf86f.png)
## ビルドして実行
この時点で、サンプルシーンを開いて、いくつかのイベントとクラッシュをトリガーできるはずです。レポートは、[Firebaseコンソール](https://console.firebase.google.com/) で確認できます。

自分の作成したアプリへも、 `StartCrashlytics.cs` を使用するだけで簡単にクラッシュを解析する事ができます。
## symbols.zip ファイルをFirebaseにアップロードする
Scripting Backend を IL2CPP に設定してビルドし、symbols.zip を作成して Firebase にアップロードするとより詳細なクラッシュ報告を確認することが出来ます。
![スクリーンショット 2022-02-02 17.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/594f5c60-6e06-060e-3a96-86f48fe109d1.png)
[Firebase CLI](https://firebase.google.com/docs/cli) コマンドを実行して、生成した Crashlytics 互換のシンボル ファイルを Firebase サーバーにアップロードします。

```
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
```

FIREBASE_APP_ID: Firebase Android アプリ ID（パッケージ名ではありません）
Firebase Android アプリ ID の例: 1:567383003300:android:17104a2ced0c9b9b

### Firebase アプリ ID を確認する方法
google-services.json の mobilesdk_app_id に記載されています。

Unity 内で直接 APK をビルドした場合: PATH/TO/SYMBOLS は、ビルドが完了したときにプロジェクトのルート ディレクトリに生成される、圧縮されたシンボル ファイルのパスです（例: `myproject/myapp-1.0-v100.symbols.zip` ）。

最後に、強制的にテスト クラッシュを発生させて Crashlytics の設定を完了し、Firebase コンソールの Crashlytics ダッシュボードで最初のデータを確認します。

https://firebase.google.com/docs/crashlytics/ndk-reports?hl=ja#alternative-options-symbol-uploading