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
Buka Setelan Project. Di kartu Aplikasi Anda, pilih nama paket aplikasi yang Anda perlukan file konfigurasinya.
Klik Download google-services.json untuk mendapatkan file konfigurasi Android Firebase Anda (
google-services.json
).Anda dapat mendownload file konfigurasi Android Firebase lagi kapan saja.
Pastikan nama file konfigurasi tidak ditambahi karakter lain, seperti
(2)
.
Pindahkan file konfigurasi ke direktori modul (level aplikasi) aplikasi Anda.
Langkah 2: Tambahkan Firebase Crashlytics SDK
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 pluginclasspath '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' } }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'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:
Di file
build.gradle
level aplikasi, ganti dependensi Fabric NDK dengan dependensi Firebase Crashlytics NDK. Kemudian, tambahkan ekstensifirebaseCrashlytics
dan pastikan untuk mengaktifkan flagnativeSymbolUploadEnabled
. 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}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
Uji implementasi Anda dengan sengaja menimbulkan error pengujian yang akan mengirim laporan error ke dasbor Crashlytics di Firebase console.
Sesuaikan penyiapan laporan error dengan menambahkan pelaporan keikutsertaan, log, kunci, dan pelacakan error non-fatal.
Tambahkan Google Analytics ke aplikasi Anda. Gabungkan keandalan Google Analytics dengan Firebase Crashlytics untuk melihat statistik pengguna bebas error di Firebase console.