自訂 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 資訊主頁中, 您可以搜尋符合自訂鍵的問題。

  • 在控制台中查看特定問題時,您可以查看每個事件的相關自訂鍵 (「Keys」子頁籤),甚至可以依據自訂鍵篩選事件 (頁面頂端的「Filter」選單)。

,瞭解如何調查及移除這項存取權。

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

設定使用者 ID

瞭解使用者遇到哪些問題,通常有助於診斷問題 處理特定當機問題Crashlytics 可讓您匿名辨識 顯示當機報告

如要在報表中新增 User-ID,請為每位使用者指派專屬 ID,形式可為 ID 編號、符記或雜湊值:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

如果您需要在設定使用者 ID 後清除該 ID,請將值重設為空白字串。清除使用者 ID 並不會將現有資料移除 Crashlytics 記錄。如要刪除與使用者 ID 相關聯的記錄,請與 Firebase 支援團隊聯絡

取得導覽標記記錄

導覽標記記錄可讓您進一步瞭解使用者的互動情形 引發當機、一般錯誤或 ANR 事件。這些記錄檔 有助於重現並偵錯。

導覽標記記錄是由 Google Analytics 技術提供,因此如要取得導覽標記記錄, 需要 啟用 Google Analytics加入 Google Analytics 專用的 Firebase SDK 導入您的應用程式一旦符合這些需求,導覽標記記錄就會自動 查看詳細資料時,也會在「記錄檔」分頁中納入事件資料 並不瞭解該問題的來龍去脈

Analytics SDK 自動記錄 screen_view 事件 可讓導覽標記記錄顯示使用者 當機、一般錯誤或 ANR 事件screen_view 麵包屑記錄包含 firebase_screen_class 參數。

系統也會填入導覽標記記錄 您在使用者的帳戶中手動記錄的自訂事件 ,包括事件的參數資料。這項資料有助於顯示導致當機、非致命錯誤或 ANR 事件的一系列使用者動作。

請注意,您可以控管 Google Analytics 資料的收集和使用方式,包括填入麵包屑記錄的資料。

啟用自選回報功能

根據預設,Crashlytics 會自動收集所有應用程式的當機報告 觸及應用程式使用者為讓使用者進一步控管所傳送的資料,您可以停用自動回報功能,並在程式碼中選擇傳送資料至 Crashlytics,啟用選擇加入回報功能:

  1. 原生關閉自動收集功能:

    Apple 平台

    Info.plist 檔案中新增鍵:

    • 鍵:FirebaseCrashlyticsCollectionEnabled
    • 值:false

    Android

    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);
    
,瞭解如何調查及移除這項存取權。

管理當機深入分析資料

當機深入分析會比較匿名堆疊,協助你解決問題 追蹤其他 Firebase 應用程式的追蹤記錄,讓你瞭解問題是否 一部分的趨勢針對許多問題,Crash Insights 甚至提供資源,協助您偵錯當機情形。

Crash Insights 會使用匯總的當機資料,找出常見的穩定性趨勢。 如果不想分享應用程式資料,可以選擇停用「當機深入分析」 前往 Crashlytics 問題清單頂端的「當機深入分析」選單 Firebase 控制台中。