自訂您的 Firebase Crashlytics 崩潰報告

在 Crashlytics 儀表板中,您可以點擊問題並取得詳細的事件報告。您可以自訂這些報告,以幫助您更好地了解應用程式中發生的情況以及報告給 Crashlytics 的事件的情況。

報告未捕獲的異常

您可以透過使用FirebaseCrashlytics.instance.recordFlutterFatalError覆蓋FlutterError.onError來自動捕獲 Flutter 框架內引發的所有「致命」錯誤。或者,要捕捉「非致命」異常,請使用FirebaseCrashlytics.instance.recordFlutterError覆蓋FlutterError.onError

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

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

非同步錯誤

Flutter 框架不會捕捉非同步錯誤:

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

要捕獲此類錯誤,您可以使用PlatformDispatcher.instance.onError處理程序:

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

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

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

您可能還想記錄有關錯誤的更多信息,這可以使用information屬性來實現:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

這些異常在 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 Logs標籤下。

使用log來幫助找出問題。例如:

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

設定用戶標識符

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

若要將使用者 ID 新增至報表中,請為每個使用者指派 ID 號碼、令牌或雜湊值形式的唯一識別碼:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

如果您在設定使用者識別碼後需要清除它,請將該值重設為空白字串。清除使用者識別碼不會刪除現有的 Crashlytics 記錄。如果您需要刪除與使用者 ID 關聯的記錄,請聯絡 Firebase 支援

取得麵包屑日誌

麵包屑日誌可以讓您更了解使用者與您的應用程式之間的交互,從而導致崩潰、非致命或 ANR 事件。當嘗試重現和偵錯問題時,這些日誌會很有幫助。

麵包屑日誌由 Google Analytics 提供支援,因此要取得麵包屑日誌,您需要為您的 Firebase 專案啟用 Google Analytics ,並將適用於 Google Analytics 的 Firebase SDK 新增至您的應用程式。滿足這些要求後,當您查看問題的詳細資訊時,麵包屑日誌將自動包含在「日誌」標籤中的事件資料中。

Analytics SDK會自動記錄screen_view事件,該事件使麵包屑日誌能夠顯示在崩潰、非致命或 ANR 事件之前查看的螢幕清單。 screen_view麵包屑日誌包含firebase_screen_class參數。

麵包屑日誌還填入了您在使用者工作階段中手動記錄的任何自訂事件,包括事件的參數資料。此數據可以幫助顯示導致崩潰、非致命或 ANR 事件的一系列使用者操作。

請注意,您可以控制 Google Analytics 資料的收集和使用,其中包括填充麵包屑日誌的資料。

啟用選擇加入報告

預設情況下,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 甚至提供資源來幫助您調試崩潰。

崩潰洞察使用聚合的崩潰資料來識別常見的穩定性趨勢。如果您不想共享應用程式的數據,可以從Firebase 控制台Crashlytics 問題清單頂部的Crash Insights選單中選擇退出 Crash Insights。