Mengupgrade ke Firebase Crashlytics SDK

Anda kini dapat menyiapkan Crashlytics di aplikasi menggunakan Firebase Crashlytics SDK resmi baru, yang menawarkan API yang lebih baik dan lebih konsisten dengan produk Firebase lainnya serta lebih intuitif untuk digunakan.

Panduan ini menjelaskan cara mengupgrade ke SDK baru dari Fabric SDK yang lama. Panduan ini menjelaskan perubahan yang ada pada API baru, alasan perubahan, dan cara mengubah kode Anda, jika diperlukan.

Sebelum memulai

Firebase Crashlytics SDK menggunakan AndroidX sebagai dependensi. Jadi, jika aplikasi Anda menggunakan Support Library Aplikasi versi lama, migrasikan aplikasi terlebih dahulu ke AndroidX.

Langkah 1: Tambahkan file konfigurasi Firebase

  1. Buka Setelan Project. Di kartu Aplikasi Anda, pilih nama paket aplikasi yang Anda perlukan file konfigurasinya.

  2. Klik Download google-services.json untuk mendapatkan file konfigurasi Android Firebase Anda (google-services.json).

  3. Pindahkan file konfigurasi ke direktori modul (level aplikasi) aplikasi Anda.

Langkah 2: Tambahkan Firebase Crashlytics SDK

  1. Di build.gradle level root (level project) aplikasi Anda:

    • Ganti repositori Maven Fabric dengan repositori Maven Google.

    • Ganti plugin Gradle Fabric dengan plugin Gradle Firebase Crashlytics. Jika Anda menggunakan Android Studio 4.1 Canary, pastikan untuk menambahkan plugin Gradle Crashlytics versi 2.0.0 atau yang lebih baru.

    buildscript {
      // ...
    
      repositories {
        // ...
    
        // Remove Fabric's Maven repository
        maven { url 'https://maven.fabric.io/public' }
    
        // Add Google's Maven repository (if it's not there already)
        google()
      }
    
      dependencies {
        // ..
    
        // Add the Google Services Gradle plugin (if it's not there already)
        classpath 'com.google.gms:google-services:4.3.10'
    
        // Remove the Fabric Gradle plugin
        classpath 'io.fabric.tools:gradle:1.31.2'
    
        // Add the Crashlytics Gradle plugin (use v2.0.0+ if you built
        // your app with Android Studio 4.1).
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
      }
    }
    
  2. Di build.gradle level aplikasi, ganti plugin Fabric dengan plugin Firebase Crashlytics:

    apply plugin: 'com.android.application'
    
    // Apply the Google Services plugin (if it's not there already)
    apply plugin: 'com.google.gms.google-services'
    
    // Remove the Fabric plugin
    apply plugin: 'io.fabric'
    
    // Add the Firebase Crashlytics plugin
    apply plugin: 'com.google.firebase.crashlytics'
    
  3. Terakhir, tambahkan Firebase Crashlytics SDK. Di level aplikasi build.gradle, ganti Fabric Crashlytics SDK lama dengan Firebase Crashlytics SDK yang baru. Pastikan Anda menambahkan versi 17.0.0 atau yang lebih baru (mulai tanggal 15 November 2020, versi ini diperlukan agar laporan error muncul di Firebase console).

    dependencies {
      // Remove the Fabric Crashlytics SDK
      implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    
      // Add the Firebase Crashlytics SDK
      implementation 'com.google.firebase:firebase-crashlytics:18.2.7'
    
      // Recommended: Add the Google Analytics SDK
      implementation 'com.google.firebase:firebase-analytics:20.0.2'
    }
    

(Opsional) Siapkan pelaporan error NDK

Firebase Crashlytics menawarkan pelaporan error untuk aplikasi yang di-build menggunakan Android Native Development Kit (NDK).

Untuk mendeteksi dan melaporkan masalah pada native code:

  1. Di file build.gradle level aplikasi, ganti dependensi Fabric NDK dengan dependensi Firebase Crashlytics NDK. Kemudian, tambahkan ekstensi firebaseCrashlytics dan pastikan untuk mengaktifkan flag nativeSymbolUploadEnabled. Dengan demikian, aplikasi Anda dapat memproses dan mengupload simbol native ke Crashlytics sehingga Anda dapat melihat pelacakan tumpukan yang disimbolisasi dengan benar di dasbor Crashlytics.

    dependencies {
      // Remove the Fabric NDK dependency
      implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.1.1'
    
      // Add the Firebase Crashlytics NDK dependency
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.7'
    }
    // ...
    
    android {
        // ...
    
        buildTypes {
            release {
                /* Add the firebaseCrashlytics extension (by default,
                * it's disabled to improve build speeds) and set
                * nativeSymbolUploadEnabled to true. */
    
                firebaseCrashlytics {
                    nativeSymbolUploadEnabled true
                }
            }
        }
    }
    
    // Remove this extension (it previously enabled Crashlytics NDK reporting in Fabric)
    crashlytics {
      enableNdk true
    }
    
  2. Jalankan tugas Gradle khusus NDK berikut:

    > ./gradlew app:assembleBUILD_VARIANT
    > ./gradlew app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    

Untuk mengetahui informasi selengkapnya tentang penggunaan Crashlytics untuk pelaporan error NDK, baca Dokumentasi Crashlytics NDK.

Langkah 3: Perbarui kode

Tinjau perubahan SDK berikut dan lakukan perubahan yang sesuai pada kode Anda:


Crashlytics kini merotasi ID berdasarkan ID penginstalan Firebase.

Crashlytics menggunakan UUID Penginstalan Crashlytics untuk mengidentifikasi instance aplikasi Anda dan untuk mengaitkan data pengguna dengan perangkat mereka. Sebelumnya, Crashlytics merotasi UUID Penginstalan pengguna saat ID iklan perangkat mereka berubah. Sekarang, Crashlytics merotasi UUID Penginstalan berdasarkan ID penginstalan Firebase (FID) pengguna. Untuk informasi selengkapnya, buka Mengelola ID penginstalan Firebase.

Alasan perubahan

Penggunaan FID konsisten dengan Firebase SDK lainnya.


Paket dan nama class baru untuk Crashlytics adalah com.google.firebase.crashlytics.FirebaseCrashlytics.

Anda kini dapat memanggil fitur Crashlytics menggunakan metode instance di singleton FirebaseCrashlytics, bukan fungsi statis di class FirebaseCrashlytics. Singleton FirebaseCrashlytics dapat diakses secara global melalui fungsi statis getInstance().

Fabric SDK

Java

import com.crashlytics.android.Crashlytics;

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Kotlin+KTX

import com.crashlytics.android.Crashlytics

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Firebase Crashlytics SDK

Java

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

// Operations on FirebaseCrashlytics.
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.someAction();

Kotlin+KTX

import com.google.firebase.crashlytics.FirebaseCrashlytics

// ...

// Operations on FirebaseCrashlytics.
val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.someAction()

Alasan perubahan

Paket root dan titik entri SDK yang baru kini konsisten dengan Firebase SDK lainnya. Selain itu, metode instance lebih mudah ditiru daripada fungsi statis dan membuat tantangan pengujian yang lebih sedikit.


FirebaseCrashlytics tidak lagi berfungsi dengan Fabric SDK.

Kini, Crashlytics otomatis dimulai menggunakan ContentProvider yang ditentukan di Firebase Crashlytics SDK baru, yang tidak lagi menggunakan kunci Fabric API. Crashlytics sekarang menggunakan file google-services.json aplikasi Anda untuk mengaitkan aplikasi dengan project Firebase dan menyimpan data error historis Anda.

Hapus kunci Fabric API (io.fabric.ApiKey) yang dideklarasikan dalam file AndroidManifest.xml, jika ada:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.your_app_package">

   <application>
      <activity android:name=".MainActivity"/>

      <!-- Remove this line if it exists -->
      <meta-data android:name="io.fabric.ApiKey"
          android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />

   </application>
</manifest>

Secara default, Crashlytics otomatis mengumpulkan dan melaporkan error untuk semua instance aplikasi, tetapi Anda dapat memilih untuk mengaktifkannya hanya bagi pengguna yang memilih ikut serta. Untuk menonaktifkan pelaporan error otomatis, dalam blok <application> file AndroidManifest.xml Anda, tetapkan firebase_crashlytics_collection_enabled ke false:

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />

Alasan perubahan

Agar konsisten dengan Firebase SDK lainnya, kini Crashlytics dimulai secara otomatis melalui ContentProvider. Seperti SDK lainnya, Crashlytics kini menyediakan flag manifes untuk menonaktifkan pengumpulan data otomatis, yang dapat Anda ganti setiap saat menggunakan setCrashlyticsCollectionEnabled. Metode tersebut memberi Anda kontrol lebih terhadap perilaku pelaporan error aplikasi.


Crashlytics.log kini menjadi metode instance.

SDK baru tidak lagi menyertakan metode Crashlytics.log statis. Untuk menambahkan pesan log kustom, gunakan metode instance crashlytics.log baru. Perhatikan bahwa metode baru ini tidak lagi melakukan echo ke logcat (sebaiknya tuliskan wrapper jika ingin mempertahankan perilaku ini). Untuk informasi selengkapnya, kunjungi menambahkan pesan log kustom.

Fabric SDK

Java

Crashlytics.log("my message");

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message");

Kotlin+KTX

Crashlytics.log("my message")

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message")

Firebase Crashlytics SDK

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.log("my message");

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message");

Kotlin+KTX

val crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.log("my message")

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message")

Alasan perubahan

Atas permintaan Anda, kami telah berhenti melakukan echo log Crashlytics ke logcat. Menggunakan metode instance juga mempermudah pengujian kode Anda.


setBool, setDouble, setFloat, dan setInt, setLong, dan setString digabungkan ke dalam setCustomKey.

Kami menggabungkan penyetel kunci kustom ke dalam metode setCustomKey. Sebelumnya, Anda dapat menggunakan penyetel kunci kustom untuk menetapkan key-value pair untuk dikirim bersama dengan laporan error. Sekarang, Anda dapat menggunakan setCustomKey(String, value), yang kelebihan beban untuk menerima jenis primitif dan String. Untuk informasi selengkapnya, kunjungi Menambahkan kunci kustom.

Fabric SDK

Java

Crashlytics.setBool("bool_key",true);

Crashlytics.setDouble("double_key",42.0);

Crashlytics.setFloat("float_key",42.0F);

Crashlytics.setInt("int_key",42);

Crashlytics.setLong("long_key",42L);

Crashlytics.setString("str_key","str_value");

Kotlin+KTX

Crashlytics.setBool("bool_key",true)

Crashlytics.setDouble("double_key",42.0)

Crashlytics.setFloat("float_key",42.0F)

Crashlytics.setInt("int_key",42)

Crashlytics.setLong("long_key",42L)

Crashlytics.setString("str_key","str_value")

Firebase Crashlytics SDK

Java

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("bool_key",true);

crashlytics.setCustomKey("double_key",42.0);

crashlytics.setCustomKey("float_key",42.0F);

crashlytics.setCustomKey("int_key",42);

crashlytics.setCustomKey("long_key",42L);

crashlytics.setCustomKey("str_key","42");

Kotlin+KTX

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.setCustomKey("bool_key",true)

crashlytics.setCustomKey("double_key",42.0)

crashlytics.setCustomKey("float_key",42.0F)

crashlytics.setCustomKey("int_key",42)

crashlytics.setCustomKey("long_key",42L)

crashlytics.setCustomKey("str_key","42")

Alasan perubahan

Nama metode baru bersifat unik untuk Crashlytics dan memperjelas bahwa Crashlytics tidak mematuhi nilai kunci.


setUserIdentifier kini menjadi setUserId. setUserName dan setUserEmail dihapus.

Sebelumnya, Anda dapat menetapkan nama atau email yang terkait dengan error menggunakan setUserName dan setUserEmail, tetapi metode ini tidak lagi ditentukan. Metode pilihan baru untuk menetapkan ID bagi pengguna adalah menggunakan setUserId. Untuk informasi selengkapnya, kunjungi Menetapkan ID pengguna.

Fabric SDK

Java

Crashlytics.setUserIdentifier("myAppUserId");

Crashlytics.setUserEmail("abc@example.com");

Crashlytics.setUserName("John Doe");

Kotlin+KTX

Crashlytics.setUserIdentifier("myAppUserId")

Crashlytics.setUserEmail("abc@example.com")

Crashlytics.setUserName("John Doe")

Firebase Crashlytics SDK

Java

crashlytics.setUserId("myAppUserId");

Kotlin+KTX

crashlytics.setUserId("myAppUserId")

Alasan perubahan

Kami menggunakan nama metode setUserId agar konsisten dengan Firebase API lainnya dan menghapus setUserName serta setUserEmail untuk mencegah logging PII melalui Crashlytics.


Crashlytics.logException(Throwable) diganti dengan FirebaseCrashlytics.recordException(Throwable).

Crashlytics kini juga mendukung logging jenis error dan pengecualian bawaan untuk aplikasi Apple dan Android.

Fabric SDK

Java

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
Crashlytics.logException(e);
}

Kotlin+KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
Crashlytics.logException(e)
}

Firebase Crashlytics SDK

Java

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
FirebaseCrashlytics.getInstance().recordException(e);
}

Kotlin+KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
FirebaseCrashlytics.getInstance().recordException(e)
}

Alasan perubahan

Metode baru recordException(Throwable) lebih mudah dibedakan dari log(String), yang berperilaku berbeda. Selain itu, kami mengganti nama API baru agar lebih konsisten di seluruh platform.


CrashlyticsListener diganti dengan didCrashOnPreviousExecution().

CrashlyticsListener sebelumnya mengizinkan Crashlytics menunjukkan kapan sesi aplikasi sebelumnya berakhir dengan error, yang berguna untuk aplikasi yang menampilkan pesan pasca-error saat diluncurkan ulang. Sekarang, callback-nya diganti dengan panggilan API sinkron didCrashOnPreviousExecution().

Fabric SDK

Java

CrashlyticsListener crashlyticsListener =
new CrashlyticsListener() {
  @Override
  public void crashlyticsDidDetectCrashDuringPreviousExecution() {
    // ...App code to execute if a crash occurred during previous execution.
  }
};

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
                                      .listener(crashlyticsListener)
                                      .build();

Crashlytics crashlytics = new Crashlytics.Builder().core(crashlyticsCore).build();

Fabric.with(getContext(), crashlytics);

Kotlin+KTX

val crashlyticsListener = CrashlyticsListener {
  // ...App code to execute if a crash occurred during previous execution.
}
val crashlyticsCore = CrashlyticsCore.Builder()
  .listener(crashlyticsListener)
  .build()
val crashlytics = Crashlytics.Builder().core(crashlyticsCore).build()
Fabric.with(getContext(), crashlytics)

Firebase Crashlytics SDK

Java

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

Kotlin+KTX

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

Alasan perubahan

API baru lebih pendek dan lebih mudah digunakan daripada CrashlyticsListener karena tidak memerlukan teks boilerplate atau callback. Sebelumnya, callback asinkron tidak menjamin kapan callback akan dipanggil.


Metode error dihapus.

SDK baru tidak lagi menyertakan metode error, yang sebelumnya dapat Anda gunakan untuk memvalidasi konfigurasi Crashlytics dengan menimbulkan error dengan sengaja di aplikasi Anda. Lemparkan RuntimeException untuk menimbulkan error secara sengaja.

Fabric SDK

Java

Crashlytics.getInstance().crash();

Kotlin+KTX

Crashlytics.getInstance().crash()

Firebase Crashlytics SDK

Java

throw new RuntimeException("Test Crash");

Kotlin+KTX

throw RuntimeException("Test Crash")

Alasan perubahan

Metode baru ini secara jelas menentukan apakah error yang dihasilkan aplikasi Anda terjadi selama runtime atau di SDK native aplikasi.


Plugin Gradle Crashlytics berisi flag baru.

Plugin Gradle terus mengonfigurasi dan menjalankan tugas Gradle khusus Crashlytics secara otomatis. Jika build Anda memerlukan pemanggilan tugas dari plugin Gradle Crashlytics, lihat tugas Firebase Crashlytics yang tersedia dengan menjalankan ./gradlew app:tasks. Jika aplikasi Anda menggunakan NDK, panggil tugas Gradle uploadCrashlyticsSymbolFile[BUILD_VARIANT] secara eksplisit untuk terus mengupload simbol native ke Crashlytics.

Flag build khusus Crashlytics ext.alwaysUpdateBuildId dan ext.enableCrashlytics tidak lagi didukung. Hapus semuanya dari konfigurasi Gradle jika ada. Jika aplikasi Anda menggunakan obfuscator bytecode (misalnya, R8 atau Proguard) dan Anda tidak ingin mengupload file pemetaan build ke Crashlytics, gunakan flag mappingFileUploadEnabled baru di ekstensi Gradle firebaseCrashlytics. Jika ditetapkan ke false, Crashlytics tidak dapat men-deobfuscate pelacakan tumpukan aplikasi Anda. Untuk konfigurasi obfuscator nonstandar, gunakan parameter mappingFile untuk menetapkan lokasi baru untuk file pemetaan Anda. Flag ini dapat digunakan untuk defaultConfig, serta untuk jenis atau ragam build apa pun.

Firebase Crashlytics SDK

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.gms.google-services'

android {
    // ...

    buildTypes {
        debug {
            minifyEnabled true
            firebaseCrashlytics {
                // If you don't need crash reporting for your debug build,
                // you can speed up your build by disabling mapping file uploading.
                mappingFileUploadEnabled false
            }
        }

        release {
            minifyEnabled true
            // When minifyEnabled is set to true, Crashlytics automatically
            // uploads mapping files because the plugin detects that obfuscation
            // is enabled. mappingFileUploadEnabled defaults to true if
            // minifyEnabled is true.
        }
    }
}

Alasan perubahan

Kami telah mengubah tugas dan opsi konfigurasi Gradle agar lebih konsisten dengan konvensi Gradle.


Crashlytics hanya dapat menggunakan data yang dikumpulkan oleh Google Analytics.

Anda tidak lagi dapat mengumpulkan data dengan Fabric Answers setelah mengupgrade ke Firebase Crashlytics SDK. Untuk mendapatkan metrik bagi pengguna bebas error dan breadcrumb, beralihlah untuk menggunakan Google Analytics. Perhatikan bahwa data Answers historis Anda tidak dapat dimigrasikan ke Firebase.

Lihat Mulai menggunakan Google Analytics untuk mempelajari cara menambahkan Google Analytics ke aplikasi Anda.

Alasan perubahan

Kini kami menawarkan Google Analytics untuk membantu Anda mendapatkan lebih banyak insight tentang data error. Dengan Analytics, Anda dapat terus mengumpulkan statistik untuk aplikasi di Firebase console.


Langkah berikutnya