Inizia a utilizzare Crashlytics per Android NDK

Seleziona la piattaforma: iOS+ Android Android NDK Flutter Unity


Se utilizzi librerie native nella tua app per Android, puoi attivare analisi dello stack complete e Crash Reporting dettagliati per il tuo codice nativo da Firebase Crashlytics con alcuni piccoli aggiornamenti alla configurazione di compilazione dell'app.

Questa guida descrive come configurare i report sugli 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 di Unity.

Prima di iniziare

  1. 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.

  2. Consigliato: per ricevere automaticamente i log dei breadcrumb per comprendere le azioni degli utenti che hanno portato a un evento di arresto anomalo, non irreversibile o ANR, devi attivare Google Analytics nel tuo progetto Firebase.

    • Se generi un nuovo progetto Firebase, abilita Google Analytics durante il flusso di lavoro di creazione del progetto.

    • Se utilizzi un progetto Firebase esistente in cui non è abilitato Google Analytics, puoi attivarlo nella pagina Impostazioni > Integrazioni della console Firebase.

  3. 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 per i 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 la 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:35.0.2"))

    // 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 la 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 la Firebase BoM, devi specificare ogni versione della libreria Firebase nella riga di dipendenza.

Tieni presente che se utilizzi più librerie Firebase nella tua app, ti consigliamo vivamente di utilizzare BoM per gestire le versioni delle librerie, in modo da garantire 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:21.0.0")
    implementation("com.google.firebase:firebase-analytics:24.0.0")
}

Passaggio 2: aggiungi il plug-in Gradle Crashlytics alla tua app

  1. 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 blocco plugins:

    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.5.0" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.8" 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.5.0' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.8' apply false
    }
  2. 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:

    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 analisi dello stack leggibili dagli arresti anomali dell'NDK, Crashlytics deve conoscere i simboli nei tuoi file binari nativi. Il plug-in Gradle Crashlytics include l'attività uploadCrashlyticsSymbolFileBUILD_VARIANT per automatizzare questo processo.

  1. Per poter accedere all'attività per il caricamento automatico dei simboli, assicurati che nativeSymbolUploadEnabled sia impostato su true nel file Gradle del modulo (a livello di app).

  2. 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
  3. 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 readelf -n su ogni programma binario. Se l'ID build non è presente, aggiungi -Wl,--build-id ai flag del sistema di build per risolvere il problema.

Passaggio 5: forza un arresto anomalo di 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.

  1. 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, se 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));
  2. Crea ed esegui la tua app.

  3. Forza l'arresto anomalo di test per inviare il primo report sugli arresti anomali della tua app:

    1. Apri l'app dal dispositivo di test o dall'emulatore.

    2. Nell'app, premi il pulsante "Test Crash" che hai aggiunto utilizzando il codice riportato sopra.

    3. Dopo l'arresto anomalo, riavvia l'app in modo che possa inviare il report sugli arresti anomali a Firebase.

  4. Nella console Firebase, vai alla dashboard DevOps e coinvolgimento > Crashlytics per verificare la presenza del report sugli arresti anomali di test.

    Se hai aggiornato la console e non vedi ancora l'arresto anomalo di test dopo cinque minuti, attiva il logging di debug per verificare se l'app invia report sugli arresti anomali.


E questo è tutto. Crashlytics ora monitora la tua app per rilevare eventuali arresti anomali e puoi visualizzare ed esaminare i report e le statistiche sugli arresti anomali nella dashboard di 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 la tua app abbia GWP-ASan abilitato esplicitamente e utilizzi l'SDK Crashlytics più recente per NDK (v18.3.6+ o Firebase BoM v31.3.0+).

  • Personalizza la configurazione dei report sugli arresti anomali aggiungendo report con attivazione, log, chiavi e monitoraggio degli errori non irreversibili.

  • Esegui l'integrazione con Google Play per 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 vedi analisi dello stack diverse 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 è 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 build NDK personalizzato all'interno di Gradle
  • Se le tue librerie native sono integrate in un modulo della funzionalità/libreria o fornite da una terza parte
  • Se l'attività di caricamento automatico dei simboli non va a buon fine o se visualizzi arresti anomali non simbolizzati nella dashboard di Crashlytics

Opzione: carica i simboli per build non Gradle o librerie native non sottoposte a stripping inaccessibili

Questa opzione può essere utile nelle seguenti situazioni:

  • Se utilizzi un processo di build diverso da Gradle

  • Se le librerie native non sottoposte a stripping ti vengono fornite in un modo che non le rende accessibili durante le build di Gradle