Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

自定義您的 Firebase Crashlytics 崩潰報告

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

本指南介紹如何使用 Crashlytics API 自定義崩潰報告。默認情況下,Crashlytics 會自動為您應用的所有用戶收集平台原生崩潰報告(您也可以關閉自動崩潰報告並為您的用戶啟用選擇加入報告)。 Crashlytics 提供了五種開箱即用的日誌記錄機制:自定義鍵自定義日誌用戶標識符捕獲未捕獲異常。

對於 Flutter 應用程序,致命報告會實時發送到 Crashlytics,而無需用戶重新啟動應用程序。非致命報告被寫入磁盤,與下一個致命報告一起發送或在應用程序重新啟動時發送。

報告未捕獲的異常

您可以通過使用FirebaseCrashlytics.instance.recordFlutterFatalError覆蓋FlutterError.onError來自動捕獲 Flutter 框架內引發的所有錯誤:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();

  // Pass all uncaught errors from the framework to Crashlytics.
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;

  runApp(MyApp());
}

分區錯誤

並非所有錯誤都能被 Flutter 捕獲。有時,錯誤會被Zones捕獲。依靠 Flutter 捕獲錯誤是不夠的,一個常見的情況是按鈕的onPressed處理程序內部發生異常:

ElevatedButton(
  onPressed: () {
    throw Error();
  }
  ...
)

要捕獲此類錯誤,您可以使用runZonedGuarded

void main() async {
  runZonedGuarded<Future<void>>(() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    // The following lines are the same as previously explained in "Handling uncaught errors"
    FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterFatalError;

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

Flutter 之外的錯誤

要捕獲在 Flutter 上下文之外發生的錯誤,請在當前Isolate上安裝一個錯誤偵聽器:

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

報告捕獲的異常

除了自動報告應用程序的崩潰之外,Crashlytics 還允許您記錄非致命異常,並在下次報告致命事件或應用程序重新啟動時將它們發送給您。

使用recordError方法在應用程序的 catch 塊中記錄非致命異常。例如:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

這些異常在 Firebase 控制台中顯示為非致命問題。問題摘要包含您通常從崩潰中獲得的所有狀態信息,以及按版本和硬件設備分類的故障。

Crashlytics 在專用後台線程上處理異常,以盡量減少對您的應用程序的性能影響。為了減少用戶的網絡流量,Crashlytics 將在必要時限制從設備發送的報告數量。

添加自定義鍵

自定義鍵可幫助您了解導致崩潰的應用的特定狀態。您可以將任意鍵/值對與崩潰報告相關聯,然後使用自定義鍵在 Firebase 控制台中搜索和過濾崩潰報告。

  • Crashlytics 儀表板中,您可以搜索與自定義鍵匹配的問題。

  • 當您在控制台中查看特定問題時,您可以查看每個事件的關聯自定義鍵(子選項卡),甚至可以通過自定義鍵過濾事件(頁面頂部的過濾器菜單)。

使用setCustomKey實例方法設置鍵/值對。這裡有些例子:

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

添加自定義日誌消息

要為導致崩潰的事件提供更多背景信息,您可以將自定義 Crashlytics 日誌添加到您的應用程序。 Crashlytics 將日誌與您的崩潰數據相關聯,並將它們顯示在Firebase 控制台的 Crashlytics日誌選項卡下。

使用log幫助查明問題。例如:

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

設置用戶標識符

要診斷問題,了解哪些用戶遇到了給定的崩潰通常很有幫助。 Crashlytics 包括一種在您的崩潰報告中匿名識別用戶的方法。

要將用戶 ID 添加到您的報告中,請以 ID 號、令牌或散列值的形式為每個用戶分配一個唯一標識符:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

如果您在設置後需要清除用戶標識符,請將值重置為空白字符串。清除用戶標識符不會刪除現有的 Crashlytics 記錄。如果您需要刪除與用戶 ID 關聯的記錄,請聯繫 Firebase 支持

啟用選擇加入報告

默認情況下,Crashlytics 會自動為您應用的所有用戶收集崩潰報告。為了讓用戶更好地控制他們發送的數據,您可以通過禁用自動報告並僅在您選擇在代碼中將數據發送到 Crashlytics 來啟用選擇報告:

  1. 本機關閉自動收集:

    蘋果平台

    Info.plist文件中添加一個新密鑰:

    • 鍵: FirebaseCrashlyticsCollectionEnabled
    • 值: false

    安卓

    AndroidManifest.xml文件的application塊中,添加meta-data標籤以關閉自動收集:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. 通過在運行時調用 Crashlytics 數據收集覆蓋來為選定用戶啟用收集。

    覆蓋值在您的應用程序啟動期間保持不變,因此 Crashlytics 可以自動收集報告。要選擇退出自動崩潰報告,請將false作為覆蓋值傳遞。當設置為false時,新值將在應用程序的下一次運行之前應用。

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

管理崩潰洞察數據

Crash Insights 通過將匿名堆棧跟踪與來自其他 Firebase 應用的跟踪進行比較,並讓您知道您的問題是否屬於更大趨勢的一部分,從而幫助您解決問題。對於許多問題,Crash Insights 甚至提供資源來幫助您調試崩潰。

Crash Insights 使用匯總的崩潰數據來識別常見的穩定性趨勢。如果您不想共享應用的數據,可以從Firebase 控制台中 Crashlytics 問題列表頂部的Crash Insights菜單中選擇退出 Crash Insights。