Se la tua app Android contiene librerie native , puoi abilitare l'analisi completa dello stack e i rapporti dettagliati sugli arresti anomali per il tuo codice nativo da Firebase Crashlytics con alcuni piccoli aggiornamenti alla configurazione della build della tua app.
Questa guida descrive come configurare la segnalazione degli arresti anomali con Firebase Crashlytics SDK per NDK.
Se stai cercando come iniziare con Crashlytics nei tuoi progetti Unity, dai un'occhiata alla Guida introduttiva di Unity .
Prima di iniziare
Se non l'hai già fatto, aggiungi Firebase al tuo progetto Android. Se non disponi di un'app per Android, puoi scaricare un'app di esempio .
Consigliato : per ottenere funzionalità come utenti senza arresti anomali, registri breadcrumb e avvisi sulla velocità, devi abilitare Google Analytics nel tuo progetto Firebase.
Se il tuo progetto Firebase esistente non ha Google Analytics abilitato, puoi abilitare Google Analytics dalla scheda Integrazioni delle tue > Impostazioni progetto nella console Firebase.
Se stai creando un nuovo progetto Firebase, abilita Google Analytics durante il flusso di lavoro di creazione del progetto.
Passaggio 1 : aggiungi Crashlytics SDK per NDK alla tua app
Nel file Gradle del tuo modulo (a livello di app) (di solito<project>/<app-module>/build.gradle
), aggiungi la dipendenza per la libreria Android di Crashlytics NDK. Ti consigliamo di utilizzare la distinta base Android di Firebase per controllare il controllo delle versioni della libreria.Per un'esperienza ottimale con Crashlytics, ti consigliamo di abilitare Google Analytics nel tuo progetto Firebase e di aggiungere l'SDK Firebase per Google Analytics alla tua app.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:32.1.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-ktx' }
Utilizzando Firebase Android BoM , la tua app utilizzerà sempre versioni compatibili delle librerie Firebase Android.
(Alternativa) Aggiungi le dipendenze della libreria Firebase senza utilizzare la distinta base
Se scegli di non utilizzare Firebase BoM, devi specificare ogni versione della libreria Firebase nella relativa riga di dipendenza.
Tieni presente che se utilizzi più librerie Firebase nella tua app, ti consigliamo vivamente di utilizzare la distinta base per gestire le versioni della libreria, che garantisce che tutte le versioni siano compatibili.
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.3.7' 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.1.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 la distinta base
Se scegli di non utilizzare Firebase BoM, devi specificare ogni versione della libreria Firebase nella relativa riga di dipendenza.
Tieni presente che se utilizzi più librerie Firebase nella tua app, ti consigliamo vivamente di utilizzare la distinta base per gestire le versioni della libreria, che garantisce che tutte le versioni siano compatibili.
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.3.7' implementation 'com.google.firebase:firebase-analytics:21.3.0' }
Passaggio 2 : aggiungi il plug-in Crashlytics Gradle alla tua app
Nel tuo file Gradle a livello di root (a livello di progetto) (
<project>/build.gradle
), aggiungi il plug-in Crashlytics Gradle come dipendenza buildscript:buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' } }
Nel file Gradle del tuo modulo (a livello di app) (di solito
<project>/<app-module>/build.gradle
), aggiungi il plug-in Crashlytics Gradle: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 firebaseCrashlytics
alla tua build
Nel file Gradle del modulo (a livello di app) (in genere app/build.gradle
), aggiungi l'estensione firebaseCrashlytics
.
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 } } } }
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 } } } }
Passaggio 4 : imposta il caricamento automatico dei simboli nativi
Per produrre tracce di stack leggibili dagli arresti anomali di NDK, Crashlytics deve conoscere i simboli nei file binari nativi. Il plug-in Crashlytics Gradle include l'attività uploadCrashlyticsSymbolFile BUILD_VARIANT
per automatizzare questo processo.
Per poter accedere all'attività per il 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, è necessario richiamare in modo esplicito l'attività
uploadCrashlyticsSymbolFile BUILD_VARIANT
dopo ogni build della libreria NDK. Per esempio:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
Sia Crashlytics SDK for NDK che Crashlytics Gradle plugin dipendono dalla presenza dell'ID build GNU all'interno degli oggetti condivisi nativi.
Puoi verificare la presenza di questo ID eseguendo
readelf -n
su ogni binario. Se l'ID build è assente, aggiungi-Wl,--build-id
ai flag del tuo sistema di build per risolvere il problema.
Passaggio 5 : forza un arresto anomalo di prova per completare la configurazione
Per completare la configurazione di Crashlytics e visualizzare i dati iniziali nella dashboard di Crashlytics della console Firebase, devi forzare un arresto anomalo di prova.
Aggiungi codice alla tua app che puoi utilizzare per forzare un arresto anomalo del test.
Puoi usare il codice seguente in
MainActivity
della tua app per aggiungere un pulsante alla tua app che, se premuto, provoca un arresto anomalo. Il pulsante è etichettato "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));
Crea ed esegui la tua app.
Forza l'arresto anomalo del test per inviare il primo rapporto sull'arresto anomalo della tua app:
Apri la tua app dal dispositivo o dall'emulatore di test.
Nella tua app, premi il pulsante "Test Crash" che hai aggiunto utilizzando il codice sopra.
Dopo l'arresto anomalo dell'app, riavviala in modo che l'app possa inviare il rapporto sull'arresto anomalo a Firebase.
Vai alla dashboard di Crashlytics della console Firebase per vedere il crash di prova.
Se hai aggiornato la console e ancora non visualizzi l'arresto anomalo del test dopo cinque minuti, abilita la registrazione di debug per vedere se la tua app sta inviando rapporti sull'arresto anomalo.
E questo è tutto! Crashlytics sta ora monitorando la tua app per gli arresti anomali e puoi visualizzare e analizzare i rapporti e le statistiche sugli arresti anomali nella dashboard di Crashlytics.
Prossimi passi
(Consigliato) Ottieni assistenza per il debug degli arresti anomali causati da errori della memoria nativa raccogliendo i rapporti GWP-ASan . Questi errori relativi alla memoria possono essere associati al danneggiamento della memoria all'interno dell'app, che è la causa principale delle vulnerabilità della sicurezza dell'app. Per sfruttare questa funzione, assicurati che la tua app abbia GWP-ASan esplicitamente abilitato e utilizzi l'ultimo Crashlytics SDK per NDK (v18.3.6+ o Firebase BoM v31.3.0+).
Personalizza la configurazione del rapporto sugli arresti anomali aggiungendo rapporti di attivazione, registri, chiavi e tracciamento di errori non irreversibili.
Integra con Google Play in modo da poter filtrare i rapporti sugli arresti anomali della tua app Android in base alla traccia di Google Play direttamente nella dashboard di Crashlytics. Ciò ti consente di focalizzare meglio la tua dashboard su build specifiche.
Risoluzione dei problemi
Se visualizzi tracce dello stack diverse nella console Firebase e nel logcat, fai riferimento alla Guida alla risoluzione dei problemi .
Opzioni alternative per il caricamento dei simboli
Il flusso di lavoro principale in questa pagina sopra è applicabile per build Gradle standard. Tuttavia, alcune app utilizzano una configurazione o strumenti diversi (ad esempio un processo di compilazione 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 creazione NDK personalizzato all'interno di Gradle
- Se le tue librerie native sono integrate in un modulo libreria/funzionalità o fornite da terze parti
- Se l' attività di caricamento automatico dei simboli non riesce o se vengono visualizzati arresti anomali non simbolizzati nella dashboard
L'attività standard di caricamento dei simboli di Crashlytics presuppone che tu stia costruendo le tue librerie native come parte della build Gradle del tuo modulo dell'app, utilizzando strumenti di build NDK standard come CMake.
Tuttavia, se stai utilizzando un processo di compilazione NDK personalizzato all'interno di Gradle o le tue librerie native sono compilate in un modulo di libreria/funzionalità o fornite da una terza parte, potresti dover specificare esplicitamente il percorso delle tue librerie non rimosse. Per fare ciò, puoi aggiungere la proprietà unstrippedNativeLibsDir
all'interno dell'estensione firebaseCrashlytics
nel tuo file build.gradle
.
Assicurati di aver completato le seguenti attività iniziali dal flusso di lavoro principale in precedenza in questa pagina:
Affinché l'attività di caricamento automatico dei simboli possa trovare le informazioni sui simboli, aggiungi quanto segue al file
build.gradle
del modulo (a livello di app):// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
Il plug-in Crashlytics cercherà in modo ricorsivo nella directory specificata le librerie native con estensione
.so
. Crashlytics quindi estrae i simboli di debug da tutte queste librerie e li carica sui server Firebase.Ecco cosa puoi specificare nella proprietà
unstrippedNativeLibsDir
:Qualsiasi argomento consentito per
org.gradle.api.Project#files(Object...)
, inclusi:java.lang.String
,java.io.File
oorg.gradle.api.file.FileCollection
Più directory per un singolo profilo di compilazione fornendo un elenco o un'istanza
FileCollection
Infine, forza un arresto anomalo di prova per completare la configurazione di Crashlytics e visualizzare i dati iniziali nella dashboard di Crashlytics della console Firebase.
Opzione : carica simboli per build non Gradle o librerie native non rimosse inaccessibili
Questa opzione può essere utile nelle seguenti situazioni:
Se usi un processo di compilazione diverso da Gradle
Se le tue librerie native non spogliate ti vengono fornite in qualche modo in modo che non siano accessibili durante le build di Gradle
Questa opzione richiede l'esecuzione di un comando dell'interfaccia della riga di comando di Firebase quando crei una build di rilascio o qualsiasi build per la quale desideri visualizzare tracce dello stack simbolizzate nella console di Firebase.
Assicurati di aver completato le seguenti attività iniziali dal flusso di lavoro principale in precedenza in questa pagina:
Aggiunto l' SDK di Crashlytics per NDK e il plug-in Gradle di Crashlytics .
Tieni presente che con questa opzione non è necessario aggiungere l'estensione
firebaseCrashlytics
o impostare il caricamento automatico dei simboli perché dovrai invece utilizzare l'interfaccia a riga di comando di Firebase (prossimi passaggi di seguito) per generare e caricare i file dei simboli.Imposta il tuo ambiente e progetto per il caricamento dei simboli:
Segui le istruzioni per installare l'interfaccia a riga di comando di Firebase .
Se hai già installato l'interfaccia a riga di comando, assicurati di eseguire l'aggiornamento alla versione più recente .
(solo per le app che utilizzano l'API Android di livello 30+) Aggiorna il modello
AndroidManifest.xml
della tua app per disabilitare la codifica del puntatore:Seleziona la casella per Android Player Settings > Publishing Settings > Build > Custom Main Manifest .
Apri il modello manifest che si trova in
Assets/Plugins/Android/AndroidManifest.xml
.Aggiungere il seguente attributo al tag dell'applicazione:
<application android:allowNativeHeapPointerTagging="false" ... />
Costruisci il tuo progetto.
Carica le informazioni sui tuoi simboli.
Al termine della build, genera un file di simboli compatibile con Crashlytics e caricalo sui server Firebase eseguendo il seguente comando Firebase CLI:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : il tuo ID app Android Firebase (non il nome del pacchetto)
Esempio di ID app Android Firebase:1:567383003300:android:17104a2ced0c9b9b
Ecco due modi per trovare il tuo ID app Firebase:
Nel tuo file
google-services.json
, il tuo ID app è il valoremobilesdk_app_id
; ONella console Firebase, vai alle impostazioni del tuo progetto . Scorri verso il basso fino alla scheda Le tue app , quindi fai clic sull'app Firebase desiderata per trovarne l'ID app.
PATH/TO/SYMBOLS : il percorso del file dei simboli generato dalla CLI
Esportato in un progetto Android Studio: PATH/TO/SYMBOLS può essere qualsiasi directory. L'interfaccia a riga di comando di Firebase cercherà in modo ricorsivo nella directory specificata le librerie native con estensione
.so
.Crea l'APK direttamente da Unity: PATH/TO/SYMBOLS è il percorso del file dei simboli compresso generato nella directory principale del progetto al termine della compilazione (ad esempio:
myproject/myapp-1.0-v100.symbols.zip
).
Visualizza le opzioni avanzate per l'utilizzo del comando Firebase CLI per la generazione e il caricamento dei file di simboli
Bandiera Descrizione --generator=csym
Utilizza il generatore di file di simboli cSYM legacy invece del generatore Breakpad predefinito
Non raccomandato per l'uso. Si consiglia di utilizzare il generatore di file di simboli Breakpad predefinito.
--generator=breakpad
Utilizza il generatore di file di simboli Breakpad
Si noti che l'impostazione predefinita per la generazione dei file di simboli è Breakpad. Usa questo flag solo se hai aggiunto
symbolGenerator { csym() }
nella tua configurazione di build e vuoi sovrascriverlo per usare invece Breakpad.--dry-run
Genera i file dei simboli ma non li carica
Questo flag è utile se si desidera ispezionare il contenuto dei file inviati.
--debug
Fornisce ulteriori informazioni di debug Infine, forza un arresto anomalo di prova per completare la configurazione di Crashlytics e visualizzare i dati iniziali nella dashboard di Crashlytics della console Firebase.
Dopo aver creato la tua app come parte della forzatura di un arresto anomalo, assicurati di eseguire il comando
crashlytics:symbols:upload
CLI di Firebase per caricare il tuo file di simboli.