Android NDK kilitlenme raporlarını al

Android uygulamanız yerel kitaplıklar içeriyorsa uygulamanızın derleme yapılandırmasında birkaç küçük güncelleme yaparak Firebase Crashlytics'den itibaren yerel kodunuz için tam yığın izlemeleri ve ayrıntılı kilitlenme raporlarını etkinleştirebilirsiniz.

Bu kılavuzda, NDK için Firebase Crashlytics SDK'sı ile kilitlenme raporlamanın nasıl yapılandırılacağı açıklanmaktadır.

Unity projelerinizi Crashlytics ile kullanmaya nasıl başlayacağınızı öğrenmek istiyorsanız Unity'yi kullanmaya başlama kılavuzuna göz atın.

Başlamadan önce

  1. Henüz yapmadıysanız Android projenize Firebase'i ekleyin. Android uygulamanız yoksa örnek uygulama indirebilirsiniz.

  2. Önerilir: Kilitlenme, ölümcül olmayan veya ANR etkinliğine yol açan kullanıcı işlemlerini anlamak için ekmek kırıntıları günlüklerini otomatik olarak almak istiyorsanız Firebase projenizde Google Analytics'i etkinleştirmeniz gerekir.

    • Mevcut Firebase projenizde Google Analytics etkin değilse Firebase konsolunda > Proje ayarları bölümündeki Entegrasyonlar sekmesinden Google Analytics'ü etkinleştirebilirsiniz.

    • Yeni bir Firebase projesi oluşturuyorsanız proje oluşturma iş akışı sırasında Google Analytics politikasını etkinleştirin.

  3. Uygulamanızın aşağıdaki minimum sürümlere sahip olduğundan emin olun:

    • Gradle 8.0
    • Android Gradle eklentisi 8.1.0
    • Google hizmetleri Gradle eklentisi 4.4.1

1. Adım: NDK için Crashlytics SDK'sını uygulamanıza ekleyin

Modül (uygulama düzeyinde) Gradle dosyanıza (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle) Android için Crashlytics NDK kitaplığına ait bağımlılık ekleyin. Kitaplık sürümlendirmesini kontrol etmek için Firebase Android BoM simgesini kullanmanızı öneririz.

Crashlytics ile en iyi deneyimi yaşamak için Firebase projenizde Google Analytics'i etkinleştirmenizi ve Google Analytics için Firebase SDK'sını uygulamanıza eklemenizi öneririz.

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

    // Add 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")
}

Firebase Android BoM kullanıldığında uygulamanız Firebase Android kitaplıklarının daima uyumlu sürümlerini kullanır.

(Alternatif) BoM

Firebase BoM kullanmamayı seçerseniz her Firebase kitaplık sürümünü bağımlılık satırında belirtmeniz gerekir.

Uygulamanızda birden fazla Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için BoM'ı kullanmanızı önemle tavsiye ederiz. Bu, tüm sürümlerin uyumlu olmasını sağlar.

dependencies {
    // Add 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:19.2.1")
    implementation("com.google.firebase:firebase-analytics:22.1.2")
}
Kotlin'e özgü bir kitaplık modülü mü arıyorsunuz? Ekim 2023'ten (Firebase BoM 32.5.0) itibaren hem Kotlin hem de Java geliştiricileri ana kitaplık modülünden yararlanabilir (ayrıntılar için bu girişimle ilgili SSS bölümüne bakın).

2. Adım: Crashlytics Gradle eklentisini uygulamanıza ekleyin

  1. Kök düzeyindeki (proje düzeyindeki) Gradle dosyanıza (<project>/build.gradle.kts veya <project>/build.gradle) plugins bloğuna Crashlytics Gradle eklentisini ekleyin:

    Kotlin

    plugins {
        // Make sure that you have the AGP plugin 8.1+ dependency
        id("com.android.application") version "8.1.4" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency
        id("com.google.gms.google-services") version "4.4.2" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.2" apply false
    }
    

    Groovy

    plugins {
        // Make sure that you have the AGP plugin 8.1+ dependency
        id 'com.android.application' version '8.1.4' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency
        id 'com.google.gms.google-services' version '4.4.2' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.2' apply false
    }
    
  2. Modül (uygulama düzeyi) Gradle dosyanıza (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle) Crashlytics Gradle eklentisini ekleyin:

    Kotlin

    plugins {
      id("com.android.application")
      // ...
    
      // Make sure that you have the Google services Gradle plugin
      id("com.google.gms.google-services")
    
      // Add the Crashlytics Gradle plugin
      id("com.google.firebase.crashlytics")
    }

    Groovy

    plugins {
      id 'com.android.application'
      // ...
    
      // Make sure that you have the Google services Gradle plugin
      id 'com.google.gms.google-services'
    
      // Add the Crashlytics Gradle plugin
      id 'com.google.firebase.crashlytics'
    }

3. Adım: Crashlytics uzantısını derlemenize ekleyin

Modül (uygulama düzeyi) Gradle dosyanızda (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle) Crashlytics uzantısını yapılandırın.

Kotlin

import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension

// ...

android {
  // ...
  buildTypes {
      getByName("release") {
          // Add this extension
          configure<CrashlyticsExtension> {
              // 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
          }
      }
  }
}

Groovy

// ...

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
          }
      }
  }
}

4. Adım: Yerel simgelerin otomatik olarak yüklenmesini ayarlayın

NDK kilitlenmelerinden okunabilir yığın izlemeleri oluşturmak için Crashlytics'ün, yerel ikili dosyalarınızdaki semboller hakkında bilgi sahibi olması gerekir. Crashlytics Gradle eklentisi, bu işlemi otomatikleştirmek için uploadCrashlyticsSymbolFileBUILD_VARIANT görevini içerir.

  1. Otomatik simge yükleme görevine erişebilmek için modülünüzün (uygulama düzeyinde) Gradle dosyasında nativeSymbolUploadEnabled değerinin true olarak ayarlandığından emin olun.

  2. Yöntem adlarının yığın izlemelerinizde görünmesi için NDK kitaplığınız her derlendikten sonra uploadCrashlyticsSymbolFileBUILD_VARIANT görevini açıkça çağırmanız gerekir. Örneğin:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. Hem NDK için Crashlytics SDK'sı hem de Crashlytics Gradle eklentisi, yerel paylaşılan nesnelerde GNU derleme kimliğinin bulunmasına bağlıdır.

    Her ikili dosyada readelf -n çalıştırarak bu kimliğin varlığını doğrulayabilirsiniz. Derleme kimliği yoksa sorunu düzeltmek için derleme sisteminizin işaretlerine -Wl,--build-id ekleyin.

5. adım: Kurulumu tamamlamak için test kilitlenmesini zorlama

Crashlytics'ü ayarlamayı tamamlamak ve Firebase konsolunun Crashlytics kontrol panelinde ilk verileri görmek için test kilitlenmesini zorlamanız gerekir.

  1. Uygulamanıza, test amaçlı kilitlenme yapmak için kullanabileceğiniz kod ekleyin.

    Uygulamanıza, basıldığında kilitlenme oluşturan bir düğme eklemek için uygulamanızın MainActivity bölümünde aşağıdaki kodu kullanabilirsiniz. Düğmenin etiketi "Test Kilitlenmesi"dir.

    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))
    

    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));
    
  2. Uygulamanızı derleyip çalıştırın.

  3. Uygulamanızın ilk kilitlenme raporunu göndermek için test kilitlenmesini zorlama:

    1. Uygulamanızı test cihazınızdan veya emülatörden açın.

    2. Uygulamanızda, yukarıdaki kodu kullanarak eklediğiniz "Kilitlenmeyi Test Et" düğmesine basın.

    3. Uygulamanız kilitlendikten sonra, kilitlenme raporunu Firebase'e gönderebilmesi için uygulamanızı yeniden başlatın.

  4. Test kilitlenmenizi görmek için Firebase konsolunun Crashlytics kontrol paneline gidin.

    Konsolu yeniledikten sonra beş dakika geçmesine rağmen testin kilitlendiğini görmüyorsanız uygulamanızın kilitlenme raporu gönderip göndermediğini görmek için hata ayıklama günlük kaydını etkinleştirin.


Hepsi bu kadar. Crashlytics artık uygulamanızı kilitlenmeler açısından izliyor. Kilitlenme raporlarını ve istatistiklerini Crashlytics kontrol panelinde görüntüleyip inceleyebilirsiniz.

Sonraki adımlar

  • (Önerilen) GWP-ASan raporlarını toplayarak yerel bellek hatalarından kaynaklanan kilitlenmelerde hata ayıklama konusunda yardım alın. Bellekle ilgili bu hatalar, uygulamanızdaki bellek bozulmasıyla ilişkilendirilebilir. Bu durum, uygulama güvenlik açıklarının başlıca nedenidir. Bu hata ayıklama özelliğinden yararlanmak için uygulamanızda GWP-ASan'ın açıkça etkinleştirildiğinden ve NDK için en son Crashlytics SDK'sının (v18.3.6 veya sonraki sürümler ya da Firebase BoM v31.3.0 veya sonraki sürümler) kullanıldığından emin olun.

  • Etkinleştirme raporları, günlükler, anahtarlar ve ölümcül olmayan hataların izlenmesini ekleyerek kilitlenme raporu ayarlarınızı özelleştirin.

  • Android uygulamanızın kilitlenme raporlarını doğrudan Crashlytics kontrol panelinde Google Play kanalına göre filtreleyebilmek için Google Play ile entegrasyon yapın. Bu sayede kontrol panelinizi belirli derlemelere daha iyi odaklayabilirsiniz.

Sorun giderme

Firebase konsolunda ve logcat'te farklı yığın izlemeleri görüyorsanız Sorun giderme kılavuzuna bakın.



Simge yüklemeyle ilgili alternatif seçenekler

Yukarıdaki bu sayfada yer alan ana iş akışı, standart Gradle derlemeleri için geçerlidir. Ancak bazı uygulamalar farklı bir yapılandırma veya araç kullanır (ör. Gradle dışında bir derleme işlemi). Bu durumlarda, sembolleri başarıyla yüklemek için aşağıdaki seçeneklerden yararlanabilirsiniz.

Seçenek: Kitaplık modülleri ve harici bağımlılıklara yönelik simgeleri yükleme

Bu seçenek aşağıdaki durumlarda faydalı olabilir:

  • Gradle'de özelleştirilmiş bir NDK derleme süreci kullanıyorsanız
  • Yerel kitaplıklarınız bir kitaplık/özellik modülünde oluşturulduysa veya üçüncü taraflarca sağlandıysa
  • Otomatik simge yükleme görevi başarısız oluyorsa veya kontrol panelinde simgesiz kilitlenmeler görüyorsanız

Seçenek: Gradle dışı derlemeler veya erişilemeyen, sarmalayıcısı kaldırılmamış yerel kitaplıklar için simgeleri yükleme

Bu seçenek aşağıdaki durumlarda faydalı olabilir:

  • Gradle dışında bir derleme süreci kullanıyorsanız

  • Çıplak yerel kitaplıklarınız Gradle derlemeleri sırasında erişilemeyecek şekilde sağlanıyorsa