Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now

Esegui l'upgrade all'SDK Firebase Crashlytics

Ora puoi configurare Crashlytics nella tua app utilizzando il nuovo Firebase Crashlytics SDK ufficiale, che offre API migliorate più coerenti con altri prodotti Firebase e più intuitive da usare. Questa guida descrive come eseguire l'upgrade al nuovo SDK dal legacy Fabric SDK. Descrive le modifiche apportate con le nuove API, il motivo delle modifiche e come aggiornare il codice, se necessario.

Prima di iniziare

L'SDK Firebase Crashlytics utilizza AndroidX come dipendenza, quindi se la tua app utilizza versioni precedenti della libreria di supporto app, esegui prima la migrazione dell'app su AndroidX .

Passaggio 1: aggiungi un file di configurazione Firebase

Aggiungi il file di configurazione Android di Firebase alla tua app:

  1. Apri le Impostazioni del progetto. Nella scheda Le tue app , seleziona il nome del pacchetto dell'app per cui hai bisogno di un file di configurazione.
  2. Fai clic su Scarica google-services.json per ottenere il tuo file di configurazione Android di Firebase.
    • Puoi scaricare nuovamente il file di configurazione di Firebase Android in qualsiasi momento.
    • Assicurati che il file di configurazione non sia aggiunto con caratteri aggiuntivi, come (2) .
  3. Sposta il tuo file di configurazione nella directory del modulo (a livello di app) della tua app.

Passaggio 2: aggiungi l'SDK Firebase Crashlytics

  1. Nel build.gradle a livello di root (a livello di progetto) della tua build.gradle :
    • Sostituisci il repository Maven di Fabric con il repository Maven di Google.
    • Sostituisci il plug-in Fabric Gradle con il plug-in Firebase Crashlytics Gradle. Se utilizzi Android Studio 4.1 Canary, assicurati di aggiungere il plug-in Crashlytics Gradle versione 2.0.0 o successiva.
    buildscript {
      // ...
    
      repositories {
        // ...
    
        // Remove Fabric's Maven repository.
        maven { url 'https://maven.fabric.io/public' }
    
        // Add Google's Maven repository (if it's not there already).
        google()
      }
    
      dependencies {
        // ..
    
        // Add the Google Services Gradle plugin (if it's not there already).
        classpath 'com.google.gms:google-services:4.3.8'
    
        // Remove the Fabric Gradle plugin.
        classpath 'io.fabric.tools:gradle:1.31.2'
    
        // Add the Crashlytics Gradle plugin (use v2.0.0+ if you built
        // your app with Android Studio 4.1).
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.6.1'
      }
    }
  2. In build.gradle livello di build.gradle , sostituisci il plug-in Fabric con il plug-in Firebase Crashlytics:
    apply plugin: 'com.android.application'
    
    // Apply the Google Services plugin (if it's not there already).
    apply plugin: 'com.google.gms.google-services'
    
    // Remove the Fabric plugin.
    apply plugin: 'io.fabric'
    
    // Add the Firebase Crashlytics plugin.
    apply plugin: 'com.google.firebase.crashlytics'
  3. Infine, aggiungi l'SDK Firebase Crashlytics. In build.gradle livello di build.gradle , sostituisci il precedente SDK di Fabric Crashlytics con il nuovo Firebase Crashlytics SDK. Assicurati di aggiungere la versione 17.0.0 o successiva (a partire dal 15 novembre 2020, questa operazione è necessaria per visualizzare i rapporti sugli arresti anomali nella console Firebase).
    dependencies {
      // Remove the Fabric Crashlytics SDK.
      implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'
    
      // Add the Firebase Crashlytics SDK.
      implementation 'com.google.firebase:firebase-crashlytics:18.0.0'
    
      // Recommended: Add the Google Analytics SDK.
      implementation 'com.google.firebase:firebase-analytics:19.0.0'
    }

Passaggio facoltativo: impostare la segnalazione di crash di NDK

Firebase Crashlytics offre rapporti sugli arresti anomali per le app create utilizzando Android Native Development Kit (NDK). Tieni presente che Crashlytics NDK v17.3.0 + richiede il plug-in Crashlytics Gradle v2.4.0 +.

Per rilevare e segnalare arresti anomali nativi:

  1. In build.gradle livello di build.gradle , sostituisci la dipendenza Fabric NDK con la dipendenza Firebase Crashlytics NDK. Quindi, aggiungi l'estensione firebaseCrashlytics e assicurati di abilitare il flag nativeSymbolUploadEnabled . Ciò consente alla tua app di elaborare e caricare simboli nativi su Crashlytics in modo da poter visualizzare le tracce dello stack adeguatamente simbolizzate nella dashboard di Crashlytics .
    dependencies {
      // Remove the Fabric NDK dependency.
      implementation 'com.crashlytics.sdk.android:crashlytics-ndk:2.1.1'
    
      // Add the Firebase Crashlytics NDK dependency.
      implementation 'com.google.firebase:firebase-crashlytics-ndk:18.0.0'
    }
    // ...
    
    android {
        // ...
    
        buildTypes {
            release {
                /* Add the firebaseCrashlytics extension (by default,
                * it's disabled to improve build speeds) and set
                * nativeSymbolUploadEnabled to true. */
    
                firebaseCrashlytics {
                    nativeSymbolUploadEnabled true
                }
            }
        }
    }
    
    // Remove this extension (it previously enabled Crashlytics NDK reporting in Fabric).
    crashlytics {
      enableNdk true
    }
      
  2. Esegui le seguenti attività Gradle specifiche per NDK:
    > ./gradlew app:assembleBUILD_VARIANT
    > ./gradlew app:uploadCrashlyticsSymbolFileBUILD_VARIANT
      
  3. Per ulteriori informazioni sull'utilizzo di Crashlytics per la segnalazione degli arresti anomali di NDK, consultare la documentazione di Crashlytics NDK .

Passaggio 3: aggiorna il codice

Esamina le seguenti modifiche all'SDK e apporta gli aggiornamenti appropriati al tuo codice:


Crashlytics ora ruota gli ID in base agli ID di installazione di Firebase.

Crashlytics utilizza l'UUID di installazione di Crashlytics per identificare le istanze della tua app e per associare i dati degli utenti ai loro dispositivi. In precedenza, Crashlytics ruotava l'UUID di installazione dell'utente quando cambiava l'ID pubblicitario del suo dispositivo. Ora, Crashlytics ruota l'UUID di installazione in base all'ID di installazione Firebase (FID) dell'utente. Per ulteriori informazioni, visita Gestire gli ID di installazione di Firebase .

ragione per cambiare

L'utilizzo dei FID è coerente con altri SDK Firebase.


Il nuovo pacchetto e nome classe per Crashlytics è com.google.firebase.crashlytics.FirebaseCrashlytics.

Ora puoi richiamare le funzionalità di Crashlytics utilizzando i metodi di istanza nel singleton FirebaseCrashlytics anziché le funzioni statiche nella classe FirebaseCrashlytics. Il singleton FirebaseCrashlytics è accessibile a livello globale tramite la funzione statica getInstance() .

Fabric SDK

Giava

import com.crashlytics.android.Crashlytics;

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Kotlin + KTX

import com.crashlytics.android.Crashlytics

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Firebase Crashlytics SDK

Giava

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

// Operations on FirebaseCrashlytics.
FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
crashlytics.someAction();

Kotlin + KTX

import com.google.firebase.crashlytics.FirebaseCrashlytics

// ...

// Operations on FirebaseCrashlytics.
val crashlytics = FirebaseCrashlytics.getInstance()
crashlytics.someAction()

ragione per cambiare

Il nuovo pacchetto radice e il punto di ingresso del nuovo SDK sono ora coerenti con altri SDK Firebase. Inoltre, i metodi di istanza sono più facili da simulare rispetto alle funzioni statiche e creano meno problemi di testabilità.


FirebaseCrashlytics non funziona più con Fabric SDK.

Ora Crashlytics si avvia automaticamente utilizzando un ContentProvider definito nel nuovo Firebase Crashlytics SDK, che non utilizza più la chiave API Fabric. Crashlytics ora utilizza il file google-services.json tua app per associare l'app al tuo progetto Firebase e conservare i tuoi dati storici sugli arresti anomali.

Se hai la chiave API Fabric ( io.fabric.ApiKey ) dichiarata nel tuo file AndroidManifest.xml , rimuovila:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.your_app_package">

   <application>
      <activity android:name=".MainActivity"/>

      <!-- Remove this line if it exists -->
      <meta-data android:name="io.fabric.ApiKey"
          android:value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" />

   </application>
</manifest>

Per impostazione predefinita, Crashlytics raccoglie e segnala automaticamente gli arresti anomali per tutte le istanze della tua app, ma puoi scegliere di abilitarlo solo per gli utenti che accedono. Per disattivare la segnalazione automatica degli arresti anomali, nel blocco <application> del tuo file AndroidManifest.xml , imposta firebase_crashlytics_collection_enabled su false :

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="false" />

ragione per cambiare

Per essere coerente con altri SDK Firebase, Crashlytics ora si avvia automaticamente tramite un ContentProvider. Come con altri SDK, ora fornisce un flag manifest per disabilitare la raccolta automatica dei dati, che puoi sovrascrivere in qualsiasi momento utilizzando setCrashlyticsCollectionEnabled . Il metodo ti offre un maggiore controllo sul comportamento di segnalazione degli arresti anomali della tua app.


Crashlytics.log è ora un metodo di istanza.

Il nuovo SDK non include più un metodo Crashlytics.log statico. Per aggiungere messaggi di log personalizzati, utilizza invece il nuovo metodo di istanza crashlytics.log . Notare che il nuovo metodo non fa più eco a logcat (si consiglia di scrivere un wrapper se si desidera mantenere questo comportamento). Per ulteriori informazioni, visita aggiungere messaggi di registro personalizzati .

Fabric SDK

Giava

Crashlytics.log("my message");

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message");

Kotlin + KTX

Crashlytics.log("my message")

Crashlytics.log(
 Log.ERROR,
 "TAG",
 "my message")

Firebase Crashlytics SDK

Giava

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.log("my message");

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message");

Kotlin + KTX

val crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.log("my message")

// To log a message to a crash report, use the following syntax:
crashlytics.log("E/TAG: my message")

ragione per cambiare

Su tua richiesta, abbiamo smesso di trasmettere i log di Crashlytics a logcat. L'uso dei metodi di istanza semplifica anche il test del codice.


setBool, setDouble, setFloat e setInt, setLong e setString vengono aggregati in setCustomKey.

Abbiamo aggregato i key setter personalizzati nel metodo setCustomKey . In precedenza, potevi utilizzare i setter di chiavi personalizzati per impostare coppie chiave / valore da inviare insieme al rapporto sugli arresti anomali. Ora puoi usare setCustomKey(String, value) , che viene sovraccaricato per accettare i tipi primitivi e String. Per ulteriori informazioni, visita Aggiungere chiavi personalizzate.

Fabric SDK

Giava

Crashlytics.setBool("bool_key",true);

Crashlytics.setDouble("double_key",42.0);

Crashlytics.setFloat("float_key",42.0F);

Crashlytics.setInt("int_key",42);

Crashlytics.setLong("long_key",42L);

Crashlytics.setString("str_key","str_value");

Kotlin + KTX

Crashlytics.setBool("bool_key",true)

Crashlytics.setDouble("double_key",42.0)

Crashlytics.setFloat("float_key",42.0F)

Crashlytics.setInt("int_key",42)

Crashlytics.setLong("long_key",42L)

Crashlytics.setString("str_key","str_value")

Firebase Crashlytics SDK

Giava

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();

crashlytics.setCustomKey("bool_key",true);

crashlytics.setCustomKey("double_key",42.0);

crashlytics.setCustomKey("float_key",42.0F);

crashlytics.setCustomKey("int_key",42);

crashlytics.setCustomKey("long_key",42L);

crashlytics.setCustomKey("str_key","42");

Kotlin + KTX

FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance()

crashlytics.setCustomKey("bool_key",true)

crashlytics.setCustomKey("double_key",42.0)

crashlytics.setCustomKey("float_key",42.0F)

crashlytics.setCustomKey("int_key",42)

crashlytics.setCustomKey("long_key",42L)

crashlytics.setCustomKey("str_key","42")

ragione per cambiare

Il nome del nuovo metodo è univoco per Crashlytics e chiarisce che Crashlytics non è conforme al valore-chiave.


setUserIdentifier è ora setUserId. setUserName e setUserEmail vengono rimossi.

In precedenza, era possibile impostare un nome o un'e-mail associata a un arresto anomalo utilizzando setUserName e setUserEmail , ma questi metodi non sono più definiti. Il nuovo metodo preferito per impostare gli ID per gli utenti consiste nell'usare setUserId . Per ulteriori informazioni, visita Imposta identificatori utente.

Fabric SDK

Giava

Crashlytics.setUserIdentifier("myAppUserId");

Crashlytics.setUserEmail("abc@example.com");

Crashlytics.setUserName("John Doe");

Kotlin + KTX

Crashlytics.setUserIdentifier("myAppUserId")

Crashlytics.setUserEmail("abc@example.com")

Crashlytics.setUserName("John Doe")

Firebase Crashlytics SDK

Giava

crashlytics.setUserId("myAppUserId");

Kotlin + KTX

crashlytics.setUserId("myAppUserId")

ragione per cambiare

Abbiamo adottato il nome del metodo setUserId per essere coerente con altre API Firebase e abbiamo rimosso setUserName e setUserEmail per scoraggiare la registrazione di informazioni personali tramite Crashlytics.


Crashlytics.logException (Throwable) è stato sostituito da FirebaseCrashlytics.recordException (Throwable).

Crashlytics ora supporta anche la registrazione degli errori incorporati e dei tipi di eccezione sia per Android che per iOS.

Fabric SDK

Giava

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
Crashlytics.logException(e);
}

Kotlin + KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
Crashlytics.logException(e)
}

Firebase Crashlytics SDK

Giava

try {
/* Code that can throw checked
exceptions. */

// ...

} catch (Exception e) {
FirebaseCrashlytics.getInstance().recordException(e);
}

Kotlin + KTX

try {
/* Code that can throw checked
exceptions. */

// ...

catch (e: Exception) {
FirebaseCrashlytics.getInstance().recordException(e)
}

ragione per cambiare

Il nuovo metodo recordException(Throwable) è più facilmente distinguibile da log(String) , che si comporta in modo diverso. Inoltre, abbiamo rinominato la nuova API per essere più coerente su tutte le piattaforme.


CrashlyticsListener è sostituito da didCrashOnPreviousExecution ().

CrashlyticsListener in precedenza consentiva a Crashlytics di indicare quando una precedente sessione dell'app termina con un arresto anomalo, il che è utile per le app che visualizzano messaggi post-arresto anomalo al riavvio. Ora, il suo callback è sostituito dalla chiamata API sincrona didCrashOnPreviousExecution() .

Fabric SDK

Giava

CrashlyticsListener crashlyticsListener =
new CrashlyticsListener() {
  @Override
  public void crashlyticsDidDetectCrashDuringPreviousExecution() {
    // ...App code to execute if a crash occurred during previous execution.
  }
};

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
                                      .listener(crashlyticsListener)
                                      .build();

Crashlytics crashlytics = new Crashlytics.Builder().core(crashlyticsCore).build();

Fabric.with(getContext(), crashlytics);

Kotlin + KTX

val crashlyticsListener = CrashlyticsListener {
  // ...App code to execute if a crash occurred during previous execution.
}
val crashlyticsCore = CrashlyticsCore.Builder()
  .listener(crashlyticsListener)
  .build()
val crashlytics = Crashlytics.Builder().core(crashlyticsCore).build()
Fabric.with(getContext(), crashlytics)

Firebase Crashlytics SDK

Giava

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

Kotlin + KTX

if (FirebaseCrashlytics.getInstance().didCrashOnPreviousExecution()) {
// ...App code to execute if a crash occurred during previous execution.
}

ragione per cambiare

La nuova API è meno dettagliata e meno impegnativa da utilizzare rispetto a CrashlyticsListener perché non richiede né testo boilerplate né callback. In precedenza, il callback asincrono non garantiva quando sarebbe stato richiamato il callback.


Il metodo di arresto anomalo viene rimosso.

Il nuovo SDK non include più il metodo di arresto anomalo, che potresti utilizzare in precedenza per convalidare la configurazione di Crashlytics forzando un arresto anomalo nella tua app. Genera RuntimeException per forzare un arresto anomalo.

Fabric SDK

Giava

Crashlytics.getInstance().crash();

Kotlin + KTX

Crashlytics.getInstance().crash()

Firebase Crashlytics SDK

Giava

throw new RuntimeException("Test Crash");

Kotlin + KTX

throw RuntimeException("Test Crash")

ragione per cambiare

I nuovi metodi specificano chiaramente se gli arresti anomali risultanti dell'app si sono verificati durante il runtime o nell'SDK nativo dell'app.


Il plugin Crashlytics Gradle contiene nuovi flag.

Il plug-in Gradle continua a configurare ed eseguire automaticamente le attività Gradle specifiche di Crashlytics. Se la tua build richiede il richiamo di attività dal plug-in Crashlytics Gradle, fai riferimento alle attività Firebase Crashlytics disponibili eseguendo ./gradlew app:tasks . Se la tua app utilizza un NDK, devi richiamare esplicitamente l'attività uploadCrashlyticsSymbolFile[ BUILD_VARIANT ] Gradle per continuare a caricare i simboli nativi su Crashlytics.

I flag di compilazione specifici di ext.alwaysUpdateBuildId ed ext.enableCrashlytics non sono più supportati. Rimuovili dalla tua configurazione Gradle se esistono. Se la tua applicazione utilizza un obfuscator bytecode (ad esempio, R8 o Proguard) e non si vuole caricare file di mapping del build Crashlytics, utilizzare il nuovo mappingFileUploadEnabled bandiera nella firebaseCrashlytics estensione Gradle. Se impostato su false, Crashlytics non può deoffuscare le tracce dello stack della tua app. Per le configurazioni di offuscamento non standard, utilizzare il parametro mappingFile per impostare una nuova posizione per il file di mapping. Questi flag possono essere usati per defaultConfig, così come per qualsiasi tipo di build o gusto.

Firebase Crashlytics SDK

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.gms.google-services'

android {
    // ...

    buildTypes {
        debug {
            minifyEnabled true
            firebaseCrashlytics {
                // If you don't need crash reporting for your debug build,
                // you can speed up your build by disabling mapping file uploading.
                mappingFileUploadEnabled false
            }
        }

        release {
            minifyEnabled true
            // When minifyEnabled is set to true, Crashlytics automatically
            // uploads mapping files because the plugin detects that obfuscation
            // is enabled. mappingFileUploadEnabled defaults to true if
            // minifyEnabled is true.
        }
    }
}

ragione per cambiare

Abbiamo aggiornato le attività e le opzioni di configurazione di Gradle per essere più coerenti con le convenzioni di Gradle.


Crashlytics può utilizzare solo i dati raccolti da Google Analytics.

Non puoi più raccogliere dati con Fabric Answers dopo l'aggiornamento a Firebase Crashlytics SDK. Per ottenere metriche per utenti senza arresti anomali e breadcrumb, passa invece a utilizzare Google Analytics. Tieni presente che i tuoi dati storici di Answers non possono migrare a Firebase.

Visita Inizia a utilizzare Google Analytics per scoprire come aggiungere Google Analytics alla tua app.

ragione per cambiare

Ora offriamo Google Analytics per aiutarti a ottenere una visione più approfondita dei dati sugli arresti anomali. Con Analytics, puoi continuare a raccogliere statistiche per la tua app nella console Firebase.


Next steps