自訂 Android 的當機報告

選取平台: iOS+ Android Flutter Unity


您可以在 控制台的「DevOps 與參與度」 > 「Crashlytics 資訊主頁」中,點選問題並取得詳細的事件報表。Firebase您可以自訂這些報表,進一步瞭解應用程式的運作情形,以及向 Crashlytics 回報的事件相關情況。

新增自訂鍵

你可以使用自訂鍵,取得導致當機情況的應用程式特定狀態。您可以將任意鍵/值組合與當機報告建立關聯,然後使用自訂鍵,在 Firebase 控制台的「DevOps & Engagement」 > 「Crashlytics 資訊主頁」中搜尋及篩選當機報告。

  • 您可以搜尋與自訂鍵相符的問題。

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

使用 setCustomKey 執行個體方法設定鍵/值組合。請注意,setCustomKey 會針對 value 參數超載,以接受任何原始或 String 引數。例如:

Kotlin

val crashlytics = Firebase.crashlytics
crashlytics.setCustomKeys {
    key("my_string_key", "foo") // String value
    key("my_bool_key", true) // boolean value
    key("my_double_key", 1.0) // double value
    key("my_float_key", 1.0f) // float value
    key("my_int_key", 1) // int value
}

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("my_string_key", "foo" /* string value */);

crashlytics.setCustomKey("my_bool_key", true /* boolean value */);

crashlytics.setCustomKey("my_double_key", 1.0 /* double value */);

crashlytics.setCustomKey("my_float_key", 1.0f /* float value */);

crashlytics.setCustomKey("my_int_key", 1 /* int value */);

您也可以呼叫現有索引鍵並設定為其他值,藉此修改該索引鍵的值。例如:

Kotlin

val crashlytics = Firebase.crashlytics
crashlytics.setCustomKeys {
    key("current_level", 3)
    key("last_UI_action", "logged_in")
}

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("current_level", 3);
crashlytics.setCustomKey("last_UI_action", "logged_in");

將 CustomKeysAndValues 的例項傳遞至 setCustomKeys 例項方法,即可大量新增鍵/值組合:

Kotlin

在 Kotlin 中,現有功能比使用 CustomKeysAndValues 建構工具更簡單。

crashlytics.setCustomKeys {
  key("str_key", "hello")
  key("bool_key", true)
  key("int_key", 1)
  key("long_key", 1L)
  key("float_key", 1.0f)
  key("double_key", 1.0)
}

Java

CustomKeysAndValues keysAndValues = new CustomKeysAndValues.Builder()
.putString("string key", "string value")
.putString("string key 2", "string  value 2")
.putBoolean("boolean key", True)
.putBoolean("boolean key 2", False)
.putFloat("float key", 1.01)
.putFloat("float key 2", 2.02)
.build();

FirebaseCrashlytics.getInstance().setCustomKeys(keysAndValues);

新增自訂記錄訊息

如要進一步瞭解導致當機的事件,您可以在應用程式中新增自訂 Crashlytics 記錄。Crashlytics 會將記錄與當機資料建立關聯,並在您查看問題詳細資料時,將記錄顯示在「Logs」分頁中 (如要查看所有問題,請前往 Firebase 控制台的「DevOps & Engagement」 >「Crashlytics dashboard」)。

使用 log 有助於找出問題。例如:

Kotlin

Firebase.crashlytics.log("message")

Java

FirebaseCrashlytics.getInstance().log("message");

設定使用者 ID

如要診斷問題,通常需要知道哪些使用者遇到特定當機情況。Crashlytics 提供一種方法,可在當機報告中匿名識別使用者。

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

Kotlin

Firebase.crashlytics.setUserId("user123456789")

Java

FirebaseCrashlytics.getInstance().setUserId("user123456789");

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

(僅限 Android NDK) 在 NDK 當機報告中加入中繼資料

您可以在 C++ 程式碼中加入 crashlytics.h 標頭,將中繼資料新增至 NDK 當機報告,例如自訂鍵、自訂記錄、使用者 ID。本頁上方已說明所有選項。

crashlytics.h 是 Firebase Android SDK GitHub 存放區中的僅標頭 C++ 程式庫。

請參閱標頭檔案中的註解,瞭解如何使用 NDK C++ API。

納入 GWP-ASan 報告,對記憶體毀損問題進行偵錯

Crashlytics 可收集 GWP-ASan 報告,協助您對原生記憶體錯誤造成的當機問題進行偵錯。這些記憶體相關錯誤可能與應用程式內的記憶體毀損有關,而這是造成應用程式安全漏洞的主要原因。

在 Firebase 控制台的「DevOps & Engagement」>「Crashlytics 資訊主頁」中,您可以對這項資料執行下列操作:

  • 點選問題詳細資料,即可在新的「記憶體堆疊追蹤」分頁中查看這項資料。

  • 您可以使用新的「GWP-ASan 報告」信號和篩選器,快速查看含有這項資料的所有問題。

只要在應用程式中明確啟用 GWP-ASan,並使用 Crashlytics SDK for NDK 18.3.6 以上版本 (Firebase BoM 31.3.0 以上版本),即可取得 GWP-ASan 記憶體報告。您可以使用 Android 說明文件中的原生程式碼範例,測試 GWP-ASan 設定。

回報非致命例外狀況

除了自動回報應用程式當機情形外,Crashlytics 還可讓您記錄非致命例外狀況,並在下次啟動應用程式時傳送給您。

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

Kotlin

try {
    methodThatThrows()
} catch (e: Exception) {
    Firebase.crashlytics.recordException(e)
    // handle your exception here
}

Java

try {
    methodThatThrows();
} catch (Exception e) {
    FirebaseCrashlytics.getInstance().recordException(e);
    // handle your exception here
}

此外,您也可以將自訂金鑰附加至特定的非致命例外狀況。例如:

Kotlin

try {
    methodThatThrows()
} catch (e: Exception) {
    Firebase.crashlytics.recordException(e) {
        key("string key", "string value")
        key("boolean key", true)
        key("float key", Float.MAX_VALUE)
    }
    // handle your exception here
}

Java

try {
    methodThatThrows();
} catch (Exception e) {
    CustomKeysAndValues keysAndValues = new CustomKeysAndValues.Builder()
            .putString("string key", "string value")
            .putBoolean("boolean key", true)
            .putFloat("float key", Float.MAX_VALUE)
            .build();
    FirebaseCrashlytics.getInstance().recordException(e, keysAndValues);
    // handle your exception here
}

所有記錄的例外狀況都會在 Firebase 控制台的「DevOps & Engagement」 > 「Crashlytics」資訊主頁中顯示為非致命問題。問題摘要包含您通常會從當機事件取得的所有狀態資訊,以及依 Android 版本和硬體裝置細分的資料。

Crashlytics 會在專屬背景執行緒上處理例外狀況,盡可能減少對應用程式效能的影響。為減少使用者的網路流量,Crashlytics 會將記錄的例外狀況批次處理,並在下次啟動應用程式時傳送。

取得當機前使用者動作記錄

當機前使用者動作記錄可協助您進一步瞭解使用者在發生當機、非致命錯誤或 ANR 事件前,與應用程式的互動情形。在嘗試重現及偵錯問題時,這些記錄會很有幫助。

當機前使用者動作記錄由 Google Analytics 提供,因此您必須為 Firebase 專案啟用 Google Analytics,並在應用程式中新增 Google Analytics 的 Firebase SDK,才能取得這類記錄。符合這些條件後,當您查看問題詳細資料時,當機前使用者動作記錄就會自動包含在「記錄」分頁的事件資料中 (您可以在 Firebase 控制台的「開發運作和參與度」>「Crashlytics 資訊主頁」中查看所有問題)。

Analytics SDK 會自動記錄 screen_view 事件,讓當機前使用者動作記錄顯示當機、非致命錯誤或 ANR 事件發生前,使用者瀏覽過的畫面清單。screen_view 當機前使用者動作記錄包含 firebase_screen_class 參數。

當機前使用者動作記錄也會填入您在使用者工作階段中手動記錄的任何自訂事件,包括事件的參數資料。這項資料可協助您瞭解導致當機、一般錯誤或 ANR 事件的一連串使用者動作。

請注意,您可以控管 Google Analytics 資料的收集和使用方式,包括填入當機前使用者動作記錄的資料。

啟用選擇加入報表

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

  1. 在 AndroidManifest.xml 檔案的 application 區塊中,新增 meta-data 標記,關閉自動收集功能:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. 在執行階段呼叫 Crashlytics 資料收集覆寫,為特定使用者啟用收集功能。覆寫值會在後續所有應用程式啟動時保留,因此 Crashlytics 可以自動收集該使用者的報表。

    Kotlin

    Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)

    Java

    FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);

    如果使用者之後選擇不收集資料,您可以傳遞 false 做為覆寫值,這會在使用者下次啟動應用程式時套用,並在該使用者之後的所有啟動中持續套用。

管理 Crash Insights 資料

Crash Insights 會將您的去識別化堆疊追蹤與其他 Firebase 應用程式的追蹤記錄進行比較,並在問題屬於更廣泛的趨勢時通知您,協助您解決問題。對於許多問題,當機情況深入分析甚至會提供資源,協助您對當機情況進行偵錯。

Crash Insights 會使用匯總的當機資料,找出常見的穩定性趨勢。如果不想分享應用程式資料,可以前往 Firebase 控制台的 DevOps 與參與度 > Crashlytics 資訊主頁 資訊主頁,在問題清單頂端的 當機深入分析 選單中,選擇不採用當機深入分析功能。

後續步驟