Как настроить отчеты о сбоях для Flutter

Выберите платформу: iOS+ Android Flutter Unity


Чтобы посмотреть подробный отчет о событии, нажмите на проблему на панели управления DevOps и вовлечение > Crashlytics в Firebase Console. Вы можете настраивать эти отчеты, чтобы лучше понимать, что происходит в вашем приложении и при каких обстоятельствах происходят события, о которых сообщается в Crashlytics.

Как сообщить об исключениях

Сообщать о неперехваченных исключениях

Вы можете автоматически отслеживать все критические ошибки, возникающие в платформе Flutter, переопределив FlutterError.onError с помощью FirebaseCrashlytics.instance.recordFlutterFatalError. Чтобы также отслеживать некритические исключения, переопределите FlutterError.onError с помощью FirebaseCrashlytics.instance.recordFlutterError:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  bool weWantFatalErrorRecording = true;
  FlutterError.onError = (errorDetails) {
    if(weWantFatalErrorRecording){
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    } else {
      FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
    }
  };

  runApp(MyApp());
}

Асинхронные ошибки

Асинхронные ошибки не перехватываются фреймворком Flutter:

ElevatedButton(
  onPressed: () async {
    throw Error();
  }
  ...
)

Чтобы отслеживать такие ошибки, можно использовать обработчик PlatformDispatcher.instance.onError:

Future<void> main() async {
    WidgetsFlutterBinding.ensureInitialized();
    await Firebase.initializeApp();
    FlutterError.onError = (errorDetails) {
      FirebaseCrashlytics.instance.recordFlutterFatalError(errorDetails);
    };
    // Pass all uncaught asynchronous errors that aren't handled by the Flutter framework to Crashlytics
    PlatformDispatcher.instance.onError = (error, stack) {
      FirebaseCrashlytics.instance.recordError(error, stack, fatal: true);
      return true;
    };
    runApp(MyApp());

}

Ошибки за пределами Flutter

Чтобы отслеживать ошибки, возникающие за пределами контекста Flutter, установите прослушиватель ошибок в текущем Isolate:

Isolate.current.addErrorListener(RawReceivePort((pair) async {
  final List<dynamic> errorAndStacktrace = pair;
  await FirebaseCrashlytics.instance.recordError(
    errorAndStacktrace.first,
    errorAndStacktrace.last,
    fatal: true,
  );
}).sendPort);

Сообщать о перехваченных исключениях

Помимо автоматического создания отчетов о сбоях в приложении, Crashlytics позволяет регистрировать некритические исключения и отправляет их вам при следующем сообщении о критическом событии или при перезапуске приложения.

Используйте метод recordError, чтобы регистрировать некритические исключения в блоках catch приложения. Пример:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error'
);

// Or you can use:
await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);

Вы также можете зарегистрировать дополнительную информацию об ошибке, используя свойство information:

await FirebaseCrashlytics.instance.recordError(
  error,
  stackTrace,
  reason: 'a non-fatal error',
  information: ['further diagnostic information about the error', 'version 2.0'],
);

Эти исключения отображаются как некритические ошибки на панели управления DevOps и вовлечение > Crashlytics в консоли Firebase. В сводке по проблеме содержится вся информация о состоянии, которую вы обычно получаете при сбоях, а также разбивка по версиям и аппаратным устройствам.

Crashlytics обрабатывает исключения в отдельном фоновом потоке, чтобы минимизировать влияние на производительность приложения. Чтобы снизить сетевой трафик пользователей, Crashlytics при необходимости ограничивает количество отчетов, отправляемых с устройства.

Добавить специальные ключи

Специальные ключи помогают определить, в каком состоянии находилось приложение перед сбоем. Вы можете связать произвольные пары "ключ-значение" с отчетами о сбоях, а затем использовать специальные ключи для поиска и фильтрации отчетов о сбоях на панели управления DevOps & Engagement (DevOps и вовлечение) > Crashlytics в консоли Firebase.

  • На панели управления можно искать проблемы, соответствующие специальному ключу.

  • При просмотре определенной проблемы на панели управления вы можете увидеть связанные специальные ключи для каждого события (вложенная вкладка Ключи) и даже отфильтровать события по специальным ключам (меню Фильтр в верхней части страницы).

Чтобы задать пары "ключ-значение", используйте метод экземпляра setCustomKey. Вот несколько примеров:

// Set a key to a string.
FirebaseCrashlytics.instance.setCustomKey('str_key', 'hello');

// Set a key to a boolean.
FirebaseCrashlytics.instance.setCustomKey("bool_key", true);

// Set a key to an int.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1);

// Set a key to a long.
FirebaseCrashlytics.instance.setCustomKey("int_key", 1L);

// Set a key to a float.
FirebaseCrashlytics.instance.setCustomKey("float_key", 1.0f);

// Set a key to a double.
FirebaseCrashlytics.instance.setCustomKey("double_key", 1.0);

Как добавить собственные сообщения в журнал

Чтобы лучше понимать, что привело к сбою, вы можете добавить в приложение специальные журналы Crashlytics. Crashlytics связывает журналы с данными о сбоях и показывает их на вкладке Журналы, когда вы просматриваете сведения о проблеме. Все проблемы можно найти в консоли Firebase на панели управления DevOps и вовлечение > Crashlytics.

Используйте log, чтобы выявлять проблемы. Пример:

FirebaseCrashlytics.instance.log("Higgs-Boson detected! Bailing out");

Как задать идентификаторы пользователей

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

Чтобы добавить идентификаторы пользователей в отчеты, назначьте каждому пользователю уникальный идентификатор в виде номера, токена или значения хеша.

FirebaseCrashlytics.instance.setUserIdentifier("12345");

Если вам потребуется удалить идентификатор пользователя, задайте в качестве значения пустую строку. Очистка идентификатора пользователя не удаляет существующие записи Crashlytics. Если вам нужно удалить записи, связанные с идентификатором пользователя, обратитесь в службу поддержки Firebase.

Как получить историю действий пользователя

История действий пользователя позволяет лучше понять, что он делал в приложении перед тем, как произошел сбой, ошибка ANR или некритическая ошибка. Эти журналы могут быть полезны при попытке воспроизвести и отладить проблему.

Истории действий пользователей создаются с помощью Google Аналитики. Чтобы получать их, включите Google Аналитику для проекта Firebase и добавьте Firebase SDK для Google Analytics в приложение. После этого истории действий пользователей будут автоматически включаться в данные о событиях на вкладке Журналы при просмотре сведений о проблеме. Все проблемы можно найти в Firebase Console на панели DevOps и вовлечение > Crashlytics.

SDK Analytics автоматически регистрирует событие screen_view, что позволяет показывать в истории действий список экранов, которые пользователь просматривал до сбоя, нефатальной ошибки или ошибки ANR. История действий пользователя screen_view содержит параметр firebase_screen_class.

В историю действий также добавляются специальные события, которые вы вручную регистрируете в рамках сеанса пользователя, включая данные параметров событий. Эти данные могут помочь показать серию действий пользователя, приведших к сбою, нефатальному событию или событию ANR.

Обратите внимание, что вы можете управлять сбором и использованием данных Google Analytics, в том числе тех, которые добавляются в историю действий.

Как включить отчеты о согласии

По умолчанию Crashlytics автоматически собирает отчеты о сбоях для всех пользователей вашего приложения. Чтобы предоставить пользователям больше контроля над отправляемыми данными, вы можете включить отправку отчетов по запросу. Для этого отключите автоматическую отправку отчетов и отправляйте данные в Crashlytics только тогда, когда это указано в коде.

  1. Как отключить автоматический сбор данных

    Платформы Apple

    Добавьте новый ключ в файл Info.plist:

    • Ключ: FirebaseCrashlyticsCollectionEnabled
    • Значение: false

    Android

    В блоке application файла AndroidManifest.xml добавьте тег meta-data, чтобы отключить автоматический сбор данных.

    <meta-data
        android:name="firebase_crashlytics_collection_enabled"
        android:value="false" />
    
  2. Включите сбор данных для определенных пользователей, вызвав переопределение сбора данных Crashlytics во время выполнения. Переопределенное значение сохраняется при всех последующих запусках приложения, поэтому Crashlytics может автоматически собирать отчеты для этого пользователя.

    FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
    

    Если пользователь позже откажется от сбора данных, вы можете передать значение false, которое будет применено при следующем запуске приложения и сохранится для всех последующих запусков.

Как управлять данными Crash Insights

Crash Insights помогает устранять проблемы, сравнивая ваши анонимизированные трассировки стека с трассировками из других приложений Firebase и сообщая вам, является ли ваша проблема частью более крупной тенденции. Для многих проблем Crash Insights даже предоставляет ресурсы, которые помогут вам отладить сбой.

Для выявления общих тенденций стабильности в Crash Insights используются агрегированные данные о сбоях. Если вы не хотите делиться данными своего приложения, вы можете отключить Crash Insights в меню Crash Insights в верхней части списка проблем на панели управления DevOps & Engagement (DevOps и вовлечение) > Crashlytics в консоли Firebase.

Дальнейшие действия