Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

FirebaseCrashlyticsのクラッシュレポートをカスタマイズする

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このガイドでは、Crashlytics API を使用してクラッシュ レポートをカスタマイズする方法について説明します。デフォルトでは、Crashlytics はアプリのすべてのユーザーのプラットフォーム ネイティブのクラッシュ レポートを自動的に収集します (代わりに、自動クラッシュ レポートをオフにして、ユーザーのオプトインレポートを有効にすることもできます)。 Crashlytics には、カスタム キーカスタム ログユーザー識別子キャッチされた例外とキャッチされなかった例外の 5 つのロギング メカニズムが用意されています。

Flutter アプリの場合、ユーザーがアプリケーションを再起動しなくても、致命的なレポートがリアルタイムで Crashlytics に送信されます。致命的でないレポートはディスクに書き込まれ、次の致命的なレポートと共に、またはアプリの再起動時に送信されます。

キャッチされなかった例外を報告する

FlutterError.onErrorFirebaseCrashlytics.instance.recordFlutterFatalErrorでオーバーライドすることにより、Flutter フレームワーク内でスローされるすべての「致命的な」エラーを自動的にキャッチできます。または、「致命的ではない」例外もキャッチするには、 FlutterError.onErrorFirebaseCrashlytics.instance.recordFlutterErrorでオーバーライドします。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

非同期エラー

非同期エラーは Flutter フレームワークによってキャッチされません。

ElevatedButton(
  onPressed: () async {
    throw Error();
  }
  ...
)

このようなエラーをキャッチするには、 PlatformDispatcher.instance.onErrorハンドラーを使用できます。

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

Flutter 以外のエラー

Flutter コンテキスト外で発生したエラーをキャッチするには、現在のIsolateにエラー リスナーをインストールします。

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

キャッチされた例外を報告する

Crashlytics では、アプリのクラッシュを自動的に報告するだけでなく、致命的ではない例外を記録し、次に致命的なイベントが報告されたとき、またはアプリの再起動時にそれらを送信できます。

アプリの catch ブロックに致命的ではない例外を記録するには、 recordErrorメソッドを使用します。例えば:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

informationプロパティを使用して、エラーに関する詳細情報をログに記録することもできます。

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

これらの例外は、Firebase コンソールでは致命的ではない問題として表示されます。問題の概要には、クラッシュから通常得られるすべての状態情報と、バージョンおよびハードウェア デバイスごとの内訳が含まれています。

Crashlytics は専用のバックグラウンド スレッドで例外を処理し、アプリのパフォーマンスへの影響を最小限に抑えます。ユーザーのネットワーク トラフィックを削減するために、Crashlytics は必要に応じて、デバイスから送信されるレポートの数をレート制限します。

カスタム キーを追加する

カスタム キーは、クラッシュにつながるアプリの特定の状態を取得するのに役立ちます。任意のキーと値のペアをクラッシュ レポートに関連付けてから、カスタム キーを使用して、Firebase コンソールでクラッシュ レポートを検索およびフィルタリングできます。

  • Crashlytics ダッシュボードで、カスタム キーに一致する課題を検索できます。

  • コンソールで特定の問題を確認している場合、各イベントに関連付けられているカスタム キーを表示し ( [キー] サブタブ)、カスタム キーでイベントをフィルター処理することもできます (ページ上部の [フィルター] メニュー)。

キーと値のペアを設定するには、 setCustomKeyインスタンス メソッドを使用します。ここではいくつかの例を示します。

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

カスタム ログ メッセージを追加する

クラッシュに至るイベントのコンテキストをより詳細に把握するために、カスタム Crashlytics ログをアプリに追加できます。 Crashlytics はログをクラッシュ データに関連付け、 Firebase コンソールの [Crashlytics Logs ] タブに表示します。

logを使用して問題を特定します。例えば:

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

ユーザー識別子を設定する

問題を診断するには、どのユーザーが特定のクラッシュを経験したかを知ることが役立つことがよくあります。 Crashlytics には、クラッシュ レポートでユーザーを匿名で識別する方法が含まれています。

レポートにユーザー ID を追加するには、ID 番号、トークン、またはハッシュ値の形式で一意の識別子を各ユーザーに割り当てます。

FirebaseCrashlytics.instance.setUserIdentifier("12345");

設定後にユーザー識別子をクリアする必要がある場合は、値を空白文字列にリセットします。ユーザー ID をクリアしても、既存の Crashlytics レコードは削除されません。ユーザー ID に関連付けられたレコードを削除する必要がある場合は、 Firebase サポートにお問い合わせください。

オプトイン レポートを有効にする

デフォルトでは、Crashlytics はアプリのすべてのユーザーのクラッシュ レポートを自動的に収集します。ユーザーが送信するデータをより詳細に制御できるようにするには、自動レポートを無効にし、コードで選択した場合にのみデータを Crashlytics に送信することで、オプトイン レポートを有効にすることができます。

  1. 自動収集をネイティブにオフにします。

    Apple プラットフォーム

    Info.plistファイルに新しいキーを追加します。

    • キー: FirebaseCrashlyticsCollectionEnabled
    • 値: false

    アンドロイド

    AndroidManifest.xmlファイルのapplicationブロックで、 meta-dataタグを追加して自動収集をオフにします。

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. 実行時に Crashlytics データ コレクションのオーバーライドを呼び出して、選択したユーザーのコレクションを有効にします。

    オーバーライド値はアプリの起動後も保持されるため、Crashlytics は自動的にレポートを収集できます。自動クラッシュ レポートをオプトアウトするには、オーバーライド値としてfalseを渡します。 falseに設定すると、新しい値はアプリの次回の実行まで適用されません。

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

Crash Insights データの管理

Crash Insights は、匿名化されたスタック トレースを他の Firebase アプリからのトレースと比較し、問題がより大きな傾向の一部であるかどうかを知らせることで、問題の解決に役立ちます。多くの問題について、Crash Insights はクラッシュのデバッグに役立つリソースも提供します。

Crash Insights は、集約されたクラッシュ データを使用して、一般的な安定性の傾向を特定します。アプリのデータを共有したくない場合は、 Firebase コンソールの Crashlytics の問題リストの上部にあるCrash Insightsメニューから Crash Insights をオプトアウトできます。