Catch up on everthing we announced at this year's Firebase Summit. Learn more

升級到 Firebase Crashlytics SDK

您現在可以使用新的官方 Firebase Crashlytics SDK 在您的應用中設置 Crashlytics,該 SDK 提供了改進的 API,與其他 Firebase 產品更加一致,使用起來更加直觀。

本指南介紹瞭如何從舊版 Fabric SDK 升級到新 SDK。它描述了新 API 帶來的更改、更改的原因以及如何更新代碼(如果需要)。

在你開始之前

在火力地堡Crashlytics SDK使用AndroidX作為依賴,因此,如果您的應用程序使用舊版本的應用程序支持庫,先遷移您的應用程序AndroidX

第1步:添加火力地堡配置文件

  1. 打開你的項目設置。在您的應用程序卡,選擇您需要一個配置文件中的應用的應用包名稱。

  2. 點擊下載谷歌,services.json獲得你的火力地堡的Android配置文件( google-services.json )。

  3. 將您的配置文件移動到您的應用程序的模塊(應用程序級)目錄中。

第2步:添加火力地堡Crashlytics SDK

  1. 在應用程序的根級別(項目級別) build.gradle

    • 將 Fabric 的 Maven 存儲庫替換為 Google 的 Maven 存儲庫。

    • 將 Fabric Gradle 插件替換為 Firebase Crashlytics Gradle 插件。如果你使用的是Android 4.1工作室金絲雀,一定要添加Crashlytics搖籃插件版本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 ,更換面料插件與火力地堡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 ,取代傳統的面料Crashlytics SDK與新的火力地堡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.5'
    
      // Recommended: Add the Google Analytics SDK
      implementation 'com.google.firebase:firebase-analytics:20.0.0'
    }
    

(可選)設置NDK崩潰報告

Firebase Crashlytics 為使用 Android Native Development Kit (NDK) 構建的應用程序提供崩潰報告。

要檢測和報告本機崩潰:

  1. 在您的應用程序級build.gradle文件,請用火力地堡Crashlytics NDK依賴布料NDK依賴。然後,添加firebaseCrashlytics擴展,並確保啟用nativeSymbolUploadEnabled標誌。這使您的應用程序,並上傳到Crashlytics本地符號,因此您可以在正常顯示,symbolicated堆棧跟踪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.5'
    }
    // ...
    
    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
    

有關使用Crashlytics的NDK崩潰報告的詳細信息,請參閱Crashlytics NDK文檔

第3步:更新您的代碼

查看以下 SDK 更改並對您的代碼進行適當更新:


Crashlytics 現在根據 Firebase 安裝 ID 輪換 ID。

Crashlytics 使用 Crashlytics 安裝 UUID 來識別您的應用程序實例並將您的用戶數據與其設備相關聯。以前,當用戶設備的廣告 ID 發生變化時,Crashlytics 會輪換用戶的安裝 UUID。現在,Crashlytics 根據用戶的 Firebase 安裝 ID (FID) 輪換安裝 UUID。欲了解更多信息,請訪問管理火力地堡安裝的ID

造成改變的原因

使用 FID 與其他 Firebase SDK 一致。


Crashlytics 的新包和類名是 com.google.firebase.crashlytics.FirebaseCrashlytics。

您現在可以使用 FirebaseCrashlytics 單例中的實例方法而不是 FirebaseCrashlytics 類中的靜態函數來調用 Crashlytics 功能。該FirebaseCrashlytics單是通過全局可訪問getInstance()靜態函數。

面料 SDK

爪哇

import com.crashlytics.android.Crashlytics;

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

科特林+KTX

import com.crashlytics.android.Crashlytics

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Firebase Crashlytics SDK

爪哇

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

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

科特林+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文件的應用與您的火力地堡項目關聯,並保留您的歷史事故數據。

如果您有(布料API密鑰io.fabric.ApiKey )在聲明AndroidManifest.xml文件,將其刪除:

<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自動收集和報告崩潰為您的應用程序的所有實例,但你可以選擇啟用它僅適用於誰在選擇用戶。要關閉自動崩潰報告,在<application>的塊AndroidManifest.xml文件,集firebase_crashlytics_collection_enabledfalse

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

造成改變的原因

為了與其他 Firebase SDK 保持一致,Crashlytics 現在通過 ContentProvider 自動啟動。像其他軟件開發工具包,它現在提供了一個明顯的標誌,禁用自動採集數據,你可以在任何時候通過覆蓋setCrashlyticsCollectionEnabled 。該方法使您可以更好地控制應用程序的崩潰報告行為。


Crashlytics.log 現在是一個實例方法。

新的SDK不再包括靜態Crashlytics.log方法。要添加自定義日誌消息,使用新的實例方法crashlytics.log代替。請注意,新方法不再與 logcat 相呼應(如果您想保留此行為,我們建議編寫包裝器)。欲了解更多信息,請訪問:添加自定義日誌信息

面料 SDK

爪哇

Crashlytics.log("my message");

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

科特林+KTX

Crashlytics.log("my message")

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

Firebase Crashlytics SDK

爪哇

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");

科特林+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 。以前,您可以使用自定義鍵設置器來設置鍵/值對與崩潰報告一起發送。現在,你可以使用setCustomKey(String, value) ,這是超載接受原始和字符串類型。欲了解更多信息,請訪問:添加自定義鍵。

面料 SDK

爪哇

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");

科特林+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

爪哇

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");

科特林+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 不符合鍵值對。


setUserIdentifier 現在是 setUserId。 setUserName 和 setUserEmail 被刪除。

以前,您可以設置使用崩潰相關的姓名或電子郵件setUserNamesetUserEmail ,但不再定義這些方法。到集ID的新首選方法為您的用戶是使用setUserId 。欲了解更多信息,請訪問設置用戶標識符。

面料 SDK

爪哇

Crashlytics.setUserIdentifier("myAppUserId");

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

Crashlytics.setUserName("John Doe");

科特林+KTX

Crashlytics.setUserIdentifier("myAppUserId")

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

Crashlytics.setUserName("John Doe")

Firebase Crashlytics SDK

爪哇

crashlytics.setUserId("myAppUserId");

科特林+KTX

crashlytics.setUserId("myAppUserId")

造成改變的原因

我們採用的方法名稱setUserId ,以便與其他火力地堡API和去除一致setUserNamesetUserEmail勸阻通過Crashlytics記錄PII。


Crashlytics.logException(Throwable) 被 FirebaseCrashlytics.recordException(Throwable) 取代。

Crashlytics 現在還支持記錄 Apple 和 Android 應用程序的內置錯誤和異常類型。

面料 SDK

爪哇

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

// ...

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

科特林+KTX

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

// ...

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

Firebase Crashlytics SDK

爪哇

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

// ...

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

科特林+KTX

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

// ...

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

造成改變的原因

這種新方法recordException(Throwable)更容易分辨從log(String) ,其行為不同。此外,我們對新 API 進行了重命名,以使其跨平台更加一致。


CrashlyticsListener 被 didCrashOnPreviousExecution() 取代。

CrashlyticsListener 之前允許 Crashlytics 指示前一個應用會話何時以崩潰結束,這對於在重新啟動時顯示崩潰後消息的應用非常有用。現在,它的回調是同步API調用替換didCrashOnPreviousExecution()

面料 SDK

爪哇

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);

科特林+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

爪哇

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

科特林+KTX

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

造成改變的原因

與 CrashlyticsListener 相比,新 API 不那麼冗長,使用起來也更簡單,因為它既不需要樣板文本也不需要回調。以前,異步回調不能保證何時調用回調。


刪除了崩潰方法。

新 SDK 不再包含 crash 方法,您以前可以使用該方法通過強制應用崩潰來驗證 Crashlytics 配置。拋出一個RuntimeException強制崩潰。

面料 SDK

爪哇

Crashlytics.getInstance().crash();

科特林+KTX

Crashlytics.getInstance().crash()

Firebase Crashlytics SDK

爪哇

throw new RuntimeException("Test Crash");

科特林+KTX

throw RuntimeException("Test Crash")

造成改變的原因

新方法明確指定您的應用程序導致崩潰是發生在運行時還是在應用程序的本機 SDK 中。


Crashlytics Gradle 插件包含新標誌。

Gradle 插件會繼續自動配置和執行 Crashlytics 特定的 Gradle 任務。如果您的構建需要調用從Crashlytics搖籃插件任務,通過運行是指可用火力地堡Crashlytics任務./gradlew app:tasks 。如果您的應用使用NDK,必須明確調用uploadCrashlyticsSymbolFile[ BUILD_VARIANT ]搖籃任務繼續上傳本地符號Crashlytics。

該Crashlytics特定的構建標誌ext.alwaysUpdateBuildIdext.enableCrashlytics不再支持。如果它們存在,請從您的 Gradle 配置中刪除它們。如果應用程序使用一個字節碼混淆(例如,R8或Proguard的),你不想上傳您構建的映射文件Crashlytics,使用新mappingFileUploadEnabled國旗在firebaseCrashlytics搖籃擴展。設置為 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 Analytics 收集的數據。

升級到 Firebase Crashlytics SDK 後,您將無法再使用 Fabric Answers 收集數據。要獲取無崩潰用戶和麵包屑的指標,請改用 Google Analytics。請注意,您的歷史答案數據無法遷移到 Firebase。

訪問開始使用谷歌分析,以了解如何谷歌分析添加到您的應用程序。

造成改變的原因

我們現在提供 Google Analytics 來幫助您更深入地了解您的崩潰數據。借助 Analytics,您可以繼續在 Firebase 控制台中為您的應用收集統計信息。


下一步