Mendapatkan laporan error Android NDK

Jika aplikasi Android berisi library native, Anda dapat mengaktifkan pelacakan tumpukan menyeluruh dan laporan error yang mendetail untuk kode native dari Firebase Crashlytics dengan sejumlah pembaruan kecil pada konfigurasi build aplikasi Anda.

Panduan ini menjelaskan cara mengonfigurasi pelaporan error dengan Firebase Crashlytics SDK untuk NDK.

Jika Anda mencari cara memulai penggunaan Crashlytics di project Unity, lihat panduan Memulai Unity.

Sebelum memulai

  1. Tambahkan Firebase ke project Android jika belum melakukannya. Jika tidak memiliki aplikasi Android, Anda dapat mendownload aplikasi contoh.

  2. Direkomendasikan: Untuk mendapatkan fitur seperti pengguna bebas error, log breadcrumb, dan pemberitahuan kecepatan, Anda harus mengaktifkan Google Analytics di project Firebase.

    • Jika project Firebase yang ada belum mengaktifkan Google Analytics, Anda dapat melakukannya dari tab Integrations di > Project settings di Firebase console.

    • Jika Anda membuat project Firebase baru, aktifkan Google Analytics selama alur kerja pembuatan project.

Langkah 1: Tambahkan Firebase Crashlytics SDK untuk NDK ke aplikasi Anda

Dengan Firebase Android BoM, deklarasikan dependensi untuk library Android Crashlytics NDK dalam file Gradle modul (level aplikasi), biasanya berupa app/build.gradle.

Untuk mengoptimalkan penggunaan Crashlytics, sebaiknya aktifkan Google Analytics di project Firebase dan tambahkan Firebase SDK untuk Google Analytics ke aplikasi Anda.

Java

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:30.3.0')

    // Declare the dependencies for the Crashlytics NDK and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ndk'
    implementation 'com.google.firebase:firebase-analytics'
}

Dengan menggunakan Firebase Android BoM, aplikasi Anda akan selalu menggunakan versi library Android Firebase yang kompatibel.

(Alternatif) Deklarasikan dependensi library Firebase tanpa menggunakan BoM

Jika memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi library Firebase di baris dependensinya.

Perlu diperhatikan bahwa jika Anda menggunakan beberapa library Firebase di aplikasi, sebaiknya gunakan BoM untuk mengelola versi library, yang memastikan bahwa semua versi kompatibel.

dependencies {
    // Declare the dependencies for the Crashlytics NDK and Analytics libraries
    // When NOT using the BoM, you must specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.11'
    implementation 'com.google.firebase:firebase-analytics:21.1.0'
}

Kotlin+KTX

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:30.3.0')

    // Declare the dependencies for the Crashlytics NDK and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ndk'
    implementation 'com.google.firebase:firebase-analytics-ktx'
}

Dengan menggunakan Firebase Android BoM, aplikasi Anda akan selalu menggunakan versi library Android Firebase yang kompatibel.

(Alternatif) Deklarasikan dependensi library Firebase tanpa menggunakan BoM

Jika memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi library Firebase di baris dependensinya.

Perlu diperhatikan bahwa jika Anda menggunakan beberapa library Firebase di aplikasi, sebaiknya gunakan BoM untuk mengelola versi library, yang memastikan bahwa semua versi kompatibel.

dependencies {
    // Declare the dependencies for the Crashlytics NDK and Analytics libraries
    // When NOT using the BoM, you must specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.11'
    implementation 'com.google.firebase:firebase-analytics-ktx:21.1.0'
}

Langkah 2: Tambahkan plugin Firebase Crashlytics ke aplikasi Anda

  1. Di file build.gradle level project, tambahkan plugin Gradle Crashlytics sebagai dependensi buildscript.

    buildscript {
        repositories {
            // Check that you have Google's Maven repository (if not, add it).
            google()
        }
    
        dependencies {
            // ...
    
            // Check that you have the Google services Gradle plugin v4.3.2 or later
            // (if not, add it).
            classpath 'com.google.gms:google-services:4.3.13'
    
            // Add the Crashlytics Gradle plugin
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.1'
        }
    }
    
    allprojects {
        repositories {
            // Check that you have Google's Maven repository (if not, add it).
            google()
        }
    }
  2. Di file build.gradle level aplikasi, terapkan plugin Gradle Crashlytics:

    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin
    
    // Apply the Crashlytics Gradle plugin
    apply plugin: 'com.google.firebase.crashlytics'
    

Langkah 3: Tambahkan ekstensi firebaseCrashlytics ke build Anda

Dalam file Gradle modul (level aplikasi), (biasanya app/build.gradle), tambahkan ekstensi firebaseCrashlytics.

Java

// ...

android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Firebase servers.
              // By default, this is disabled to improve build speeds.
              // This flag must be enabled to see properly-symbolicated native
              // stack traces in the Crashlytics dashboard.
              nativeSymbolUploadEnabled true
          }
      }
  }
}

Kotlin+KTX

// ...

android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Firebase servers.
              // By default, this is disabled to improve build speeds.
              // This flag must be enabled to see properly-symbolicated native
              // stack traces in the Crashlytics dashboard.
              nativeSymbolUploadEnabled true
          }
      }
  }
}

Langkah 4: Siapkan upload otomatis simbol native

Untuk menghasilkan pelacakan tumpukan yang dapat dibaca dari error NDK, Crashlytics perlu mengetahui simbol dalam biner native Anda. Plugin Gradle Crashlytics menyertakan tugas uploadCrashlyticsSymbolFileBUILD_VARIANT untuk mengotomatiskan proses ini.

  1. Agar Anda dapat mengakses tugas untuk upload simbol otomatis, pastikan nativeSymbolUploadEnabled ditetapkan ke true dalam file Gradle modul (level aplikasi).

  2. Agar nama metode muncul dalam pelacakan tumpukan, Anda harus secara eksplisit memanggil tugas uploadCrashlyticsSymbolFileBUILD_VARIANT setelah setiap build library NDK. Contoh:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. Baik Crashlytics SDK untuk NDK maupun plugin Gradle Crashlytics bergantung pada keberadaan ID build GNU dalam objek native bersama.

    Anda dapat memverifikasi keberadaan ID ini dengan menjalankan readelf -n pada setiap biner. Jika ID build tidak ada, tambahkan -Wl,--build-id ke flag sistem build untuk memperbaiki masalah ini.

Langkah 5: Paksa error pengujian untuk menyelesaikan penyiapan

Untuk menyelesaikan penyiapan Crashlytics dan melihat data awal di dasbor Crashlytics pada Firebase console, Anda harus memaksa error pengujian.

  1. Tambahkan kode ke aplikasi yang dapat Anda gunakan untuk memaksa error pengujian.

    Anda dapat menggunakan kode berikut di MainActivity aplikasi untuk menambahkan tombol ke aplikasi Anda yang, jika ditekan, akan menyebabkan error. Tombol tersebut diberi label "Test Crash".

    Java

    Button crashButton = new Button(this);
    crashButton.setText("Test Crash");
    crashButton.setOnClickListener(new View.OnClickListener() {
       public void onClick(View view) {
           throw new RuntimeException("Test Crash"); // Force a crash
       }
    });
    
    addContentView(crashButton, new ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT,
           ViewGroup.LayoutParams.WRAP_CONTENT));
    

    Kotlin+KTX

    val crashButton = Button(this)
    crashButton.text = "Test Crash"
    crashButton.setOnClickListener {
       throw RuntimeException("Test Crash") // Force a crash
    }
    
    addContentView(crashButton, ViewGroup.LayoutParams(
           ViewGroup.LayoutParams.MATCH_PARENT,
           ViewGroup.LayoutParams.WRAP_CONTENT))
    
  2. Build dan jalankan aplikasi Anda.

  3. Paksa error pengujian untuk mengirimkan laporan error pertama aplikasi:

    1. Buka aplikasi dari emulator atau perangkat pengujian.

    2. Di aplikasi Anda, tekan tombol "Test Crash" yang telah ditambahkan menggunakan kode di atas.

    3. Setelah aplikasi Anda mengalami error, mulai ulang aplikasi agar dapat mengirimkan laporan error ke Firebase.

  4. Buka dasbor Crashlytics pada Firebase console untuk melihat error pengujian Anda.

    Jika Anda sudah me-refresh konsol dan masih tidak melihat error pengujian setelah lima menit, aktifkan logging debug untuk melihat apakah aplikasi Anda mengirim laporan error atau tidak.


Dan selesai! Crashlytics kini akan memantau aplikasi Anda untuk menemukan error, dan Anda dapat melihat serta menyelidiki laporan error dan statistik error di dasbor Crashlytics.



Opsi alternatif untuk mengupload simbol

Alur kerja utama yang dijelaskan di atas pada halaman ini berlaku untuk build Gradle standar. Namun, beberapa aplikasi menggunakan konfigurasi atau alat yang berbeda (misalnya proses build selain Gradle). Dalam situasi ini, opsi berikut mungkin berguna agar berhasil mengupload simbol.

Opsi: Upload simbol untuk modul library dan dependensi eksternal

Opsi ini dapat berguna dalam situasi berikut:

  • Jika Anda menggunakan proses build NDK yang disesuaikan dalam Gradle
  • Jika library native Anda di-build dalam modul library/fitur atau disediakan oleh pihak ketiga
  • Jika tugas upload simbol otomatis gagal atau Anda melihat error yang tidak disimbolisasi di dasbor

Opsi: Upload simbol untuk build non-Gradle atau library native unstripped yang tidak dapat diakses

Opsi ini dapat berguna dalam situasi berikut:

  • Jika Anda menggunakan proses build selain Gradle

  • Jika library native unstripped yang disediakan untuk Anda tidak dapat diakses selama build Gradle



Pemecahan masalah

Jika pelacakan tumpukan di Firebase console dan di logcat berbeda, lihat panduan Pemecahan Masalah.

Langkah berikutnya

  • Sesuaikan penyiapan laporan error dengan menambahkan keikutsertaan pelaporan, log, kunci, dan pelacakan error non-fatal.

  • Integrasikan dengan Google Play sehingga Anda dapat memfilter laporan error aplikasi Android menurut jalur Google Play secara langsung di dasbor Crashlytics. Dengan demikian, Anda dapat lebih memfokuskan dasbor pada build tertentu.