自訂 Firebase Crashlytics 當機報告


Crashlytics 資訊主頁中,您可以點選問題,取得詳細的事件報表。您可以自訂這些報表,進一步瞭解應用程式的狀況,以及向 Crashlytics 回報事件時的相關情況。

回報未偵測到的例外狀況

如要自動擷取 Flutter 架構中擲回的所有「嚴重」錯誤,請使用 FirebaseCrashlytics.instance.recordFlutterFatalError 覆寫 FlutterError.onError。或者,如要一併擷取「非致命」例外狀況,請使用 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 還可記錄非致命例外狀況,並在下次回報重大事件或應用程式重新啟動時傳送給您。

在應用程式的 catch 區塊中,使用 recordError 方法記錄非致命例外狀況。例如:

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分頁中顯示。

使用 log 找出問題。例如:

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

設定使用者 ID

如要診斷問題,瞭解哪些使用者遇到特定異常終止情況通常很有幫助。Crashlytics 包含在當機報告中匿名識別使用者的機制。

如要在報表中加入 User-ID,請為每位使用者指派專屬 ID,形式可以是 ID 號碼、權杖或雜湊值:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

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

取得導覽標記記錄

導覽標記記錄可協助您進一步瞭解使用者與應用程式的互動情形,進而找出導致當機、一般錯誤或 ANR 事件的原因。嘗試重現及偵錯問題時,這些記錄可能會有幫助。

麵包屑記錄是由 Google Analytics 提供,因此如要取得麵包屑記錄,您需要為 Firebase 專案啟用 Google Analytics,並將 Firebase SDK for Google Analytics 新增至應用程式。滿足這些條件後,當您查看問題詳細資料時,系統就會自動在「記錄」分頁中,將麵包屑記錄納入事件資料。

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 可以自動為該使用者收集報表。

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

    如果使用者之後選擇停用資料收集功能,您可以傳遞 false 做為覆寫值,系統會在使用者下次啟動應用程式時套用該值,並在該使用者後續啟動應用程式時持續套用。

管理當機深入分析資料

當機深入分析功能會比較您應用程式的匿名堆疊追蹤記錄與其他 Firebase 應用程式的追蹤記錄,並在您的問題屬於較大規模的趨勢時通知您,協助您解決問題。對於許多問題,當機情況深入分析甚至會提供資源,協助您偵錯當機問題。

當機深入分析會使用匯總當機資料,找出常見的穩定性趨勢。 如不想分享應用程式資料,可以前往 Firebase 管理中心,在Crashlytics問題清單頂端的「當機深入分析」選單中停用這項功能。