Firebase Crashlytics はアプリのクラッシュレポートを収集するサービス。 アプリがクラッシュすると、スタックトレースや端末情報をFirebaseコンソールで確認できる。

Firebaseプロジェクトの作成から、サンプルアプリでテストクラッシュを発生させてコンソールで確認するまでの手順を説明する。

検証環境

項目バージョン
Android Gradle Plugin9.4.1
Gradle9.8.0
Firebase BoM34.19.0
Google Services Gradle Plugin4.5.0
Crashlytics Gradle Plugin3.0.8
エミュレータAndroid 16

Firebaseプロジェクトの作成

Firebaseコンソール を開き、「新しいFirebaseプロジェクトを作成」をクリックする。

プロジェクト名を入力して「続行」をクリックする。 プロジェクト名の下に表示されるプロジェクトIDは自動で生成される。

プロジェクト名の入力

次の画面で「FirebaseでGeminiを有効にする」の設定を選ぶ。 Crashlyticsの利用に必須ではないため、ここではオフにした。

続いてGoogleアナリティクスを有効にするか選ぶ。 Googleアナリティクスを有効にすると、Crashlyticsでパンくずリストのログ(クラッシュ前のユーザー操作の記録)を確認できる。 クラッシュレポートの収集だけであればGoogleアナリティクスは不要なので、ここではオフにして「プロジェクトを作成」をクリックする。

Googleアナリティクスの設定

しばらく待つと「Firebaseプロジェクトが準備できました」と表示されるので「続行」をクリックする。

Androidアプリの登録

プロジェクトの概要画面で「アプリを追加」をクリックする。 プラットフォームのアイコンが表示されるので、Androidのアイコンをクリックする。

Androidアプリの追加

Androidパッケージ名を入力して「アプリを登録」をクリックする。 パッケージ名はアプリのapplicationIdと一致させる。 ここではcom.example.crashlyticssampleとした。 アプリのニックネームは任意で、コンソール上での表示名に使われる。

アプリの登録

「google-services.jsonをダウンロード」をクリックして構成ファイルをダウンロードする。 ダウンロードしたgoogle-services.jsonはアプリモジュールのルートディレクトリ(app/)に配置する。

google-services.jsonのダウンロード

google-services.jsonにはAPIキーなどプロジェクトの識別子が含まれる。 公式ドキュメントによると、これらは秘密情報ではない。

「次へ」をクリックすると、Firebase SDKを追加するためのGradleの設定が表示される。 表示される設定は次の章で追加するので、「次へ」→「コンソールに進む」で画面を閉じる。

Firebase SDKの追加

Gradleの設定

Crashlyticsを使うには、Google Services Gradle Plugin、Crashlytics Gradle Plugin、Crashlytics SDKを追加する。

gradle/libs.versions.tomlにバージョンとライブラリ、プラグインを追加する。

[versions]
agp = "9.4.1"
firebaseBom = "34.19.0"
googleServices = "4.5.0"
crashlytics = "3.0.8"

[libraries]
firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" }
firebase-crashlytics = { module = "com.google.firebase:firebase-crashlytics" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
google-services = { id = "com.google.gms.google-services", version.ref = "googleServices" }
firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "crashlytics" }

プロジェクトルートのbuild.gradle.ktsにプラグインを追加する。

plugins {
    alias(libs.plugins.android.application) apply false
    alias(libs.plugins.google.services) apply false
    alias(libs.plugins.firebase.crashlytics) apply false
}

app/build.gradle.ktsにプラグインと依存を追加する。 Firebase BoMを使うと、各Firebaseライブラリのバージョン指定が不要になる。

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.google.services)
    alias(libs.plugins.firebase.crashlytics)
}

android {
    namespace = "com.example.crashlyticssample"
    compileSdk = 36

    defaultConfig {
        applicationId = "com.example.crashlyticssample"
        minSdk = 24
        targetSdk = 36
        versionCode = 1
        versionName = "1.0"
    }
}

dependencies {
    implementation(platform(libs.firebase.bom))
    implementation(libs.firebase.crashlytics)
}

Googleアナリティクスを有効にしたプロジェクトでパンくずリストのログを使う場合は、com.google.firebase:firebase-analyticsも依存に追加する。

テストクラッシュを発生させるコード

ボタンをタップするとRuntimeExceptionを投げるActivityを用意する。

package com.example.crashlyticssample

import android.app.Activity
import android.os.Bundle
import android.view.ViewGroup
import android.widget.Button
import android.widget.FrameLayout

class MainActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val crashButton = Button(this)
        crashButton.text = "Test Crash"
        crashButton.setOnClickListener {
            throw RuntimeException("Test Crash")
        }

        val layout = FrameLayout(this)
        layout.fitsSystemWindows = true
        layout.addView(
            crashButton,
            ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
        )
        setContentView(layout)
    }
}

Crashlyticsの初期化コードは不要。 SDKを依存に追加すると、アプリ起動時に自動で初期化される。

動作確認

Crashlyticsの初期化を確認する

Crashlyticsのデバッグログを有効にしてからアプリを起動すると、初期化の様子をLogcatで確認できる。

$ adb shell setprop log.tag.FirebaseCrashlytics DEBUG
$ adb logcat -s FirebaseCrashlytics
I FirebaseCrashlytics: Initializing Firebase Crashlytics 20.1.1 for com.example.crashlyticssample
D FirebaseCrashlytics: Crashlytics automatic data collection ENABLED by global Firebase setting.
...
D FirebaseCrashlytics: Successfully configured exception handler.

アプリを起動すると、Firebaseコンソールのクラッシュ画面が「アプリが検出されクラッシュを待機しています」に変わる。

クラッシュの待機

テストクラッシュを送信する

アプリの「TEST CRASH」ボタンをタップしてアプリをクラッシュさせる。

テストクラッシュボタン

クラッシュ時にLogcatへ以下のログが出力され、クラッシュレポートの送信処理が始まる。

D FirebaseCrashlytics: Sending report through Google DataTransport: 6AB736B700B8000113500A1D16438AA1
D FirebaseCrashlytics: Crashlytics report successfully enqueued to DataTransport: 6AB736B700B8000113500A1D16438AA1

公式ドキュメントでは、クラッシュ後にアプリを再起動してレポートを送信する手順になっている。 レポートが届かない場合はアプリを再起動する。

Firebaseコンソールで確認する

数分待ってからFirebaseコンソールのCrashlyticsの画面を開くと、クラッシュが問題として一覧に表示される。

Crashlyticsの問題一覧

問題をクリックすると詳細画面が表示される。 例外の種類やメッセージ、発生箇所(MainActivity.kt:16)を確認できる。

問題の詳細

詳細画面の「スタック トレース」タブではスタックトレースを確認できる。 端末名やOSバージョン、発生日時も表示される。

スタックトレース

参考