[Flutter] Firebase Crashlytics

2023-03-18 hit count image

今回のブログポストではFlutterでFirebaseのCrashlyticsを連動して使う方法について説明します。

概要

今回のブログポストではFlutterで開発されたアプリが強制終了された時、これを感知するためFirebaseCrashlyticsを設定する方法について紹介します。

FirebaseCrashlyticsを使うためFlutterプロジェクトにfirebase_crashlyticsを設定して使う方法について説明します。

ブログシリーズ

このブログはシリーズで作成されております。次のリンクを使って他のブログポストは下記のリンクで確認できます。

Firebaseプロジェクト生成や設定

FlutterでFirebaseを使うためにはFirebaseプロジェクトを生成して、firebase_coreパッケージをインストールする必要があります。下記のリンクで詳しい内容を確認してください。

Firebaseプロジェクト設定

次はグーグルのファイアベース(Google Firebase)でプロジェクトにCrashlyticsを設定する必要があります。FirebaseのConsoleを移動した後、左メニューでCrashlyticsを選択します。

crashlytics add sdk

上にあるAdd SDKボタンを押してSDKを追加します。また、上のCrashlyticsタイトルの横にあるプロジェクトを選択してiOS/アンドロイドを変更して、Add SDKを押してiOSとアンドロイド、両方SDKを追加します。

firebase_crashlyticsインストール

FlutterプロジェクトでFirebase Crashlyticsを使うためにはfirebase_crashlyticsパッケージをインストールする必要があります。次のコマンドを実行してfirebase_crashlyticsパッケージをインストールします。

flutter pub add firebase_crashlytics

アンドロイドGradle修正

FlutterプロジェクトのアンドロイドでCrashlyticsを使うためにはGradleファイルを修正する必要があります。まず、android/app/build.gradleファイルを開いてファイルの下を次のように修正します。

...
android {
  ...
}

dependencies {
  ...
}

apply plugin: 'com.google.firebase.crashlytics' // <<<<<<<<<<<<< Add this

その後、android/build.gradleファイルを開いて下記のように修正します。

buildscript {
    ...
    dependencies {
        ...
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.14'
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' // <<<<<<<<<<<<<<<< Add this
    }
}

これでFlutterプロジェクトのアンドロイドでCrashlyticsを使う準備ができました。

firebase_crashlyticsの使い方

Flutterで次のようにfirebase_crashlyticsを使うと、アプリが強制終了された時、Firebase Crashlyticsにこれを報告することができます。

import 'dart:async';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';

Future<void> main() async {

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;

  runZonedGuarded(
    () {
      runApp(const MyApp());
    },
    (error, stack) => FirebaseCrashlytics.instance.recordError(
      error,
      stack,
      fatal: true,
    ),
  );
}

Flutterでエラーが発生する時、エラーをハンドリングする関数であるonErrorFirebaseCrashlyticsの関数を設定しました。

runZonedCuardedを使って、アプリが実行中強制終了された時エラーが記録されるようにしました。

強制終了テスト

次のコードを使うとアプリを強制終了させることができます。

FirebaseCrashlytics.instance.crash();

このコードをボタンや画面の移動などのイベントに連結して、アプリを強制終了させます。アプリが強制終了されたら、またアプリを実行してFirebase Crashlyticsに報告するようにします。

アプリの強制終了テストは端末で実行しなければならないし、強制終了後、Firebase Crashlyticsに報告できるように必ずアプリを再起動しなければならないです。

このように強制終了をしてFirebase Crashlyticsに報告をしたら、FirebaseのCrashlytics画面が次のように変更されたことが確認できます。

crashlytics error message list

また、Crashlyticsのエラーメッセージを選択すると次のようにThis is a test crash caused by calling .crash() in Dartと言うテストメッセージを確認することができます。

crashlytics error message list

アンドロイドのmultiDexEnabled

firebase_crashlyticsをインストールしてFlutterプロジェクトをアンドロイドで実行した時、Debug Consoleに次のようなエラーが発生しました。

Note: .pub-cache/hosted/pub.dartlang.org/firebase_core-1.0.4/android/src/main/java/io/flutter/plugins/firebase/core/FlutterFirebaseCorePlugin.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: .pub-cache/hosted/pub.dartlang.org/flutter_tts-3.0.0/android/src/main/java/com/tundralabs/fluttertts/FlutterTtsPlugin.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

Note: .pub-cache/hosted/pub.dartlang.org/firebase_crashlytics-2.0.1/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseCrashlyticsPlugin.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: .pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.0.1/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: .pub-cache/hosted/pub.dartlang.org/firebase_analytics-8.0.1/android/src/main/java/io/flutter/plugins/firebaseanalytics/FirebaseAnalyticsPlugin.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

これを解決するためにはmultiDexEnabledをアクティブにする必要があります。android/app/build.gradleファイルを開いて下記のように修正します。

defaultConfig {
    ...
    minSdkVersion 21
    targetSdkVersion 30
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
    multiDexEnabled true // <<<<<<<<<< Add this
}

完了

これでFLutterでFirebase Crashlyticsを使うためFlutterプロジェクトにfirebase_crashlyticsを設定する方法についてみてみました。これからFirebase Crashlyticsを使って開発したアプリの強制終了を分析してみてください。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts