Firebase スイートには、アプリが陥っている可能性のある問題について、明確で実用的なインサイトやレポートを得ることができるモジュールがあります。これは、ユーザーにとって重要なプロダクションアプリを構築している場合には特に強力です。ログファイルの調査に1秒でも多くの時間を費やすことは、ユーザーの不満や収益の損失につながります。

Firebase Crashlytics は、軽量でリアルタイムなクラッシュレポーターであり、アプリの品質を低下させる安定性の問題を追跡し、優先順位をつけて修正するのに役立ちます。クラッシュをインテリジェントにグループ化し、クラッシュに至るまでの状況をハイライト表示することで、トラブルシューティングの時間を短縮します。

特定のクラッシュが多くのユーザーに影響を与えているかどうかを知ることができます。問題が突然深刻さを増したときにはアラートを受け取ることができ、クラッシュの原因となっているコードの行をピンポイントで特定することもできます。

主な機能は以下の通りです。

  1. クラッシュレポートを収集し、コンテキスト情報を提供するとともに、クラッシュの重大性と普及率を強調します。
    1. 「Crashlytics」は、一般的な安定性の問題を強調し、トラブルシューティング、トリアージ、解決を容易にするリソースを提供する有用なヒントである「Crash Insights」を提供します。
  2. Analytics」との統合
  3. リアルタイムのアラート機能

それでは、Crashlyticsの設定と使用方法について説明します。

Step 1: Firebase をプロジェクトに追加する

Crashlytics は firebase 製品群の 1 つであるため、プロジェクトに firebase を追加する必要があります。その方法については、こちらで詳しく説明しています。

ステップ 2: Firebase ConsoleCrashlytics を有効にします。

  • MARKDOWN_HASH6c036a1311e0bb4621e83faa6761efa3MARKDOWNHASH の [Crashlytics dashboard](https://console.firebase.google.com/project//crashlytics)にアクセスします。

  • ページ上部のCrashlyticsの隣にあるドロップダウンから自分のアプリが選択されていることを確認します。

  • Enable Crashlyticsをクリックします。

ステップ3:Firebase Crashlyticsプラグインをアプリに追加します。

この作業は、projects/build.gradleファイルで行います。以下のコードを参考にしてください。

buildscript {
    repositories {
        // Check that you have Google's Maven repository (if not, add it).
        google()
    }

    dependencies {
        // ...

        // Check that you have the Google services Gradle plugin v4.3.2 or later
        // (if not, add it).
        classpath 'com.google.gms:google-services:4.3.10'

        // Add the Crashlytics Gradle plugin
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
    }
}

allprojects {
    repositories {
        // Check that you have Google's Maven repository (if not, add it).
        google()
    }
}

その後、app/build.gradleに移動して、ファイルの一番上にあるcrashlyticsプラグインを適用します。

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin

// Apply the Crashlytics Gradle plugin
apply plugin: 'com.google.firebase.crashlytics'

Step 4: 依存関係の追加

アプリにFirebase Crashlytics SDKを追加します。これは、app/build.gradleファイルのdependenciesクロージャ内で行います。

Kotlinプロジェクトの場合。

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:28.4.1')

    // Declare the dependencies for the Crashlytics and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ktx'
    implementation 'com.google.firebase:firebase-analytics-ktx'
}

Javaプロジェクトの場合。

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:28.4.1')

    // Declare the dependencies for the Crashlytics and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics'
    implementation 'com.google.firebase:firebase-analytics'
}

ステップ 5: テストの実行

そう、Crashlyticsの設定を終えるためには、強制的にテストを行う必要があります。これは、Crashlyticsのダッシュボードで結果を見るために、意図的にクラッシュを起こさせることを意味します。

例えば、アプリにボタンを追加して、クリックされるとアプリをクラッシュさせることができます。以下にコード例を示します。

Kotlinの場合。

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

addContentView(crashButton, ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT,
       ViewGroup.LayoutParams.WRAP_CONTENT))

そして、Javaの場合。

Button crashButton = new Button(this);
crashButton.setText("Test Crash");
crashButton.setOnClickListener(new View.OnClickListener() {
   public void onClick(View view) {
       throw new RuntimeException("Test Crash"); // Force a crash
   }
});

addContentView(crashButton, new ViewGroup.LayoutParams(
       ViewGroup.LayoutParams.MATCH_PARENT,
       ViewGroup.LayoutParams.WRAP_CONTENT));

アプリを実行します。ボタンを押すと、アプリがクラッシュします。テストのクラッシュを確認するには、MARKDOWN_HASH6c036a1311e0bb4621e83faa6761efa3MARKDOWNHASHの[Crashlytics dashboard](https://console.firebase.google.com/project//crashlytics)に移動してください。

以上でテストは終了です。

それでは、いくつかの簡単な例を見てみましょう。

例 1: Firebase Crashlytics の例 – Kotlin と Java

これはシンプルな Firebase の Crashlytics の例です。2つの activities があり、1つは Kotlin で、もう1つは Java で書かれています。

Step 1: プロジェクトへの Firebase の追加

こちら](https://camposha.info/android-examples/add-firebase-to-android/)にあるようにFirebaseをプロジェクトに追加します。

ステップ2: 依存関係の追加

プロジェクトに依存関係を追加する必要があります。ここでは、Crashlyticsの依存関係を追加します。app/build.gradle`に以下のように依存関係を追加します。

dependencies {
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'

    implementation 'com.google.firebase:firebase-crashlytics:18.2.0'
    implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.0'

    // For an optimal experience using Crashlytics, add the Firebase SDK
    // for Google Analytics. This is recommended, but not required.
    implementation 'com.google.firebase:firebase-analytics:19.0.0'
}

ステップ 3: インターネットアクセス権の追加

Firebase に接続するためには、インターネットパーミッションが必要です。AndroidManifest.xmlファイルに以下のパーミッションを追加します。

  <uses-permission android:name="android.permission.INTERNET"/>

Step 4: レイアウトの作成

このレイアウトは本当に必要ありません。使うこともありません。しかし、プロジェクト内のすべてのコードを示すために、ここに記載します。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"/>
</RelativeLayout>

Step 5: コードを書く

ここでは、Kotlin と Java の両方のコードを書きます。ここでは、Kotlinのメインとなるactivityを紹介します。

MainActivity.kt <!

import android.os.Bundle
import android.view.ViewGroup
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.crashlytics.ktx.setCustomKeys
import com.google.firebase.ktx.Firebase

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    fun setKeysBasic() {
        // [START crash_set_keys_basic]
        val crashlytics = Firebase.crashlytics
        crashlytics.setCustomKeys {
            key("my_string_key", "foo") // String value
            key("my_bool_key", true)    // boolean value
            key("my_double_key", 1.0)   // double value
            key("my_float_key", 1.0f)   // float value
            key("my_int_key", 1)        // int value
        }
        // [END crash_set_keys_basic]
    }

    fun resetKey() {
        // [START crash_re_set_key]
        val crashlytics = Firebase.crashlytics
        crashlytics.setCustomKeys {
            key("current_level", 3)
            key("last_UI_action", "logged_in")
        }
        // [END crash_re_set_key]
    }

    fun logReportAndPrint() {
        // [START crash_log_report_and_print]
        Firebase.crashlytics.log("message")
        // [END crash_log_report_and_print]
    }

    fun logReportOnly() {
        // [START crash_log_report_only]
        Firebase.crashlytics.log("message")
        // [END crash_log_report_only]
    }

    fun enableAtRuntime() {
        // [START crash_enable_at_runtime]
        Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)
        // [END crash_enable_at_runtime]
    }

    fun setUserId() {
        // [START crash_set_user_id]
        Firebase.crashlytics.setUserId("user123456789")
        // [END crash_set_user_id]
    }

    @Throws(Exception::class)
    fun methodThatThrows() {
        throw Exception()
    }

    fun logCaughtEx() {
        // [START crash_log_caught_ex]
        try {
            methodThatThrows()
        } catch (e: Exception) {
            Firebase.crashlytics.recordException(e)
            // handle your exception here
        }
        // [END crash_log_caught_ex]
    }

    fun forceACrash() {
        // [START crash_force_crash]
        val crashButton = Button(this)
        crashButton.text = "Crash!"
        crashButton.setOnClickListener {
            throw RuntimeException() // Force a crash
        }

        addContentView(crashButton, ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT))
        // [END crash_force_crash]
    }
}

そして、これがJava用のコードです。

MainActivity.java です。

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.google.firebase.crashlytics.FirebaseCrashlytics;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void setKeysBasic() {
        // [START crash_set_keys_basic]
        FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

        crashlytics.setCustomKey("my_string_key", "foo" /* string value */);

        crashlytics.setCustomKey("my_bool_key", true /* boolean value */);

        crashlytics.setCustomKey("my_double_key", 1.0 /* double value */);

        crashlytics.setCustomKey("my_float_key", 1.0f /* float value */);

        crashlytics.setCustomKey("my_int_key", 1 /* int value */);
        // [END crash_set_keys_basic]
    }

    public void resetKey() {
        // [START crash_re_set_key]
        FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

        crashlytics.setCustomKey("current_level", 3);
        crashlytics.setCustomKey("last_UI_action", "logged_in");
        // [END crash_re_set_key]
    }

    public void logReportAndPrint() {
        // [START crash_log_report_and_print]
        FirebaseCrashlytics.getInstance().log("message");
        // [END crash_log_report_and_print]
    }

    public void logReportOnly() {
        // [START crash_log_report_only]
        FirebaseCrashlytics.getInstance().log("message");
        // [END crash_log_report_only]
    }

    public void enableAtRuntime() {
        // [START crash_enable_at_runtime]
        FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
        // [END crash_enable_at_runtime]
    }

    public void setUserId() {
        // [START crash_set_user_id]
        FirebaseCrashlytics.getInstance().setUserId("user123456789");
        // [END crash_set_user_id]
    }

    public void methodThatThrows() throws Exception {
        throw new Exception();
    }

    public void logCaughtEx() {
        // [START crash_log_caught_ex]
        try {
            methodThatThrows();
        } catch (Exception e) {
            FirebaseCrashlytics.getInstance().recordException(e);
            // handle your exception here
        }
        // [END crash_log_caught_ex]
    }

    public void forceACrash() {
        // [START crash_force_crash]
        Button crashButton = new Button(this);
        crashButton.setText("Crash!");
        crashButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                throw new RuntimeException(); // Force a crash
            }
        });

        addContentView(crashButton, new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        // [END crash_force_crash]
    }
}

以上で完成です。

ダウンロード

プロジェクトのダウンロードは以下の通りです。

番号 リンク
1.ダウンロードコード](https://downgit.github.io/#/home?url=https://github.com/firebase/snippets-android/tree/8184cba2c4/crashlytics)