Check out what’s new from Firebase at Google I/O 2022. Learn more

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 kodu natywnego z Firebase Crashlytics, wprowadzając kilka drobnych aktualizacji konfiguracji kompilacji aplikacji.

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

Jeśli szukasz sposobu na rozpoczęcie korzystania z Crashlytics w swoich projektach Unity, zapoznaj się z przewodnikiem wprowadzającym do Unity .

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 funkcji, takich jak użytkownicy bez awarii, dzienniki nawigacyjne i alerty dotyczące szybkości, musisz włączyć Google Analytics w swoim projekcie Firebase.

    • Jeśli w istniejącym projekcie Firebase nie włączono 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 pakiet Firebase Crashlytics SDK dla NDK do swojej aplikacji

Korzystając z Firebase Android BoM , zadeklaruj zależność dla biblioteki Crashlytics NDK Android w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle ).

Aby zapewnić optymalne działanie Crashlytics, zalecamy włączenie Google Analytics w projekcie Firebase i dodanie pakietu SDK Firebase dla Google Analytics do swojej aplikacji.

Java

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

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

Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze używać zgodnych wersji bibliotek Firebase Android.

(Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM

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

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

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.10'
    implementation 'com.google.firebase:firebase-analytics:21.0.0'
}

Kotlin+KTX

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

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

Korzystając z Firebase Android BoM , Twoja aplikacja będzie zawsze używać zgodnych wersji bibliotek Firebase Android.

(Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM

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

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

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.10'
    implementation 'com.google.firebase:firebase-analytics-ktx:21.0.0'
}

Krok 2 : dodaj wtyczkę Firebase Crashlytics do swojej aplikacji

  1. W pliku build.gradle na poziomie projektu dodaj wtyczkę Crashlytics Gradle jako zależność 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.1'
        }
    }
    
    allprojects {
        repositories {
            // Check that you have Google's Maven repository (if not, add it).
            google()
        }
    }
  2. W pliku build.gradle na poziomie aplikacji zastosuj wtyczkę Crashlytics Gradle:

    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'
    

Krok 3 : Dodaj rozszerzenie firebaseCrashlytics do swojej kompilacji

W pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle ) dodaj rozszerzenie 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
          }
      }
  }
}

Krok 4 : Skonfiguruj automatyczne przesyłanie symboli natywnych

Aby wygenerować czytelne ślady stosu z awarii NDK, Crashlytics musi znać symbole w twoich natywnych plikach binarnych. Wtyczka Crashlytics Gradle zawiera zadanie uploadCrashlyticsSymbolFile BUILD_VARIANT aby zautomatyzować ten proces.

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

  2. Aby nazwy metod pojawiały się w śladach stosu, należy 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 for NDK, jak i 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 nie ma identyfikatora kompilacji, dodaj -Wl,--build-id do flag systemu kompilacji, aby rozwiązać problem.

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

Aby zakończyć konfigurowanie Crashlytics i wyświetlić początkowe dane w panelu Crashlytics 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 aplikacji, aby dodać do aplikacji przycisk, który po naciśnięciu powoduje awarię. Przycisk jest oznaczony jako „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. Zbuduj i uruchom swoją aplikację.

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

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

    2. W swojej aplikacji naciśnij przycisk „Przetestuj awarię”, który został 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 panelu Crashlytics w konsoli Firebase, aby zobaczyć awarię testu.

    Jeśli po odświeżeniu konsoli nadal nie widzisz awarii testowej 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 na pulpicie nawigacyjnym Crashlytics.



Alternatywne opcje przesyłania symboli

Główny przepływ pracy na tej stronie powyżej dotyczy 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 przesyłaniu symboli.

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

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

  • Jeśli używasz niestandardowego procesu budowania 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 widzisz niesymbolizowane awarie na desce rozdzielczej

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

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

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

  • Jeśli nieokrojone biblioteki natywne są dostarczane w taki sposób, że nie są dostępne podczas kompilacji Gradle



Rozwiązywanie problemów

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

Następne kroki

  • Dostosuj ustawienia swojego raportu o awariach, dodając raporty, 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. Dzięki temu możesz lepiej skoncentrować swój pulpit nawigacyjny na konkretnych kompilacjach.