Firebase Crashlytics を使ってみる


このクイックスタートでは、Firebase コンソールで包括的なクラッシュ レポートを表示できるよう、Firebase Crashlytics SDK を使用してアプリに Firebase Crashlytics を設定する方法について説明します。

Crashlytics を設定するには、Firebase コンソールと IDE の両方でタスク(Firebase 構成ファイルと Crashlytics SDK の追加など)を行う必要があります。設定を完了するには、強制的にテスト クラッシュを発生させて、最初のクラッシュ レポートを Firebase に送信する必要があります。

始める前に

  1. まだ追加していない場合は、Unity プロジェクトに Firebase を追加します。Unity プロジェクトがない場合は、サンプルアプリをダウンロードできます。

  2. 推奨: パンくずリストのログを自動的に取得して、クラッシュ イベント、非致命的イベント、ANR イベントに至るまでのユーザー操作を把握するには、Firebase プロジェクトで Google Analytics を有効にする必要があります。

    • 既存の Firebase プロジェクトで Google Analytics が有効になっていない場合は、Firebase コンソールで [] > [プロジェクトの設定] の [統合] タブGoogle Analytics を有効にします。

    • 新しい Firebase プロジェクトを作成する場合は、プロジェクトの作成ワークフローで Google Analytics を有効にします。

ステップ 1: アプリに Crashlytics SDK を追加する

Firebase プロジェクトに Unity プロジェクトが登録されている場合は、すでに Firebase Unity SDK をダウンロードし、次の手順で説明するパッケージを追加している可能性があります。

  1. Firebase Unity SDK をダウンロードし、適切な場所で解凍します。 Firebase Unity SDK はプラットフォーム固有ではありません。

  2. 開いている Unity プロジェクトで、[Assets] > [Import Package] > [Custom Package] を選択します。

  3. 解凍した SDK の中から Crashlytics SDK(FirebaseCrashlytics.unitypackage)を選択してインポートします。

    パンくずリストのログを利用するには、Google Analytics 用の Firebase SDK もアプリ(FirebaseAnalytics.unitypackage)に追加します。Firebase プロジェクトで Google アナリティクスが有効になっていることを確認してください。

  4. [Import Unity Package] ウィンドウで [Import] をクリックします。

ステップ 2: Crashlytics を初期化する

  1. 新しい C# スクリプトを作成して、シーン内の GameObject に追加します。

    1. 最初のシーンを開き、空の GameObject を作成します(CrashlyticsInitializer という名前を付けます)。

    2. 新しいオブジェクトに対して、[Inspector] で [Add Component] をクリックします。

    3. CrashlyticsInit スクリプトを選択して、CrashlyticsInitializer オブジェクトに追加します。

  2. スクリプトの Start メソッドで Crashlytics を初期化します。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    // Import Firebase and Crashlytics
    using Firebase;
    using Firebase.Crashlytics;
    
    public class CrashlyticsInit : MonoBehaviour {
        // Use this for initialization
        void Start () {
            // Initialize Firebase
            Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
                var dependencyStatus = task.Result;
                if (dependencyStatus == Firebase.DependencyStatus.Available)
                {
                    // Create and hold a reference to your FirebaseApp,
                    // where app is a Firebase.FirebaseApp property of your application class.
                    // Crashlytics will use the DefaultInstance, as well;
                    // this ensures that Crashlytics is initialized.
                    Firebase.FirebaseApp app = Firebase.FirebaseApp.DefaultInstance;
    
                    // When this property is set to true, Crashlytics will report all
                    // uncaught exceptions as fatal events. This is the recommended behavior.
                    Crashlytics.ReportUncaughtExceptionsAsFatal = true;
    
                    // Set a flag here for indicating that your project is ready to use Firebase.
                }
                else
                {
                    UnityEngine.Debug.LogError(System.String.Format(
                      "Could not resolve all Firebase dependencies: {0}",dependencyStatus));
                    // Firebase Unity SDK is not safe to use here.
                }
            });
        }
    
      // Update is called once per frame
      void Update()
        // ...
    }

ステップ 3:(Android のみ)シンボルのアップロードを設定する

このステップは、IL2CPP を使用する Android アプリでのみ必要です。

  • Unity の Mono スクリプト バックエンドを使用する Android アプリの場合、これらの手順は必要ありません。

  • Apple プラットフォーム アプリの場合、Xcode プロジェクトでのシンボルのアップロードが Firebase Unity Editor プラグインによって自動的に構成されるため、これらの手順は必要ありません。

Crashlytics の Unity SDK 8.6.1 以降には、NDK クラッシュ レポートが自動的に含まれます。これにより、Crashlytics は Android 上で Unity IL2CPP のクラッシュを自動的に報告できます。ただし、Crashlytics ダッシュボードにネイティブ ライブラリのクラッシュのシンボリケートされたスタック トレースを表示するには、Firebase CLI を使用してビルド時にシンボル情報をアップロードする必要があります。

シンボルのアップロードを設定するには、Firebase CLI をインストールするの手順に沿って操作します。

すでに CLI がインストールされている場合は、最新バージョンに更新してください。

ステップ 4: プロジェクトをビルドしてシンボルをアップロードする

iOS+(Apple プラットフォーム)

  1. [Build Settings] ダイアログで、プロジェクトを Xcode ワークスペースにエクスポートします。

  2. アプリをビルドします。

    Apple プラットフォームの場合は、Firebase Unity Editor プラグインによって Xcode プロジェクトが自動的に構成され、ビルドを行うたびに Crashlytics 対応のシンボル ファイルが生成されて Firebase サーバーにアップロードされます。

Android

  1. [Build Settings] ダイアログで、次のいずれかを行います。

    • Android Studio プロジェクトにエクスポートして、プロジェクトをビルドします。

    • APK を Unity Editor から直接ビルドします。
      ビルドする前に、[Build Settings] ダイアログで [Create symbols.zip] チェックボックスがオンになっていることを確認します。

  2. ビルドが完了したら、次の Firebase 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

    • PATH/TO/SYMBOLS: CLI によって生成されたシンボル ファイルへのパス

      • Android Studio プロジェクトにエクスポートした場合: PATH/TO/SYMBOLSunityLibrary/symbols ディレクトリであり、Gradle または Android Studio でアプリをビルドすると、エクスポートされたプロジェクトのルートに作成されます。

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

    Firebase CLI コマンドでシンボル ファイルの生成とアップロードを行う際に使用される高度なオプションを表示する

    フラグ 説明
    --generator=csym

    デフォルトの Breakpad ジェネレーターではなく、古い cSYM シンボル ファイル ジェネレーターを使用します。

    このオプションの使用は推奨されません。デフォルトの Breakpad シンボル ファイル ジェネレーターを使用することをおすすめします。

    --generator=breakpad

    Breakpad シンボル ファイル ジェネレーターを使用します。

    デフォルトのシンボル ファイル生成は Breakpad です。このフラグは、ビルド構成に symbolGenerator { csym() } を追加したが、それをオーバーライドして Breakpad を使用する場合のみ使用します。

    --dry-run

    シンボル ファイルを生成するがアップロードは行いません。

    このフラグは、送信されるファイルの内容を調べる場合に役立ちます。

    --debug 追加のデバッグ情報が提供されます。

ステップ 5: 強制的にテスト クラッシュを発生させて設定を完了する

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

  1. 既存の GameObject を探して、次のスクリプトを追加します。このスクリプトは、アプリが実行されてから数秒後にテスト クラッシュを発生させます。

    using System;
    using UnityEngine;
    
    public class CrashlyticsTester : MonoBehaviour {
    
        int updatesBeforeException;
    
        // Use this for initialization
        void Start () {
          updatesBeforeException = 0;
        }
    
        // Update is called once per frame
        void Update()
        {
            // Call the exception-throwing method here so that it's run
            // every frame update
            throwExceptionEvery60Updates();
        }
    
        // A method that tests your Crashlytics implementation by throwing an
        // exception every 60 frame updates. You should see reports in the
        // Firebase console a few minutes after running your app with this method.
        void throwExceptionEvery60Updates()
        {
            if (updatesBeforeException > 0)
            {
                updatesBeforeException--;
            }
            else
            {
                // Set the counter to 60 updates
                updatesBeforeException = 60;
    
                // Throw an exception to test your Crashlytics implementation
                throw new System.Exception("test exception please ignore");
            }
        }
    }
  2. アプリをビルドし、ビルドの完了後にシンボル情報をアップロードします。

    • iOS+: Firebase Unity Editor プラグインが、シンボル ファイルをアップロードするように Xcode プロジェクトを自動的に構成します。

    • Android: IL2CPP を使用する Android アプリの場合は、Firebase CLI の crashlytics:symbols:upload コマンドを実行して、シンボル ファイルをアップロードします。

  3. アプリを実行します。アプリを実行したら、デバイスログを監視し、CrashlyticsTester で例外がトリガーされるのを待ちます。

    • iOS+: Xcode の下部ペインでログを確認します。

    • Android: ターミナルで adb logcat コマンドを実行してログを確認します。

  4. Firebase コンソールの Crashlytics ダッシュボードに移動して、テスト クラッシュを確認します。

    コンソールを更新し、5 分経過してもテスト クラッシュが表示されない場合は、デバッグ ロギングを有効にして、アプリがクラッシュ レポートを送信しているかどうかを確認してください。


これで完了です。Crashlytics がアプリのクラッシュをモニタリングするようになりました。すべてのレポートと統計情報を参照して調査するには、Crashlytics ダッシュボードにアクセスします。

次のステップ

  • (推奨) IL2CPP を使用する Android アプリの場合、GWP-ASan レポートを収集すると、ネイティブ メモリエラーに起因するクラッシュのデバッグに役立つ情報が得られます。このようなメモリ関連のエラーは、アプリのセキュリティの脆弱性の主な原因である、アプリ内のメモリ破損に関連している可能性があります。このデバッグ機能を利用するには、アプリで最新の Crashlytics SDK for Unity(v10.7.0 以降)を使用しており、GWP-ASan を明示的に有効にしていることを確認してください(アプリ マニフェストを変更する必要があります)。
  • Android アプリのクラッシュ レポートを Crashlytics ダッシュボードから直接 Google Play トラックでフィルタリングできるように、Google Play と統合する。これにより、ダッシュボードで特定のビルドに注目できます。