Otrzymuj raporty o awariach Androida NDK

Jeśli Twoja aplikacja na Androida zawiera biblioteki natywne , możesz włączyć pełne śledzenie stosu i szczegółowe raporty o awariach dla swojego kodu natywnego z Firebase Crashlytics, wprowadzając kilka drobnych zmian w konfiguracji kompilacji aplikacji.

W tym przewodniku opisano, jak skonfigurować raportowanie awarii za pomocą pakietu SDK Firebase Crashlytics dla NDK.

Jeśli szukasz informacji o tym, jak zacząć korzystać z Crashlytics w projektach Unity, zapoznaj się z przewodnikiem Unity Pierwsze kroki .

Zanim zaczniesz

  1. Jeśli jeszcze tego nie zrobiłeś, dodaj Firebase do swojego projektu na Androida. Jeśli nie masz aplikacji na Androida, możesz pobrać przykładową aplikację .

  2. Zalecane : aby korzystać z takich funkcji, jak użytkownicy bez awarii, dzienniki nawigacyjne i alerty dotyczące prędkości, musisz włączyć Google Analytics w swoim projekcie Firebase.

    • Jeśli Twój istniejący projekt Firebase nie ma włączonego Google Analytics, możesz włączyć Google Analytics na karcie Integracje w > Ustawienia projektu w konsoli Firebase.

    • Jeśli tworzysz nowy projekt Firebase, włącz Google Analytics podczas procesu tworzenia projektu.

Krok 1 : Dodaj zestaw Crashlytics SDK dla NDK do swojej aplikacji

W pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts lub <project>/<app-module>/build.gradle ) dodaj zależność dla Crashlytics NDK Biblioteka Androida. Zalecamy używanie Firebase Android BoM do kontrolowania wersji bibliotek.

Aby optymalnie korzystać z Crashlytics, zalecamy włączenie Google Analytics w projekcie Firebase i dodanie pakietu Firebase SDK dla Google Analytics do swojej aplikacji.

Kotlin+KTX

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

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

Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze korzystać ze zgodnych wersji bibliotek Firebase Android.

(Alternatywnie) Dodaj zależności biblioteki Firebase bez korzystania z BoM

Jeśli zdecydujesz się nie używać BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.

Pamiętaj, że jeśli używasz w swojej aplikacji wielu bibliotek Firebase, zdecydowanie zalecamy korzystanie z BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.

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:18.4.3")
    implementation("com.google.firebase:firebase-analytics-ktx:21.3.0")
}

Java

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

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

Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze korzystać ze zgodnych wersji bibliotek Firebase Android.

(Alternatywnie) Dodaj zależności biblioteki Firebase bez korzystania z BoM

Jeśli zdecydujesz się nie używać BoM Firebase, musisz określić każdą wersję biblioteki Firebase w jej wierszu zależności.

Pamiętaj, że jeśli używasz w swojej aplikacji wielu bibliotek Firebase, zdecydowanie zalecamy korzystanie z BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.

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:18.4.3")
    implementation("com.google.firebase:firebase-analytics:21.3.0")
}

Krok 2 : Dodaj wtyczkę Crashlytics Gradle do swojej aplikacji

  1. W pliku Gradle na poziomie głównym (na poziomie projektu) ( <project>/build.gradle.kts lub <project>/build.gradle ) dodaj wtyczkę Crashlytics Gradle do bloku plugins :

    Kotlin

    plugins {
        id("com.android.application") version "7.2.0" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id("com.google.gms.google-services") version "4.3.15" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "2.9.9" apply false
    }
    

    Groovy

    plugins {
        id 'com.android.application' version '7.2.0' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id 'com.google.gms.google-services' version '4.3.15' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '2.9.9' apply false
    }
    
  2. W pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts lub <project>/<app-module>/build.gradle ) dodaj wtyczkę Crashlytics Gradle:

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

Krok 3 : Dodaj rozszerzenie Crashlytics do swojej kompilacji

W pliku Gradle modułu (na poziomie aplikacji) (zwykle <project>/<app-module>/build.gradle.kts lub <project>/<app-module>/build.gradle ) skonfiguruj rozszerzenie Crashlytics.

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

Krok 4 : Skonfiguruj automatyczne przesyłanie symboli natywnych

Aby wygenerować czytelne ślady stosu z awarii NDK, Crashlytics musi wiedzieć o symbolach w twoich natywnych plikach binarnych. Wtyczka Crashlytics Gradle zawiera zadanie uploadCrashlyticsSymbolFile BUILD_VARIANT do automatyzacji tego procesu.

  1. Aby uzyskać dostęp do zadania automatycznego przesyłania symboli, upewnij się, że nativeSymbolUploadEnabled ma wartość true w pliku Gradle modułu (na poziomie aplikacji).

  2. Aby nazwy metod pojawiały się w śladach stosu, musisz jawnie wywołać zadanie uploadCrashlyticsSymbolFile BUILD_VARIANT po każdej kompilacji biblioteki NDK. Na przykład:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. Zarówno Crashlytics SDK dla NDK, jak i wtyczka Crashlytics Gradle zależą od obecności identyfikatora kompilacji GNU w natywnych obiektach współdzielonych.

    Możesz zweryfikować obecność tego identyfikatora, uruchamiając readelf -n na każdym pliku binarnym. Jeśli identyfikator kompilacji jest nieobecny, dodaj -Wl,--build-id do flag systemu kompilacji, aby rozwiązać problem.

Krok 5 : Wymuś awarię testową, aby zakończyć konfigurację

Aby dokończyć konfigurację Crashlytics i zobaczyć wstępne dane w panelu Crashlytics w konsoli Firebase, musisz wymusić awarię testową.

  1. Dodaj do aplikacji kod, którego możesz użyć do wymuszenia awarii testowej.

    Możesz użyć następującego kodu w MainActivity swojej aplikacji, aby dodać do aplikacji przycisk, który po naciśnięciu powoduje awarię. Przycisk jest oznaczony jako „Test Crash”.

    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. Twórz i uruchamiaj swoją aplikację.

  3. Wymuś awarię testową, aby wysłać pierwszy raport o awarii aplikacji:

    1. Otwórz aplikację z urządzenia testowego lub emulatora.

    2. W aplikacji naciśnij przycisk „Testuj awarię” dodany za pomocą powyższego kodu.

    3. Po awarii aplikacji uruchom ją ponownie, aby aplikacja mogła wysłać raport o awarii do Firebase.

  4. Przejdź do pulpitu nawigacyjnego Crashlytics w konsoli Firebase, aby zobaczyć testową awarię.

    Jeśli po odświeżeniu konsoli nadal nie widzisz testowej awarii po pięciu minutach, włącz rejestrowanie debugowania , aby sprawdzić, czy aplikacja wysyła raporty o awariach.


I to wszystko! Crashlytics monitoruje teraz Twoją aplikację pod kątem awarii. Możesz przeglądać i badać raporty o awariach oraz statystyki w panelu Crashlytics.

Następne kroki

  • (Zalecane) Uzyskaj pomoc w debugowaniu awarii spowodowanych błędami pamięci natywnej, zbierając raporty GWP-ASan . Te błędy związane z pamięcią mogą być związane z uszkodzeniem pamięci w Twojej aplikacji, co jest główną przyczyną luk w zabezpieczeniach aplikacji. Aby skorzystać z tej funkcji debugowania, upewnij się, że Twoja aplikacja ma wyraźnie włączoną GWP-ASan i używa najnowszego pakietu Crashlytics SDK dla NDK (wersja 18.3.6+ lub Firebase BoM v31.3.0+).

  • Dostosuj konfigurację raportów o awariach , dodając raporty zgody, dzienniki, klucze i śledzenie błędów niekrytycznych.

  • Zintegruj się z Google Play , aby móc filtrować raporty o awariach aplikacji na Androida według ścieżki Google Play bezpośrednio w panelu Crashlytics. Pozwala to lepiej skoncentrować pulpit nawigacyjny na określonych kompilacjach.

Rozwiązywanie problemów

Jeśli widzisz różne ślady stosu w konsoli Firebase i w logcat, zapoznaj się z przewodnikiem rozwiązywania problemów .



Alternatywne opcje przesyłania symboli

Główny przepływ pracy na tej stronie powyżej ma zastosowanie do standardowych kompilacji Gradle. Jednak niektóre aplikacje używają innej konfiguracji lub narzędzi (na przykład procesu kompilacji innego niż Gradle). W takich sytuacjach poniższe opcje mogą być pomocne w pomyślnym przesłaniu symboli.

Opcja : Prześlij symbole modułów bibliotecznych i zewnętrznych zależności

Ta opcja może być pomocna w następujących sytuacjach:

  • Jeśli używasz dostosowanego procesu kompilacji NDK w Gradle
  • Jeśli Twoje biblioteki natywne są wbudowane w moduł biblioteki/funkcji lub dostarczane przez firmę zewnętrzną
  • Jeśli zadanie automatycznego przesyłania symboli kończy się niepowodzeniem lub na pulpicie nawigacyjnym pojawiają się niesymbolizowane awarie

Opcja : Prześlij symbole dla kompilacji innych niż Gradle lub niedostępnych, nierozebranych bibliotek natywnych

Ta opcja może być pomocna w następujących sytuacjach:

  • Jeśli używasz procesu kompilacji innego niż Gradle

  • Jeśli twoje nierozebrane biblioteki natywne są ci dostarczane w jakiś sposób, nie są dostępne podczas kompilacji Gradle