Se la tua app per Android contiene librerie native, puoi attivare le analisi complete dello stack e i report dettagliati sugli arresti anomali per il tuo codice nativo da Firebase Crashlytics con alcuni piccoli aggiornamenti alla configurazione della compilazione della tua app.
Questa guida descrive come configurare la segnalazione degli arresti anomali con l'SDK Firebase Crashlytics per NDK.
Se stai cercando informazioni su come iniziare a utilizzare Crashlytics nei tuoi progetti Unity, consulta la guida introduttiva di 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 arresto anomalo, a un evento non irreversibile o ANR, devi attivare Google Analytics nel tuo progetto Firebase.
Se nel tuo progetto Firebase esistente Google Analytics non è abilitato, puoi attivarlo dalla scheda Integrazioni del tuo
nella console > Impostazioni progettoFirebase.Google Analytics Se stai creando 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 del modulo (a livello di app) (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 la versione 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:33.9.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") }
Con Firebase Android BoM, la tua app utilizzerà sempre versioni compatibili delle librerie Firebase per Android.
(Alternativa) Aggiungi le dipendenze della libreria Firebase senza utilizzare il file BoM
Se scegli di non utilizzare Firebase BoM, devi specificare ogni versione della libreria Firebase nella riga di dipendenza.
Tieni presente che se nella tua app utilizzi più librerie Firebase, ti consigliamo vivamente di utilizzare BoM per gestire le versioni delle librerie, in modo da garantire 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:19.4.0") implementation("com.google.firebase:firebase-analytics:22.2.0") }
Passaggio 2: aggiungi il plug-in Crashlytics Gradle 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
: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.2" apply false // Add the dependency for the Crashlytics Gradle plugin id("com.google.firebase.crashlytics") version "3.0.3" apply false }
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.2' apply false // Add the dependency for the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' version '3.0.3' apply false }
Nel file Gradle del modulo (a livello di app) (di solito
<project>/<app-module>/build.gradle.kts
o<project>/<app-module>/build.gradle
), aggiungi il plug-in Gradle Crashlytics: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") }
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.
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 } } } }
// ... 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 tracce dello stack leggibili dagli arresti anomali NDK, Crashlytics deve conoscere i simboli nei tuoi file binari nativi. Il Crashlytics plug-in Gradle
include il compito uploadCrashlyticsSymbolFileBUILD_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 tracce dello stack, devi invocare esplicitamente il compito
uploadCrashlyticsSymbolFileBUILD_VARIANT
dopo ogni compilazione della libreria NDK. Ad esempio:>./gradlew app:assemble
BUILD_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 file binario. Se l'ID build è assente, aggiungireadelf -n
ai flag del sistema di compilazione per risolvere il problema.-Wl,--build-id
Passaggio 5: forza un arresto anomalo del test 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 del test.
Aggiungi alla tua app del codice che puoi utilizzare per forzare un arresto anomalo del test.
Puoi utilizzare il seguente codice in
MainActivity
dell'app per aggiungere un pulsante all'app che, se premuto, causa un arresto anomalo. Il pulsante è etichettato come "Test di arresto anomalo".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))
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 di 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 di arresto anomalo" che hai aggiunto utilizzando il codice sopra.
Dopo che l'app si arresta in modo anomalo, riavviala in modo che possa inviare il report sul crash a Firebase.
Vai alla dashboard Crashlytics della console Firebase per visualizzare l'errore di arresto anomalo del test.
Se hai aggiornato la console e dopo cinque minuti non vedi ancora l'arresto anomalo del test, abilita la registrazione di debug per verificare se la tua app sta inviando report sugli arresti anomali.
E questo è tutto. Crashlytics ora monitora la tua app per rilevare gli arresti anomali e puoi visualizzare e analizzare i report e le statistiche sugli arresti anomali nella dashboard di Crashlytics.
Passaggi successivi
(Consigliato) Per ricevere assistenza per il debug degli arresti anomali causati da errori di memoria nativi, raccogli i report GWP-ASan. Questi errori relativi alla memoria possono essere associati a un 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 attivo GWP-ASan e che utilizzi l'SDK Crashlytics più recente per NDK (v18.3.6 o superiore o Firebase BoM v31.3.0 o superiore).
Personalizza la configurazione dei report sugli arresti anomali aggiungendo report, log, chiavi e monitoraggio degli errori non fatali che puoi attivare.
Esegui l'integrazione con Google Play in modo da poter filtrare i report sugli arresti anomali della tua app per Android in base al canale Google Play direttamente nella dashboard di Crashlytics. In questo modo, puoi concentrare meglio la dashboard su build specifiche.
Risoluzione dei problemi
Se nella console Firebase e nel logcat vengono visualizzate tracce dello stack diverse, consulta la guida alla risoluzione dei problemi.
Opzioni alternative per il caricamento dei simboli
Il flusso di lavoro principale in questa pagina è applicabile alle 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 compilazione NDK personalizzato in Gradle
- Se le librerie native sono integrate in un modulo di libreria/funzionalità o fornite da terne parti
- Se l'attività di caricamento automatico dei simboli non va a buon fine o se nella dashboard vengono visualizzati arresti anomali non simbolicati
Visualizza le istruzioni per questa opzione
L'attività di caricamento dei simboli Crashlytics standard presuppone che tu stia compilando le librerie native nell'ambito della compilazione Gradle del modulo dell'app, utilizzando gli strumenti di compilazione NDK standard come CMake.
Tuttavia, se utilizzi un processo di compilazione NDK personalizzato in Gradle o se le tue librerie native sono compilate in un modulo di libreria/funzionalità o fornite da terze parti, potrebbe essere necessario specificare esplicitamente il percorso delle librerie non stripped. Per farlo, puoi aggiungere la proprietà unstrippedNativeLibsDir
all'interno dell'estensione Crashlytics nel file di compilazione Gradle.
Assicurati di aver completato le seguenti attività iniziali del flusso di lavoro principale all'inizio di questa pagina:
Affinché l'attività di caricamento automatico dei simboli possa trovare le informazioni sui simboli, aggiungi quanto segue al file Gradle del modulo (a livello di app) (di solito
<project>/<app-module>/build.gradle.kts
o<project>/<app-module>/build.gradle
):import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension // ... android { // ... buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("
PATH/TO/UNSTRIPPED/DIRECTORY ") } } } }// ... 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 estrae poi 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
ojava.io.File
org.gradle.api.file.FileCollection
Più directory per un singolo tipo di build fornendo un elenco o un'istanza
FileCollection
(A partire dal plug-in Gradle Crashlytics v3.0.0) Accumula più directory in singoli prodotti e build flavor.
Visualizza un esempio con più directory
buildTypes { release { configure<CrashlyticsExtension> { nativeSymbolUploadEnabled = true unstrippedNativeLibsDir = file("
MY/NATIVE/LIBS ") } } productFlavors { flavorDimensions += "feature" create("basic") { dimension = "feature" // ... } create("featureX") { dimension = "feature" configure<CrashlyticsExtension> { unstrippedNativeLibsDir = file("MY/FEATURE_X/LIBS ") } } } }L'attività
uploadCrashlyticsSymbolFilesBasicRelease
caricherà solo i simboli inMY/NATIVE/LIBS
, mentreuploadCrashlyticsSymbolFilesFeatureXRelease
caricherà i simboli sia inMY/NATIVE/LIBS
sia inMY/FEATURE_X/LIBS
.Infine, forza un arresto anomalo di test per completare la configurazione di Crashlytics e visualizzare i dati iniziali nella dashboard di Crashlytics della console Firebase.
Opzione: carica i simboli per le build non Gradle o le librerie native non stripped inaccessibili
Questa opzione può essere utile nelle seguenti situazioni:
Se utilizzi un processo di compilazione diverso da Gradle
Se le librerie native non stripped ti vengono fornite in modo che non siano accessibili durante le build di Gradle
Visualizza le istruzioni per questa opzione
Questa opzione richiede l'esecuzione di un comando Firebase CLI quando crei una build di release o qualsiasi build per la quale vuoi visualizzare le tracce dello stack simboliche nella console Firebase.
Assicurati di aver completato le seguenti attività iniziali del flusso di lavoro principale all'inizio di questa pagina:
È stato aggiunto l'SDK Crashlytics per NDK e il plug-in Gradle Crashlytics.
Tieni presente che con questa opzione non è necessario aggiungere l'estensione
firebaseCrashlytics
o configurare il caricamento automatico dei simboli, in quanto utilizzerai la CLI Firebase (passaggi successivi di seguito) per generare e caricare i file di simboli.Configura l'ambiente e il progetto per il caricamento dei simboli:
Segui le istruzioni per installare Firebase CLI.
Se hai già installato l'interfaccia a riga di comando, assicurati di aggiornarla alla versione più recente.
(solo per le app che utilizzano il livello API Android 30 e versioni successive) Aggiorna il
AndroidManifest.xml
modello della tua app per disattivare il tagging dei cursori:Seleziona la casella Impostazioni del player Android > Impostazioni di pubblicazione > compilation > Manifest principale personalizzato.
Apri il modello manifest in
Assets/Plugins/Android/AndroidManifest.xml
.Aggiungi il seguente attributo al tag dell'applicazione:
<application android:allowNativeHeapPointerTagging="false" ... />
Crea il progetto.
Carica le informazioni sui simboli.
Al termine della compilazione, 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 Firebase per Android (non il nome del pacchetto)
Esempio di ID app Firebase per Android:1:567383003300:android:17104a2ced0c9b9b
Hai bisogno di trovare il tuo ID app Firebase?
Ecco due modi per trovare l'ID app Firebase:
Nel file
google-services.json
, l'ID app è il valoremobilesdk_app_id
.Nella console Firebase, vai alle Impostazioni del progetto. Scorri verso il basso fino alla scheda Le tue app, quindi fai clic sull'app Firebase che ti interessa per trovare il relativo ID app.
PATH/TO/SYMBOLS: il percorso del file di simboli generato dall'interfaccia a riga di comando
Esportato in un progetto Android Studio: PATH/TO/SYMBOLS può essere qualsiasi directory. La CLI Firebase cercherà in modo ricorsivo nella directory specificata le librerie native con un'estensione
.so
.L'APK è stato creato direttamente da Unity: PATH/TO/SYMBOLS è il percorso del file di simboli zipped 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 precedente anziché il generatore Breakpad predefinito
Non consigliato per l'uso. Ti consigliamo di utilizzare il generatore di file di simboli Breakpad predefinito.
--generator=breakpad
Utilizza il generatore di file di simboli Breakpad
Tieni presente che il valore predefinito per la generazione del file di simboli è Breakpad. Utilizza questo flag solo se hai aggiunto
nella configurazione di compilazione e vuoi sostituirlo per utilizzare Breakpad.symbolGenerator { csym() }
--dry-run
Genera i file dei simboli, ma non li carica
Questo flag è utile se vuoi ispezionare i contenuti dei file inviati.
--debug
Fornisce informazioni di debug aggiuntive Infine, forza un arresto anomalo di test per completare la configurazione di Crashlytics e visualizzare i dati iniziali nella dashboard di Crashlytics della console Firebase.
Dopo aver compilato l'app nell'ambito dell'applicazione forzata di un arresto anomalo, assicurati di eseguire il comando Firebase
crashlytics:symbols:upload
della CLI per caricare il file dei simboli.