自訂 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 方法,在應用程式擷取區塊中記錄不嚴重的例外狀況。例如:

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

設定使用者 ID

如要診斷問題,瞭解哪些使用者遇到了特定當機問題,通常會很有幫助。Crashlytics 可讓您在當機報告中以匿名方式識別使用者。

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

FirebaseCrashlytics.instance.setUserIdentifier("12345");

如果您在設定使用者 ID 之後需要清除,請將值重設為空白字串。清除使用者 ID 並不會移除現有的 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. 原生關閉自動收集功能:

    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 應用程式的追蹤記錄進行比較,讓您瞭解問題是否出在更大趨勢,進而解決問題。許多問題甚至會提供相關資源來協助偵錯。

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