Android NDK kilitlenme raporlarını alın

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

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

Unity projelerinizde Crashlytics'i kullanmaya nasıl başlayacağınızı öğrenmek istiyorsanız Unity Başlangıç Kılavuzu'na göz atın.

Başlamadan önce

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

  2. Önerilen: Kilitlenme, önemli olmayan hata veya ANR etkinliğine neden olan kullanıcı işlemlerini anlamak amacıyla içerik haritası günlüklerini otomatik olarak almak için Firebase projenizde Google Analytics'i etkinleştirmeniz gerekir.

    • Mevcut Firebase projenizde Google Analytics etkin değilse Firebase konsolundaki > Proje ayarları'nda yer alan Entegrasyonlar sekmesinden Google Analytics'i etkinleştirebilirsiniz.

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

  3. Uygulamanızda aşağıdaki gerekli minimum sürümlerin bulunduğ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'yı uygulamanıza ekleyin

Modül (uygulama düzeyi) Gradle dosyanıza (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle), Android için Crashlytics NDK kitaplığının bağımlılığını ekleyin. Kitaplık sürümü oluşturmayı kontrol etmek için Firebase Android BoM'u kullanmanızı öneririz.

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

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:33.0.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 her zaman uyumlu sürümlerini kullanır.

(Alternatif) Firebase kitaplığı bağımlılıklarını BoM'u kullanmadan ekleyin

Firebase BoM'yi 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 tüm sürümlerin uyumlu olmasını sağlamak için BoM kullanmanızı kesinlikle öneririz.

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.0.0")
    implementation("com.google.firebase:firebase-analytics:22.0.0")
}
Kotlin'e özel 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üne başvurabilir. (Ayrıntılar için Bu girişimle ilgili sık sorulan sorular bölümüne göz atın).

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

  1. Kök düzeyindeki (proje düzeyindeki) Gradle dosyanızda (<project>/build.gradle.kts veya <project>/build.gradle), Crashlytics Gradle eklentisini plugins bloğuna 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.1" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.0" 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.1' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.0' 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: Derlemenize Crashlytics uzantısını ekleyin

Modülünüzde (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 sembollerin otomatik olarak yüklenmesini ayarlayın

NDK kilitlenmelerinden okunabilir yığın izlemeleri üretmek için Crashlytics'in yerel ikili dosyalarınızdaki simgeler hakkında bilgi sahibi olması gerekir. Crashlytics Gradle eklentisi bu süreci otomatikleştirmek için gereken uploadCrashlyticsSymbolFileBUILD_VARIANT görevini içerir.

  1. Otomatik sembol yükleme görevine erişebilmeniz için modül (uygulama düzeyi) Gradle dosyanızda nativeSymbolUploadEnabled öğesinin true olarak ayarlandığından emin olun.

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

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

    Her ikili programda readelf -n komutunu ç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 kilitlenme testini zorlayın

Crashlytics'in kurulumunu tamamlamak ve Firebase konsolunun Crashlytics kontrol panelinde ilk verileri görmek için bir kilitlenme testi uygulamanız gerekir.

  1. Uygulamanıza kilitlenme testi yapmak için kullanabileceğiniz bir kod ekleyin.

    Basıldığında kilitlenmeye neden olan bir düğmeyi uygulamanıza eklemek için uygulamanızın MainActivity öğesinde aşağıdaki kodu kullanabilirsiniz. Düğmenin etiketi "Test Çökmesi"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 zorlayın:

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

    2. Uygulamanızda, yukarıdaki kodu kullanarak eklediğiniz "Kilitlenme Testi" düğmesine basın.

    3. Kilitlenen uygulamanızın, 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 yenilediyseniz ve beş dakika geçmesine rağmen test kilitlenmesini hâlâ görmüyorsanız uygulamanızın kilitlenme raporları 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ı kilitlenmelere karşı izliyor. Ayrıca kilitlenme raporlarını ve istatistiklerini Crashlytics kontrol panelinde görüntüleyip inceleyebilirsiniz.

Sonraki adımlar

  • (Önerilir) GWP-ASan raporlarını toplayarak yerel bellek hatalarının neden olduğu kilitlenmeleri ayıklama konusunda yardım alın. Bellekle ilgili bu hatalar, uygulama güvenlik açıklarının başlıca nedeni olan uygulamanızdaki bellek bozulmasıyla ilişkili olabilir. 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 yeni Crashlytics SDK'yı (v18.3.6+ veya Firebase BoM v31.3.0+) kullandığından emin olun.

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

  • Google Play ile entegre ederek Android uygulamanızın kilitlenme raporlarını doğrudan Crashlytics kontrol panelinde Google Play kanalına göre filtreleyebilirsiniz. Bu sayede kontrol panelinizi belirli derlemelere daha iyi odaklayabilirsiniz.

Sorun giderme

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



Simgeleri yüklemek için alternatif seçenekler

Yukarıdaki sayfadaki ana iş akışı, standart Gradle derlemeleri için geçerlidir. Ancak bazı uygulamalar farklı bir yapılandırma veya araçlar kullanır (örneğin, Gradle dışında bir derleme işlemi). Bu durumlarda, sembolleri başarılı bir şekilde yüklemek için aşağıdaki seçenekler yararlı olabilir.

Seçenek: Kitaplık modülleri ve harici bağımlılıklar için semboller yükleyin

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

  • Gradle içinde özelleştirilmiş bir NDK derleme işlemi kullanıyorsanız
  • Yerel kitaplıklarınız bir kitaplık/özellik modülünde oluşturulduysa veya bir üçüncü tarafça sağlanıyorsa
  • Otomatik simge yükleme görevi başarısız oluyorsa veya kontrol panelinde simgesel olmayan kilitlenmeler görüyorsanız

Seçenek: Gradle olmayan derlemeler veya erişilemeyen sade yerel kitaplıklar için semboller yükleyin

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

  • Gradle dışında bir derleme işlemi kullanıyorsanız

  • Sade yerel kitaplıklarınız size Gradle derlemeleri sırasında erişemeyecekleri bir şekilde sağlanırsa