Catch up on everthing we announced at this year's Firebase Summit. Learn more

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 update 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.

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

Langkah 1: Aktifkan Crashlytics di Firebase console

  1. Buka dasbor Crashlytics di Firebase console.

  2. Pastikan aplikasi Anda dipilih dari dropdown di samping Crashlytics di bagian atas halaman.

  3. Klik Enable Crashlytics.

Langkah 2: 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 app/build.gradle.

Untuk mendapatkan pengalaman yang optimal dengan 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:29.0.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.

Perhatikan 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.4'
    implementation 'com.google.firebase:firebase-analytics:20.0.0'
}

Kotlin+KTX

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:29.0.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.

Perhatikan 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.4'
    implementation 'com.google.firebase:firebase-analytics-ktx:20.0.0'
}

Langkah 3: 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.10'
    
            // Add the Crashlytics Gradle plugin
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.0'
        }
    }
    
    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 4: 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
          }
      }
  }
}

Wajib untuk targetSdkLevel 30 ke atas: Anda harus menonaktifkan Pemberian Tag pada Pointer di aplikasi dengan menambahkan kode berikut ke AndroidManifest.xml:

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

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

Langkah 5: 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 6: 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 Anda tambahkan menggunakan kode di atas.

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

  4. Buka dasbor Crashlytics 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