Catch up on everything we announced at this year's Firebase Summit. Learn more

Обновление до Firebase Crashlytics SDK

Теперь вы можете настроить Crashlytics в своем приложении с помощью нового официального Firebase Crashlytics SDK, который предлагает улучшенные API, которые более совместимы с другими продуктами Firebase и более интуитивно понятны в использовании.

В этом руководстве описывается, как перейти на новый SDK из устаревшего SDK Fabric. В нем описаны изменения, которые происходят с новыми API-интерфейсами, причины изменений и способы обновления кода, если это необходимо.

Прежде чем вы начнете

Firebase Crashlytics SDK использует AndroidX как зависимость, так что, если ваше приложение использует старые версии библиотеки поддержки App, первым перенести приложение на AndroidX .

Шаг 1: Добавление файла конфигурации Firebase

  1. Откройте Настройки проекта . В ваших приложениях карты, выберите имя пакета приложения , для которого требуется конфигурационный файл.

  2. Нажмите Загрузить Google-services.json , чтобы получить файл конфигурации Firebase Android ( google-services.json ).

    • Вы можете загрузить файл конфигурации Firebase Android снова в любое время.

    • Убедитесь , что конфигурация файл не добавляются с дополнительными символами, например , (2) .

  3. Переместите файл конфигурации в каталог модуля (уровня приложения) вашего приложения.

Шаг 2: Добавьте Firebase Crashlytics SDK

  1. В корневой уровень ( на уровне проекта) вашего приложения build.gradle :

    • Замените репозиторий Maven от Fabric репозиторием Google Maven.

    • Замените плагин Fabric Gradle плагином Firebase Crashlytics Gradle. Если вы используете Android Studio 4.1 канарейку, обязательно добавьте Crashlytics Gradle плагин версии 2.0.0 или более поздней версии.

    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.10'
    
        // 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.8.1'
      }
    }
    
  2. В вашем приложении уровня build.gradle , замените модуль Ткани с плагин 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. Наконец, добавьте SDK Firebase Crashlytics. В вашем приложении уровня build.gradle , заменить наследие ткань Crashlytics SDK с новым Firebase Crashlytics SDK. Убедитесь, что вы добавили версию 17.0.0 или более позднюю (начиная с 15 ноября 2020 г. это необходимо для отображения отчетов о сбоях в консоли 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.2.5'
    
      // Recommended: Add the Google Analytics SDK
      implementation 'com.google.firebase:firebase-analytics:20.0.0'
    }
    

(Необязательно) Установите до аварии отчетности NDK

Firebase Crashlytics предлагает отчеты о сбоях для приложений, созданных с помощью Android Native Development Kit (NDK).

Чтобы обнаружить собственные сбои и сообщить о них:

  1. В вашем приложении уровень build.gradle файла, заменить зависимость ткани NDK с зависимостью Firebase Crashlytics НКА. Затем добавьте firebaseCrashlytics расширения и убедитесь , что для того, чтобы nativeSymbolUploadEnabled флага. Это позволяет вашему приложению обрабатывать и загружать собственные символы в Crashlytics , так что вы можете просматривать правильно-symbolicated трассировки стеки в приборной панели 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.2.5'
    }
    // ...
    
    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. Выполните следующие задачи Gradle, относящиеся к NDK:

    > ./gradlew app:assembleBUILD_VARIANT
    > ./gradlew app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    

Для получения дополнительной информации об использовании Crashlytics для краш отчетности NDK см документации Crashlytics NDK .

Шаг 3: Обновите код

Просмотрите следующие изменения SDK и внесите соответствующие обновления в свой код:


Crashlytics теперь меняет идентификаторы на основе идентификаторов установки Firebase.

Crashlytics использует UUID установки Crashlytics для идентификации экземпляров вашего приложения и связывания данных ваших пользователей с их устройствами. Ранее Crashlytics меняла UUID установки вашего пользователя при изменении рекламного идентификатора его устройства. Теперь Crashlytics меняет UUID установки на основе идентификатора установки Firebase (FID) пользователя. Для получения дополнительной информации посетите Управление идентификаторов установки Firebase .

Причина изменения

Использование FID совместимо с другими SDK Firebase.


Новый пакет и имя класса для Crashlytics - com.google.firebase.crashlytics.FirebaseCrashlytics.

Теперь вы можете вызывать функции Crashlytics, используя методы экземпляра в синглтоне FirebaseCrashlytics вместо статических функций в классе FirebaseCrashlytics. FirebaseCrashlytics одноточечно глобально доступно через getInstance() функцию статической.

SDK для ткани

Джава

import com.crashlytics.android.Crashlytics;

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

Котлин + KTX

import com.crashlytics.android.Crashlytics

// ...

// Operations on Crashlytics.
Crashlytics.someAction()

SDK Firebase Crashlytics

Джава

import com.google.firebase.crashlytics.FirebaseCrashlytics;

// ...

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

Котлин + KTX

import com.google.firebase.crashlytics.FirebaseCrashlytics

// ...

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

Причина изменения

Корневой пакет и точка входа нового SDK теперь совместимы с другими SDK Firebase. Кроме того, методы экземпляра легче имитировать, чем статические функции, и создают меньше проблем с тестируемостью.


FirebaseCrashlytics больше не работает с Fabric SDK.

Теперь Crashlytics запускается автоматически с использованием ContentProvider, определенного в новом Firebase Crashlytics SDK, который больше не использует ключ API Fabric. Crashlytics теперь использует свое приложение google-services.json файл , чтобы связать приложение с вашим проектом Firebase и сохранить свои исторические данные аварии.

Если у вас есть API ключа Fabric ( io.fabric.ApiKey ) , объявленной в AndroidManifest.xml файл, удалить его:

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

По умолчанию, Crashlytics автоматически собирает и отчеты аварий для всех экземпляров вашего приложения, но вы можете включить его только для пользователей , которые выбирают. Чтобы отключить автоматическую отправку отчетов аварии, в <application> блок вашего AndroidManifest.xml файла, набор firebase_crashlytics_collection_enabled к false :

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

Причина изменения

Чтобы соответствовать другим SDK Firebase, Crashlytics теперь запускается автоматически через ContentProvider. Как и с другими SDKs, теперь он обеспечивает манифест флаг для отключения автоматического сбора данных, которые можно переопределить в любое время с помощью setCrashlyticsCollectionEnabled . Этот метод дает вам больше контроля над поведением отчетов о сбоях вашего приложения.


Crashlytics.log теперь является методом экземпляра.

Не новый SDK больше не включает в себя статический Crashlytics.log метод. Для добавления пользовательских сообщений журнала, использовать новый метод экземпляра crashlytics.log вместо этого. Обратите внимание, что новый метод больше не перекликается с logcat (мы рекомендуем написать оболочку, если вы хотите сохранить такое поведение). Для получения более подробной информации, посетите пользовательские сообщения журнала добавления .

SDK для ткани

Джава

Crashlytics.log("my message");

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

Котлин + KTX

Crashlytics.log("my message")

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

SDK Firebase Crashlytics

Джава

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");

Котлин + 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")

Причина изменения

По вашему запросу мы прекратили отображение журналов Crashlytics в logcat. Использование методов экземпляра также упрощает тестирование вашего кода.


setBool, setDouble, setFloat и setInt, setLong и setString объединяются в setCustomKey.

Мы агрегируемся пользовательский ключ сеттеров в методе setCustomKey . Раньше вы могли использовать настраиваемые установщики ключей, чтобы задать пары ключ / значение, которые будут отправляться вместе с отчетом о сбоях. Теперь вы можете использовать setCustomKey(String, value) , который перегружен принимать примитивные и строковые типы. Для получения дополнительной информации посетите Добавление пользовательских ключей.

SDK для ткани

Джава

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");

Котлин + 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")

SDK Firebase Crashlytics

Джава

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");

Котлин + 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")

Причина изменения

Новое имя метода является уникальным для Crashlytics и дает понять, что Crashlytics не соответствует параметрам "ключ-значение".


setUserIdentifier теперь setUserId. setUserName и setUserEmail удаляются.

Ранее можно было установить имя или адрес электронной почты , связанный с грохотом использованием setUserName и setUserEmail , но эти методы более не определены. Новый предпочтительный метод идентификаторов набора для пользователей, чтобы использовать setUserId . Для получения дополнительной информации посетите сайт Набор идентификаторы пользователя.

SDK для ткани

Джава

Crashlytics.setUserIdentifier("myAppUserId");

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

Crashlytics.setUserName("John Doe");

Котлин + KTX

Crashlytics.setUserIdentifier("myAppUserId")

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

Crashlytics.setUserName("John Doe")

SDK Firebase Crashlytics

Джава

crashlytics.setUserId("myAppUserId");

Котлин + KTX

crashlytics.setUserId("myAppUserId")

Причина изменения

Мы приняли имя метода setUserId , чтобы соответствовать другим Firebase API , и снятом setUserName и setUserEmail препятствовать регистрации PII через Crashlytics.


Crashlytics.logException (Throwable) заменяется FirebaseCrashlytics.recordException (Throwable).

Crashlytics теперь также поддерживает регистрацию встроенных типов ошибок и исключений для приложений Apple и Android.

SDK для ткани

Джава

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

// ...

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

Котлин + KTX

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

// ...

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

SDK Firebase Crashlytics

Джава

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

// ...

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

Котлин + KTX

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

// ...

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

Причина изменения

Новый метод recordException(Throwable) более легко отличить от log(String) , который ведет себя по- разному. Кроме того, мы переименовали новый API, чтобы он был более согласованным на разных платформах.


CrashlyticsListener заменяется didCrashOnPreviousExecution ().

CrashlyticsListener ранее позволял Crashlytics указывать, когда предыдущий сеанс приложения завершался сбоем, что полезно для приложений, которые отображают сообщения после сбоя при перезапуске. Теперь, его обратный вызов заменяется синхронным API вызова didCrashOnPreviousExecution() .

SDK для ткани

Джава

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);

Котлин + 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)

SDK Firebase Crashlytics

Джава

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

Котлин + KTX

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

Причина изменения

Новый API менее подробен и менее сложен в работе, чем CrashlyticsListener, поскольку он не требует ни шаблонного текста, ни обратного вызова. Раньше асинхронный обратный вызов не гарантировал, когда будет вызван обратный вызов.


Метод сбоя удален.

Новый SDK больше не включает метод сбоя, который раньше можно было использовать для проверки конфигурации Crashlytics путем принудительного сбоя в приложении. Бросьте RuntimeException , чтобы заставить аварии.

SDK для ткани

Джава

Crashlytics.getInstance().crash();

Котлин + KTX

Crashlytics.getInstance().crash()

SDK Firebase Crashlytics

Джава

throw new RuntimeException("Test Crash");

Котлин + KTX

throw RuntimeException("Test Crash")

Причина изменения

Новые методы четко указывают, произошли ли в результате сбои вашего приложения во время выполнения или в собственном SDK приложения.


Плагин Crashlytics Gradle содержит новые флаги.

Плагин Gradle продолжает автоматически настраивать и выполнять специфичные для Crashlytics задачи Gradle. Если сборка требует вызова задач из плагина Crashlytics Gradle см доступных задач Firebase Crashlytics, запустив ./gradlew app:tasks . Если ваше приложение использует NDK, вы должны явный вызов uploadCrashlyticsSymbolFile[ BUILD_VARIANT ] задачу Gradle , чтобы продолжить загрузку родные символов Crashlytics.

В Crashlytics специфические флаги сборки ext.alwaysUpdateBuildId и ext.enableCrashlytics больше не поддерживаются. Удалите их из конфигурации Gradle, если они существуют. Если ваше приложение использует байткодовый обфускатор (например, R8 или Proguard) , и вы не хотите , чтобы загрузить файл отображения вашей сборки, чтобы Crashlytics использовать новый mappingFileUploadEnabled флаг в firebaseCrashlytics расширения Gradle. Если установлено значение false, Crashlytics не может деобфускировать трассировки стека вашего приложения. Для нестандартных конфигураций обфускатора, используйте mappingFile параметр , чтобы установить новое местоположение для файла отображения. Эти флаги можно использовать для defaultConfig, а также для любого типа сборки или разновидности.

SDK Firebase Crashlytics

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

Причина изменения

Мы обновили задачи и параметры конфигурации Gradle, чтобы они больше соответствовали соглашениям Gradle.


Crashlytics может использовать только данные, собранные Google Analytics.

Вы больше не можете собирать данные с помощью Fabric Answers после обновления до Firebase Crashlytics SDK. Чтобы получить метрики для пользователей, у которых не возникало сбоев, и хлебных крошек, переключитесь на использование Google Analytics. Обратите внимание, что ваши исторические данные об ответах не могут быть перенесены в Firebase.

Визит Начните использовать Google Analytics , чтобы узнать , как добавить Google Analytics в свое приложение.

Причина изменения

Теперь мы предлагаем Google Analytics, чтобы помочь вам получить более полное представление о ваших данных о сбоях. С помощью Analytics вы можете продолжить сбор статистики для своего приложения в консоли Firebase.


Следующие шаги