Firebase Crashlytics SDK にアップグレードする

新しい公式 Firebase Crashlytics SDK を使用して、アプリで Crashlytics を設定できるようになりました。新しい Firebase Crashlytics SDK では API が改善され、他の Firebase プロダクトとの整合性が高まり、より直感的に使用できます。

このガイドでは、従来の Fabric SDK から新しい SDK にアップグレードする方法について説明します。必要に応じて、新しい API における変更点、変更理由、コードを更新する方法についても説明します。

始める前に

Firebase Crashlytics SDK は依存関係として AndroidX を使用するため、アプリが古いバージョンのアプリサポート ライブラリを使用している場合は、まず AndroidX に移行します。

ステップ 1: Firebase 構成ファイルを追加する

  1. [プロジェクトの設定] を開きます。[マイアプリ] カードで、構成ファイルが必要なアプリのパッケージ名を選択します。

  2. [google-services.json をダウンロード] をクリックして、Firebase Android 構成ファイル(google-services.json)を取得します。

    • Firebase Android 構成ファイルはいつでも再ダウンロードできます。

    • 構成ファイル名に (2) のような文字が追加されていないことを確認してください。

  3. 構成ファイルをアプリのモジュール(アプリレベル)ディレクトリに移動します。

ステップ 2: Firebase Crashlytics SDK を追加する

  1. アプリのルートレベル(プロジェクト レベル)の build.gradle で、次の操作を行います。

    • Fabric の Maven リポジトリを Google の Maven リポジトリに置き換えます。

    • Fabric Gradle プラグインを Firebase Crashlytics Gradle プラグインに置き換えます。Android Studio 4.1 Canary を使用している場合は、必ず Crashlytics Gradle プラグイン バージョン 2.0.0 以降を追加してください。

    buildscript {
      // ...
    
      repositories {
        // ...
    
        // Remove Fabric's Maven repository
        maven { url 'https://maven.fabric.io/public' }
    
        // Add Google's Maven repository (if it's not there already)
        google()
      }
    
      dependencies {
        // ..
    
        // Add the Google Services Gradle plugin (if it's not there already)
        classpath 'com.google.gms:google-services:4.3.10'
    
        // Remove the Fabric Gradle plugin
        classpath 'io.fabric.tools:gradle:1.31.2'
    
        // Add the Crashlytics Gradle plugin (use v2.0.0+ if you built
        // your app with Android Studio 4.1).
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
      }
    }
  2. アプリレベルbuild.gradle で、Fabric プラグインを Firebase Crashlytics プラグインに置き換えます。

    apply plugin: 'com.android.application'
    
    // Apply the Google Services plugin (if it's not there already)
    apply plugin: 'com.google.gms.google-services'
    
    // Remove the Fabric plugin
    apply plugin: 'io.fabric'
    
    // Add the Firebase Crashlytics plugin
    apply plugin: 'com.google.firebase.crashlytics'
  3. 最後に、Firebase Crashlytics SDK を追加します。アプリレベルの build.gradle で、従来の Fabric Crashlytics SDK を新しい Firebase Crashlytics SDK に置き換えます。バージョン 17.0.0 以降を追加するようにしてください(2020 年 11 月 15 日以降、Firebase コンソールにクラッシュ レポートを表示するために必要となります)。

    dependencies {
      // Remove the Fabric Crashlytics SDK
      implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    
      // Add the Firebase Crashlytics SDK
      implementation 'com.google.firebase:firebase-crashlytics:18.2.7'
    
      // Recommended: Add the Google Analytics SDK
      implementation 'com.google.firebase:firebase-analytics:20.0.2'
    }

(省略可)NDK クラッシュ レポートを設定する

Firebase Crashlytics では、Android ネイティブ開発キット(NDK)を使用してビルドされたアプリのクラッシュ レポートを取得できます。

ネイティブ クラッシュを検出して報告するには、次のようにします。

  1. アプリレベルbuild.gradle ファイルで、Fabric NDK の依存関係を Firebase Crashlytics NDK の依存関係に置き換えます。次に、firebaseCrashlytics 拡張機能を追加して、nativeSymbolUploadEnabled フラグを有効にします。これにより、アプリがネイティブ シンボルを処理して Crashlytics にアップロードできるようになるため、適切にシンボリケートされたスタック トレースを Crashlytics ダッシュボードで表示できます。

    dependencies {
      // Remove the Fabric NDK dependency
      implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.1.1'
    
      // Add the Firebase Crashlytics NDK dependency
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.7'
    }
    // ...
    
    android {
        // ...
    
        buildTypes {
            release {
                /* Add the firebaseCrashlytics extension (by default,
                * it's disabled to improve build speeds) and set
                * nativeSymbolUploadEnabled to true. */
    
                firebaseCrashlytics {
                    nativeSymbolUploadEnabled true
                }
            }
        }
    }
    
    // Remove this extension (it previously enabled Crashlytics NDK reporting in Fabric)
    crashlytics {
      enableNdk true
    }
  2. NDK に固有の次の Gradle タスクを実行します。

    > ./gradlew app:assembleBUILD_VARIANT
    > ./gradlew app:uploadCrashlyticsSymbolFileBUILD_VARIANT

NDK クラッシュ レポートに Crashlytics を使用する方法の詳細については、Crashlytics NDK のドキュメントをご覧ください。

ステップ 3: コードを更新する

次の SDK の変更点を確認して、コードを適切に更新します。


Crashlytics は Firebase インストール ID に基づいて ID をローテーションするようになりました。

Crashlytics は、Crashlytics のインストール UUID を使用してアプリのインスタンスを識別し、ユーザーのデータをデバイスに関連付けます。以前の Crashlytics では、デバイスの広告 ID が変更されたときにユーザーのインストール UUID をローテーションしていました。現在の Crashlytics では、ユーザーの Firebase インストール ID(FID)に基づいてインストール UUID をローテーションするようになっています。詳しくは、Firebase インストール ID の管理をご覧ください。

変更理由

他の Firebase SDK との整合性を取るため、FID を使用するようにしました。


Crashlytics での新しいパッケージとクラス名は com.google.firebase.crashlytics.FirebaseCrashlytics になっています。

FirebaseCrashlytics クラスの静的関数の代わりに、FirebaseCrashlytics シングルトンのインスタンス メソッドを使用して Crashlytics の機能を呼び出せるようになりました。FirebaseCrashlytics シングルトンには、getInstance() 静的関数を使用してグローバルにアクセスできます。

Fabric SDK

Java

import com.crashlytics.android.Crashlytics;

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Kotlin+KTX

import com.crashlytics.android.Crashlytics

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Firebase Crashlytics SDK

Java

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

// Operations on FirebaseCrashlytics.
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.someAction();

Kotlin+KTX

import com.google.firebase.crashlytics.FirebaseCrashlytics

// ...

// Operations on FirebaseCrashlytics.
val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.someAction()

変更理由

新しい SDK のルート パッケージとエントリ ポイントについて、他の Firebase SDK との整合性を取りました。さらに、インスタンス メソッドは静的関数よりも容易にモックアップを作成できるため、テストにおける問題が少なくなります。


FirebaseCrashlytics は Fabric SDK と連動しなくなりました。

Crashlytics は、新しい Firebase Crashlytics SDK で定義された ContentProvider を使用して自動的に開始されるようになりました。この SDK は Fabric API キーを使用しません。Crashlytics ではアプリの google-services.json ファイルを使用してアプリを Firebase プロジェクトに関連付け、履歴クラッシュ データを保持します。

AndroidManifest.xml ファイルで Fabric API キー(io.fabric.ApiKey)が宣言されている場合は削除します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.your_app_package">

   <application>
      <activity android:name=".MainActivity"/>

      <!-- Remove this line if it exists -->
      <meta-data android:name="io.fabric.ApiKey"
          android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />

   </application>
</manifest>

デフォルトでは、Crashlytics はアプリのすべてのインスタンスについてクラッシュを自動的に収集してレポートしますが、オプトインしたユーザーに対してのみ有効にすることもできます。自動クラッシュ レポートをオフにするには、AndroidManifest.xml ファイルの <application> ブロックで、firebase_crashlytics_collection_enabledfalse に設定します。

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />

変更理由

他の Firebase SDK との整合性を取るために、Crashlytics は ContentProvider を使用して自動的に起動するようになりました。他の SDK と同様に、自動データ収集を無効にするための manifest フラグが用意されています。このフラグはいつでも setCrashlyticsCollectionEnabled を使用してオーバーライドできます。この方法を使用すると、アプリのクラッシュ レポートの動作をより細かく制御できます。


Crashlytics.log がインスタンス メソッドになりました。

新しい SDK には、静的 Crashlytics.log メソッドが含まれなくなりました。カスタム ログメッセージを追加するには、代わりに新しいインスタンス メソッド crashlytics.log を使用します。この新しいメソッドでは、logcat へのエコー出力は行われません(この動作を維持する場合は、ラッパーを作成することをおすすめします)。詳細については、カスタム ログメッセージを追加するをご覧ください。

Fabric SDK

Java

Crashlytics.log("my message");

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message");

Kotlin+KTX

Crashlytics.log("my message")

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message")

Firebase Crashlytics SDK

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.log("my message");

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message");

Kotlin+KTX

val crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.log("my message")

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message")

変更理由

お客様からのリクエストに応じて、Crashlytics ログの logcat へのエコー出力を停止しました。インスタンス メソッドを使用すると、コードのテストも容易になります。


setBool、setDouble、setFloat、setInt、setLong、setString は、setCustomKey に集約されています。

カスタム キーセッターを setCustomKey メソッドに集約しました。これまでは、カスタム キーセッターを使用して、クラッシュ レポートとともに送信する Key-Value ペアを設定していました。現在は、プリミティブ型と文字列型を受け入れるように多重定義された setCustomKey(String, value) を使用できます。詳細については、カスタムキーを追加するをご覧ください。

Fabric SDK

Java

Crashlytics.setBool("bool_key",true);

Crashlytics.setDouble("double_key",42.0);

Crashlytics.setFloat("float_key",42.0F);

Crashlytics.setInt("int_key",42);

Crashlytics.setLong("long_key",42L);

Crashlytics.setString("str_key","str_value");

Kotlin+KTX

Crashlytics.setBool("bool_key",true)

Crashlytics.setDouble("double_key",42.0)

Crashlytics.setFloat("float_key",42.0F)

Crashlytics.setInt("int_key",42)

Crashlytics.setLong("long_key",42L)

Crashlytics.setString("str_key","str_value")

Firebase Crashlytics SDK

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("bool_key",true);

crashlytics.setCustomKey("double_key",42.0);

crashlytics.setCustomKey("float_key",42.0F);

crashlytics.setCustomKey("int_key",42);

crashlytics.setCustomKey("long_key",42L);

crashlytics.setCustomKey("str_key","42");

Kotlin+KTX

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.setCustomKey("bool_key",true)

crashlytics.setCustomKey("double_key",42.0)

crashlytics.setCustomKey("float_key",42.0F)

crashlytics.setCustomKey("int_key",42)

crashlytics.setCustomKey("long_key",42L)

crashlytics.setCustomKey("str_key","42")

変更理由

新しいメソッド名を Crashlytics に固有のものにして、Crashlytics が Key-Value 準拠でないことを明確にしました。


setUserIdentifier が setUserId になり、setUserName と setUserEmail が削除されました。

これまでは、setUserNamesetUserEmail を使用してクラッシュに関連付ける名前またはメールアドレスを設定していましたが、これらのメソッドは定義されなくなりました。ユーザー ID を設定するには、setUserId を使用することをおすすめします。詳細については、ユーザー ID を設定するをご覧ください。

Fabric SDK

Java

Crashlytics.setUserIdentifier("myAppUserId");

Crashlytics.setUserEmail("abc@example.com");

Crashlytics.setUserName("John Doe");

Kotlin+KTX

Crashlytics.setUserIdentifier("myAppUserId")

Crashlytics.setUserEmail("abc@example.com")

Crashlytics.setUserName("John Doe")

Firebase Crashlytics SDK

Java

crashlytics.setUserId("myAppUserId");

Kotlin+KTX

crashlytics.setUserId("myAppUserId")

変更理由

他の Firebase API との整合性を取るために、メソッド名 setUserId を採用しました。また、Crashlytics で個人情報(PII)がログに記録されないように、setUserNamesetUserEmail を削除しました。


Crashlytics.logException(Throwable) は FirebaseCrashlytics.recordException(Throwable) に置き換えられました。

Crashlytics が Apple アプリと Android アプリの両方で、組み込みのエラータイプと例外タイプのロギングもサポートするようになりました。

Fabric SDK

Java

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
Crashlytics.logException(e);
}

Kotlin+KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
Crashlytics.logException(e)
}

Firebase Crashlytics SDK

Java

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
FirebaseCrashlytics.getInstance().recordException(e);
}

Kotlin+KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
FirebaseCrashlytics.getInstance().recordException(e)
}

変更理由

新しい recordException(Throwable) メソッドは、動作が異なる log(String) と簡単に区別できます。さらに、新しい API の名前を、プラットフォーム全体で整合性が取れるように変更しました。


CrashlyticsListener が didCrashOnPreviousExecution() に置き換えられました。

これまで、Crashlytics では CrashlyticsListener を使用して、前のアプリ セッションがクラッシュで終了したことを示し、アプリの再起動時にクラッシュ後のメッセージを表示できるようにしていました。現在、そのコールバックは同期 API 呼び出し didCrashOnPreviousExecution() に置き換えられています。

Fabric SDK

Java

CrashlyticsListener crashlyticsListener =
new CrashlyticsListener() {
  @Override
  public void crashlyticsDidDetectCrashDuringPreviousExecution() {
    // ...App code to execute if a crash occurred during previous execution.
  }
};

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
                                      .listener(crashlyticsListener)
                                      .build();

Crashlytics crashlytics = new Crashlytics.Builder().core(crashlyticsCore).build();

Fabric.with(getContext(), crashlytics);

Kotlin+KTX

val crashlyticsListener = CrashlyticsListener {
  // ...App code to execute if a crash occurred during previous execution.
}
val crashlyticsCore = CrashlyticsCore.Builder()
  .listener(crashlyticsListener)
  .build()
val crashlytics = Crashlytics.Builder().core(crashlyticsCore).build()
Fabric.with(getContext(), crashlytics)

Firebase Crashlytics SDK

Java

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

Kotlin+KTX

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

変更理由

この新しい API ではボイラープレート テキストもコールバックも必要ないため、CrashlyticsListener よりも簡潔で扱いやすくなっています。これまでの非同期コールバックでは、コールバックが呼び出されるタイミングが保証されませんでした。


crash メソッドが削除されました。

新しい SDK には crash メソッドが含まれなくなりました。以前は、このメソッドを使用してアプリを強制的にクラッシュさせ、Crashlytics 構成を検証していました。強制的にクラッシュさせるには、RuntimeException をスローします。

Fabric SDK

Java

Crashlytics.getInstance().crash();

Kotlin+KTX

Crashlytics.getInstance().crash()

Firebase Crashlytics SDK

Java

throw new RuntimeException("Test Crash");

Kotlin+KTX

throw RuntimeException("Test Crash")

変更理由

これらの新しいメソッドでは、アプリのクラッシュが実行中に発生したのか、それともアプリのネイティブ SDK で発生したのかが明確に特定されます。


Crashlytics Gradle プラグインに新しいフラグが追加されています。

Gradle プラグインは引き続き、Crashlytics 固有の Gradle タスクを自動的に構成して実行します。ビルドで Crashlytics Gradle プラグインからタスクを呼び出す必要がある場合は、./gradlew app:tasks を実行して、使用可能な Firebase Crashlytics タスクを参照してください。アプリで NDK を使用している場合、Gradle タスク uploadCrashlyticsSymbolFile[BUILD_VARIANT] を明示的に呼び出して、ネイティブ シンボルを Crashlytics に引き続きアップロードする必要があります。

Crashlytics 固有のビルドフラグ ext.alwaysUpdateBuildIdext.enableCrashlytics がサポートされなくなりました。Gradle 構成で使用している場合は削除してください。アプリでバイトコード難読化ツール(R8、Proguard など)を使用していて、ビルドのマッピング ファイルを Crashlytics にアップロードしたくない場合は、firebaseCrashlytics Gradle 拡張機能に含まれる新しい mappingFileUploadEnabled フラグを使用します。false に設定すると、Crashlytics はアプリのスタック トレースの難読化を解除できません。標準以外の難読化ツールの構成には、mappingFile パラメータを使用してマッピング ファイルの新しい場所を設定します。これらのフラグは、defaultConfig だけでなく任意のビルドタイプまたはフレーバーで使用できます。

Firebase Crashlytics SDK

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.gms.google-services'

android {
    // ...

    buildTypes {
        debug {
            minifyEnabled true
            firebaseCrashlytics {
                // If you don't need crash reporting for your debug build,
                // you can speed up your build by disabling mapping file uploading.
                mappingFileUploadEnabled false
            }
        }

        release {
            minifyEnabled true
            // When minifyEnabled is set to true, Crashlytics automatically
            // uploads mapping files because the plugin detects that obfuscation
            // is enabled. mappingFileUploadEnabled defaults to true if
            // minifyEnabled is true.
        }
    }
}

変更理由

Gradle の規則との整合性を高めるために、Gradle タスクと構成オプションを更新しました。


Crashlytics では、Google アナリティクスによって収集されたデータのみを使用できます。

Firebase Crashlytics SDK にアップグレードした後は、Fabric Answers でデータを収集できなくなります。クラッシュの影響を受けていないユーザーとパンくずリストの指標を取得するには、Google アナリティクスを使用するように切り替えてください。Answers の過去のデータを Firebase に移行することはできません。

Google アナリティクスをアプリに追加する方法については、Google アナリティクスの使用を開始するをご覧ください。

変更理由

Google アナリティクスを使用して、クラッシュ データを詳細に分析できるようになりました。アナリティクスでは、引き続き Firebase コンソールでアプリの統計情報を収集できます。


次のステップ