Настройте отчеты о сбоях Firebase Crashlytics


На панели управления Crashlytics вы можете нажать на проблему и получить подробный отчёт о событии. Вы можете настроить эти отчёты, чтобы лучше понимать, что происходит в вашем приложении и обстоятельства событий, о которых сообщается в 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'],
);

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

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

Добавить пользовательские ключи

Пользовательские ключи помогают получить информацию о состоянии приложения, предшествовавшем сбою. Вы можете связать произвольные пары «ключ/значение» с отчётами о сбоях, а затем использовать эти ключи для поиска и фильтрации отчётов о сбоях в консоли Firebase .

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

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

Используйте метод экземпляра 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 на вкладке « Журналы Crashlytics ».

Используйте log для выявления проблем. Например:

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

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

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

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

FirebaseCrashlytics.instance.setUserIdentifier("12345");

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

Получить журналы навигации

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

Журналы навигации работают с Google Analytics, поэтому для их получения необходимо включить Google Analytics в проекте Firebase и добавить Firebase SDK для Google Analytics в приложение. После выполнения этих требований журналы навигации автоматически добавляются к данным о событии на вкладке «Журналы» при просмотре сведений о проблеме.

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

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

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

Включить подписку на отчеты

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

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

    Платформы Apple

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

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

    Андроид

    В блоке 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 в верхней части списка проблем Crashlytics в консоли Firebase .

,


На панели управления Crashlytics вы можете нажать на проблему и получить подробный отчёт о событии. Вы можете настроить эти отчёты, чтобы лучше понимать, что происходит в вашем приложении и обстоятельства событий, о которых сообщается в 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'],
);

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

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

Добавить пользовательские ключи

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

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

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

Используйте метод экземпляра 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 на вкладке Журналы Crashlytics .

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

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

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

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

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

FirebaseCrashlytics.instance.setUserIdentifier("12345");

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

Получить журналы навигации

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

Журналы навигации основаны на Google Analytics, поэтому для получения журналов навигации вам необходимо включить Google Analytics для вашего проекта Firebase и добавить Firebase SDK для Google Analytics в свое приложение. Как только эти требования будут выполнены, навигационные журналы автоматически включаются в данные о событии на вкладке «Журналы» , когда вы просматриваете сведения о проблеме.

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

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

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

Включить подписку на получение отчетов

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

  1. Отключите автоматический сбор:

    платформы Apple

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

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

    Андроид

    В блоке 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 в верхней части списка проблем Crashlytics в консоли Firebase .