Menyesuaikan laporan error Firebase Crashlytics

Panduan ini menjelaskan cara menyesuaikan laporan error menggunakan Crashlytics API. Secara default, Crashlytics mengumpulkan laporan error native platform otomatis untuk semua pengguna aplikasi Anda (Anda juga dapat menonaktifkan pelaporan error otomatis dan mengaktifkan pelaporan keikutsertaan untuk pengguna Anda). Crashlytics menyediakan lima mekanisme logging siap pakai: kunci kustom, log kustom, ID pengguna, pengecualian yang tertangkap, dan pengecualian yang tidak tertangkap.

Untuk aplikasi Flutter, laporan fatal dikirim ke Crashlytics secara real-time tanpa mengharuskan pengguna memulai ulang aplikasi. Laporan non-fatal ditulis ke disk untuk dikirim bersama dengan laporan fatal berikutnya atau saat aplikasi dimulai ulang.

Melaporkan pengecualian yang tidak tertangkap

Anda dapat secara otomatis menangkap semua error "fatal" yang ditampilkan dalam framework Flutter dengan mengganti FlutterError.onError dengan FirebaseCrashlytics.instance.recordFlutterFatalError. Atau, untuk juga menangkap pengecualian "non-fatal", ganti FlutterError.onError dengan FirebaseCrashlytics.instance.recordFlutterError:

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());
}

Error asinkron

Error asinkron tidak tertangkap oleh framework Flutter:

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

Untuk menangkap error tersebut, Anda dapat menggunakan pengendali 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());

}

Error di luar Flutter

Untuk menangkap error yang terjadi di luar konteks Flutter, instal pemroses error di Isolate saat ini:

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

Melaporkan pengecualian yang tertangkap

Selain melaporkan error aplikasi secara otomatis, Crashlytics memungkinkan Anda mencatat pengecualian non-fatal dan mengirimkannya kepada Anda saat peristiwa fatal selanjutnya dilaporkan atau aplikasi dimulai ulang.

Gunakan metode recordError untuk mencatat pengecualian non-fatal di blok tangkapan aplikasi Anda. Contoh:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

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

Anda juga dapat memasukkan informasi lebih lanjut ke dalam log tentang error yang mungkin terjadi menggunakan properti information:

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

Pengecualian ini muncul sebagai masalah non-fatal di Firebase console. Ringkasan masalah berisi semua informasi status yang biasanya Anda dapatkan dari error, bersama dengan perincian error berdasarkan versi dan perangkat hardware.

Crashlytics memproses pengecualian pada thread latar belakang khusus untuk meminimalkan dampak performa pada aplikasi Anda. Untuk mengurangi traffic jaringan pengguna, Crashlytics akan membatasi jumlah laporan yang dikirim dari perangkat, jika diperlukan.

Menambahkan kunci kustom

Kunci kustom membantu Anda mendapatkan status tertentu aplikasi menjelang error. Anda dapat mengaitkan key-value pair apa pun dengan laporan error, lalu menggunakan kunci kustom untuk menelusuri dan memfilter laporan error di Firebase console.

  • Di dasbor Crashlytics, Anda dapat mencari masalah yang cocok dengan kunci kustom.

  • Saat meninjau masalah tertentu di console, Anda dapat melihat kunci kustom yang dikaitkan untuk setiap peristiwa (subtab Keys) dan bahkan memfilter peristiwa berdasarkan kunci kustom (menu Filter di bagian atas halaman).

Gunakan metode instance setCustomKey untuk menetapkan key-value pair. Berikut beberapa contohnya:

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

Menambahkan pesan log kustom

Untuk memberikan lebih banyak konteks mengenai peristiwa menjelang error, Anda dapat menambahkan log Crashlytics kustom ke aplikasi. Crashlytics mengaitkan log dengan data error dan menampilkannya di Firebase console, pada tab Logs di Crashlytics.

Gunakan log untuk membantu menentukan masalah. Contoh:

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

Menetapkan ID pengguna

Untuk mendiagnosis masalah, mengetahui pengguna mana yang mengalami error akan sangat membantu. Crashlytics menyertakan cara mengidentifikasi pengguna secara anonim dalam laporan error Anda.

Untuk menambahkan ID pengguna ke laporan, tetapkan ID unik untuk setiap pengguna dalam bentuk nomor ID, token, atau nilai hash:

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Jika perlu menghapus ID pengguna setelah menetapkannya, reset nilainya ke string kosong. Menghapus ID pengguna tidak menghapus catatan Crashlytics yang ada. Jika ingin menghapus catatan yang terkait dengan ID pengguna, hubungi dukungan Firebase.

Mengaktifkan pelaporan keikutsertaan

Secara default, Crashlytics otomatis mengumpulkan laporan error untuk semua pengguna aplikasi Anda. Untuk memberi pengguna kontrol lebih terhadap data yang mereka kirim, Anda dapat mengaktifkan pelaporan keikutsertaan dengan menonaktifkan pelaporan otomatis dan hanya mengirim data ke Crashlytics saat Anda ingin melakukannya dalam kode:

  1. Menonaktifkan pengumpulan otomatis secara native:

    Platform Apple

    Tambahkan kunci baru ke file Info.plist Anda:

    • Kunci: FirebaseCrashlyticsCollectionEnabled
    • Nilai: false

    Android

    Pada blok application file AndroidManifest.xml, tambahkan tag meta-data untuk menonaktifkan pengumpulan otomatis:

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. Aktifkan pengumpulan untuk pengguna tertentu dengan memanggil penggantian pengumpulan data Crashlytics saat runtime.

    Nilai penggantian tetap ada setiap kali aplikasi diluncurkan, sehingga Crashlytics dapat otomatis mengumpulkan laporan. Untuk tidak diikutsertakan dalam pelaporan error otomatis, teruskan false sebagai nilai penggantian. Jika ditetapkan ke false, nilai baru tidak berlaku hingga aplikasi dijalankan berikutnya.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

Mengelola data Crash Insights

Crash Insights membantu Anda mengatasi masalah dengan membandingkan pelacakan tumpukan anonim dengan trace dari aplikasi Firebase lain, serta memberitahukan apakah masalah Anda adalah bagian dari tren yang lebih besar. Untuk sebagian besar masalah, Crash Insights bahkan menyediakan resource untuk membantu Anda mendebug error.

Crash Insights menggunakan data error gabungan untuk mengidentifikasi tren stabilitas umum. Jika tidak ingin membagikan data aplikasi, Anda dapat menonaktifkan Crash Insights dari menu Crash Insights di bagian atas daftar masalah Crashlytics pada Firebase console.