Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Mendapatkan laporan error Android NDK

Jika aplikasi Android berisi library native, Anda dapat mengaktifkan pelacakan tumpukan penuh dan laporan error yang mendetail untuk kode native dari Firebase Crashlytics dengan sejumlah perubahan kecil pada konfigurasi build aplikasi Anda. Panduan ini menjelaskan cara mengonfigurasi pelaporan error dengan Firebase Crashlytics SDK yang baru.

Sebelum memulai

Untuk memulai, siapkan Crashlytics.

  1. Sebagai bagian dari Langkah 2 (Tambahkan plugin Firebase Crashlytics ke aplikasi Anda), pastikan aplikasi Anda menggunakan plugin Crashlytics Gradle v2.4.0+, yang memungkinkan Anda mengupload simbol hanya menggunakan biner unstripped untuk menghasilkan error yang disimbolisasi.

Langkah 1: Perbarui konfigurasi Gradle

Di build.gradle level aplikasi Anda, deklarasikan dependensi runtime Crashlytics NDK:

Java

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

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

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics'
}

// …
android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

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.

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

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics:18.2.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
      implementation 'com.google.firebase:firebase-analytics:19.0.1'
  }
  

Kotlin+KTX

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'

dependencies {
  // ...

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

  // Declare the dependency for the Firebase Crashlytics NDK library.
  // If you previously declared the Firebase Crashlytics dependency, replace it.
  // When using the BoM, you don't specify versions in Firebase library dependencies
  implementation 'com.google.firebase:firebase-crashlytics-ktx'
  implementation 'com.google.firebase:firebase-crashlytics-ndk'
  implementation 'com.google.firebase:firebase-analytics-ktx'
}

// …
android {
  // ...
  buildTypes {
      release {
          // Add this extension
          firebaseCrashlytics {
              // Enable processing and uploading of native symbols to Crashlytics 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
          }
      }
  }
}

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.

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

  dependencies {
      // Declare the dependency for the Firebase Crashlytics NDK library.
      // If you previously declared the Firebase Crashlytics dependency, replace it.
      // When NOT using the BoM, you must specify versions in Firebase library dependencies
      implementation 'com.google.firebase:firebase-crashlytics-ktx:18.2.1'
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.1'
      implementation 'com.google.firebase:firebase-analytics-ktx:19.0.1'
  }
  

Diperlukan untuk Crashlytics NDK versi 17.3.0: Jika aplikasi Anda menggunakan targetSdkLevel 30 ke atas, Anda juga harus menonaktifkan fitur Pemberian Tag pada Pointer di aplikasi dengan menambahkan kode berikut ke AndroidManifest.xml Anda:

<application android:allowNativeHeapPointerTagging="false">
...
</application>

Untuk informasi selengkapnya, baca Dukungan developer untuk Pointer yang Diberi Tag.

Langkah 2: Aktifkan upload simbol native

Untuk menghasilkan pelacakan tumpukan yang dapat dibaca dari error NDK, Crashlytics perlu mengetahui simbol dalam biner native Anda. Plugin Gradle kami mencakup tugas uploadCrashlyticsSymbolFileBUILD_VARIANT untuk mengotomatiskan proses ini (untuk mengakses tugas ini, pastikan nativeSymbolUploadEnabled bernilai true).

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

Crashlytics NDK v17.3.0+ dan plugin Gradle v2.4.1+ 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 3 (opsional): Upload simbol untuk modul library dan dependensi eksternal

Tugas upload simbol kami mengasumsikan bahwa Anda mem-build library native sebagai bagian dari build Gradle modul aplikasi, menggunakan alat build NDK standar seperti CMake. Jika menggunakan proses build NDK yang disesuaikan dalam Gradle, atau jika library native Anda di-build di modul library/fitur atau disediakan oleh pihak ketiga, Anda mungkin perlu secara eksplisit menentukan jalur ke library unstripped Anda. Ekstensi firebaseCrashlytics menyediakan properti unstrippedNativeLibsDir untuk melakukannya.

Tambahkan hal berikut ke file build.gradle level aplikasi:

// …
android {
    // ...
    buildTypes {
        release {
            firebaseCrashlytics {
                nativeSymbolUploadEnabled true
                unstrippedNativeLibsDir file("path/to/unstripped/dir")
            }
        }
    }
}

Plugin Crashlytics akan menelusuri direktori yang ditentukan dan semua subdirektorinya untuk menemukan library native dengan ekstensi .so. Crashlytics kemudian akan mengekstrak simbol proses debug dari semua library tersebut dan menguploadnya ke server Firebase.

Properti unstrippedNativeLibsDir menerima setiap argumen yang diizinkan untuk org.gradle.api.Project#files(Object...), termasuk java.lang.String, java.io.File, dan org.gradle.api.file.FileCollection. Anda dapat menentukan beberapa direktori untuk satu ragam build dengan memberikan daftar atau instance FileCollection.

Langkah 4 (opsional): Sesuaikan laporan error NDK

Jika mau, Anda dapat menyertakan header crashlytics.h dalam kode C++ untuk menambahkan metadata ke laporan error NDK, seperti log, kunci kustom, dan ID pengguna. crashlytics.h tersedia sebagai library C++ khusus header di Repositori GitHub Firebase Android SDK. Baca komentar di file header untuk mendapatkan petunjuk cara menggunakan NDK C++ API.

Langkah 5 (opsional): Aktifkan file simbol Breakpad untuk simbolisasi

Plugin Crashlytics Gradle menyediakan fungsi berikut:

  • Memproses biner native unstripped untuk menghasilkan file simbol.
  • Mengupload file simbol yang dihasilkan ke server kami untuk digunakan nanti saat proses simbolisasi masalah pada native code.

Plugin Crashlytics Gradle mendukung dua jenis format file simbol:
file simbol Crashlytics (cSYM) dan file simbol Breakpad.

File simbol yang dihasilkan Breakpad berisi lebih banyak informasi daripada file simbol yang dihasilkan Crashlytics, termasuk Call Frame Info (CFI) yang digunakan dalam proses pelepasan untuk membantu menghitung frame stack. Penggunaan CFI akan menghasilkan pelacakan tumpukan dengan fidelitas lebih tinggi, terutama untuk aplikasi yang sangat dioptimalkan, seperti game dan aplikasi media.

Anda dapat mengaktifkan penggunaan generator file simbol berbasis Breakpad dengan salah satu dari dua cara berikut:

  • Opsi 1: Aktifkan melalui ekstensi firebaseCrashlytics di file build.gradle

    Tambahkan hal berikut ke file build.gradle level aplikasi:

    android {
      // ...
      buildTypes {
        // ...
        release {
          // ...
          firebaseCrashlytics {
            // existing; required for either symbol file generator
            nativeSymbolUploadEnabled true
            // Add this optional new block to specify breakpad() or csym()
            symbolGenerator {
               breakpad()
            }
          }
        }
      }
    }
    

    Untuk beralih kembali ke generator file simbol Crashlytics default, Anda dapat melakukan salah satu dari hal berikut:

    • Hapus seluruh blok symbolGenerator, karena plugin ini menggunakan generator file simbol Crashlytics secara default.

    • Jangan hapus blok tersebut, tetapi ubah breakpad() menjadi csym().

  • Opsi 2: Aktifkan melalui baris properti di file properti Gradle Anda

    Anda dapat menggunakan properti com.google.firebase.crashlytics.symbolGenerator untuk mengontrol generator file simbol yang akan digunakan. Nilai yang valid untuk properti ini adalah breakpad atau csym. Jika tidak ditentukan, default saat ini setara dengan csym, tetapi dapat berubah di versi mendatang.

    Anda dapat memperbarui file properti Gradle secara manual atau memperbaruinya melalui command line. Misalnya, untuk mengaktifkan generator file simbol Breakpad, tentukan nilai breakpad seperti yang ditunjukkan dalam perintah berikut:

    ./gradlew -Pcom.google.firebase.crashlytics.symbolGenerator=breakpad \
    app:assembleRelease app:uploadCrashlyticsSymbolFileRelease
    

Langkah 6: Lihat laporan error

Lakukan verifikasi bahwa Crashlytics melaporkan error NDK secara tepat dengan mem-build aplikasi, mengupload simbol, dan menimbulkan masalah pada native code secara sengaja. Setelah aplikasi mengalami error, Anda harus memulainya ulang agar Crashlytics dapat mengirim laporan. Anda akan melihat error tersebut di Firebase console setelah beberapa menit.

Pemecahan masalah

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