Se la tua app per Android contiene librerie native, puoi attivare analisi complete dello stack e report sugli arresti anomali dettagliati per il tuo codice nativo da Firebase Crashlytics con alcuni piccoli aggiornamenti alla configurazione di build dell'app.
Questa guida descrive come configurare la segnalazione degli arresti anomali con l'SDK Firebase Crashlytics per NDK.
Se vuoi scoprire come iniziare a utilizzare Crashlytics nei tuoi progetti Unity, consulta la Guida introduttiva a Unity.
Prima di iniziare
Se non l'hai già fatto, aggiungi Firebase al tuo progetto Android. Se non hai un'app per Android, puoi scaricare un'app di esempio.
Consigliato: per ottenere automaticamente i log dei breadcrumb per comprendere le azioni dell'utente che hanno portato a un evento di arresto anomalo, non irreversibile o ANR, devi attivare Google Analytics nel tuo progetto Firebase.
Se il tuo progetto Firebase esistente non ha Google Analytics abilitato, puoi abilitare Google Analytics dalla scheda Integrazioni di
nella console > Impostazioni progettoFirebase. Se crei un nuovo progetto Firebase, abilita Google Analytics durante il flusso di lavoro di creazione del progetto.
Assicurati che la tua app abbia le seguenti versioni minime richieste:
- Gradle 8.0
- Plug-in Android per Gradle 8.1.0
- Plug-in Gradle dei servizi Google 4.4.1
Passaggio 1: aggiungi l'SDK Crashlytics per NDK alla tua app
Nel file Gradle (a livello di app) del modulo (di solito<project>/<app-module>/build.gradle.kts
o
<project>/<app-module>/build.gradle
),
aggiungi la dipendenza per la libreria NDK Crashlytics per Android. Ti consigliamo di utilizzare
Firebase Android BoM
per controllare il controllo delle versioni della libreria.
Per un'esperienza ottimale con Crashlytics, ti consigliamo di attivare Google Analytics nel tuo progetto Firebase e di aggiungere l'SDK Firebase per Google Analytics alla tua app.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.3.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") }
Utilizzando Firebase Android BoM, la tua app utilizzerà sempre versioni compatibili delle librerie Firebase Android.
(Alternativa) Aggiungi le dipendenze della libreria Firebase senza utilizzare BoM
Se scegli di non utilizzare Firebase BoM, devi specificare la versione di ogni libreria Firebase nella relativa riga di dipendenza.
Tieni presente che se utilizzi più librerie Firebase nella tua app, ti consigliamo vivamente di utilizzare la BoM per gestire le versioni delle librerie, il che garantisce la compatibilità di tutte le versioni.
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:20.0.2") implementation("com.google.firebase:firebase-analytics:23.0.0") }
Passaggio 2: aggiungi il plug-in Gradle Crashlytics alla tua app
Nel file Gradle a livello di directory principale (a livello di progetto) (
<project>/build.gradle.kts
o<project>/build.gradle
), aggiungi il plug-in Gradle Crashlytics al bloccoplugins
: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.3" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.6" 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.3' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.6' apply false }
Nel file Gradle del modulo (a livello di app) (solitamente
<project>/<app-module>/build.gradle.kts
o<project>/<app-module>/build.gradle
), aggiungi il plug-in Gradle Crashlytics: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' }
Passaggio 3: aggiungi l'estensione Crashlytics alla build
Nel file Gradle del modulo (a livello di app)
(di solito <project>/<app-module>/build.gradle.kts
o
<project>/<app-module>/build.gradle
), configura l'estensione 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 } } } }
Passaggio 4: configura il caricamento automatico dei simboli nativi
Per produrre stack trace leggibili dagli arresti anomali dell'NDK, Crashlytics deve conoscere
i simboli nei tuoi binari nativi. Il plug-in Gradle Crashlytics
include l'attività uploadCrashlyticsSymbolFileBUILD_VARIANT
per automatizzare questo processo.
Per accedere all'attività di caricamento automatico dei simboli, assicurati che
nativeSymbolUploadEnabled
sia impostato sutrue
nel file Gradle del modulo (a livello di app).Affinché i nomi dei metodi vengano visualizzati nelle analisi dello stack, devi richiamare esplicitamente l'attività
uploadCrashlyticsSymbolFileBUILD_VARIANT
dopo ogni build della libreria NDK. Ad esempio:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Sia l'SDK Crashlytics per NDK sia il plug-in Gradle Crashlytics dipendono dalla presenza dell'ID build GNU all'interno degli oggetti condivisi nativi.
Puoi verificare la presenza di questo ID eseguendo
su ogni binario. Se l'ID build non è presente, aggiungireadelf -n
ai flag del sistema di build per risolvere il problema.-Wl,--build-id
Passaggio 5: forza l'arresto anomalo di un test per completare la configurazione
Per completare la configurazione di Crashlytics e visualizzare i dati iniziali nella dashboard Crashlytics della console Firebase, devi forzare un arresto anomalo di test.
Aggiungi alla tua app un codice che puoi utilizzare per forzare un arresto anomalo di test.
Puoi utilizzare il seguente codice nel file
MainActivity
della tua app per aggiungere un pulsante che, quando viene premuto, causa un arresto anomalo. Il pulsante è etichettato "Test Crash".Kotlin
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));
Crea ed esegui la tua app.
Forza l'arresto anomalo del test per inviare il primo report sugli arresti anomali della tua app:
Apri l'app dal dispositivo di test o dall'emulatore.
Nell'app, premi il pulsante "Test Crash" che hai aggiunto utilizzando il codice sopra.
Dopo l'arresto anomalo dell'app, riavviala in modo che possa inviare il report sull'arresto anomalo a Firebase.
Vai alla dashboard Crashlytics della console Firebase per visualizzare l'arresto anomalo del test.
Se hai aggiornato la console e non vedi ancora l'arresto anomalo del test dopo cinque minuti, attiva la registrazione di debug per verificare se la tua app invia report sugli arresti anomali.
E questo è tutto. Crashlytics ora monitora la tua app per rilevare arresti anomali e puoi visualizzare e analizzare i report e le statistiche sugli arresti anomali nella dashboard Crashlytics.
Passaggi successivi
(Consigliato) Ricevi assistenza per il debug degli arresti anomali causati da errori di memoria nativi raccogliendo i report GWP-ASan. Questi errori relativi alla memoria possono essere associati al danneggiamento della memoria all'interno della tua app, che è la causa principale delle vulnerabilità di sicurezza delle app. Per usufruire di questa funzionalità di debug, assicurati che nella tua app sia GWP-ASan esplicitamente abilitato e che utilizzi l'ultima versione dell'SDK Crashlytics per NDK (v18.3.6+ o Firebase BoM v31.3.0+).
Personalizza la configurazione dei report sugli arresti anomali aggiungendo report di attivazione, log, chiavi e monitoraggio degli errori non fatali.
Esegui l'integrazione con Google Play per poter filtrare i report sugli arresti anomali della tua app per Android in base alla traccia Google Play direttamente nella dashboard Crashlytics. In questo modo puoi concentrare meglio la dashboard su build specifiche.
Risoluzione dei problemi
Se visualizzi stack trace diversi nella console Firebase e in logcat, consulta la guida alla risoluzione dei problemi.
Opzioni alternative per il caricamento dei simboli
Il flusso di lavoro principale in questa pagina sopra è applicabile alle build Gradle standard. Tuttavia, alcune app utilizzano una configurazione o strumenti diversi (ad esempio un processo di build diverso da Gradle). In queste situazioni, le seguenti opzioni potrebbero essere utili per caricare correttamente i simboli.
Opzione: carica i simboli per i moduli della libreria e le dipendenze esterne
Questa opzione può essere utile nelle seguenti situazioni:
- Se utilizzi un processo di compilazione NDK personalizzato in Gradle
- Se le tue librerie native sono integrate in un modulo di libreria/funzionalità o fornite da una terza parte
- Se l'attività di caricamento automatico dei simboli non va a buon fine o se nella dashboard vengono visualizzati arresti anomali senza simboli
Opzione: carica i simboli per le build non Gradle o le librerie native non rimosse inaccessibili
Questa opzione può essere utile nelle seguenti situazioni:
Se utilizzi un processo di build diverso da Gradle
Se le tue librerie native non rimosse ti vengono fornite in modo tale da non essere accessibili durante le build Gradle