Crash и ANR

Критические сбои (CRASH) и блокировки основного потока (ANR) являются двумя самыми распространенными проблемами в Android-приложениях. События типа CRASH обозначают неожиданное или аварийное завершение работы приложения из-за ошибки или необработанного исключения. ANR возникает, когда основной поток (UI-поток) приложения блокируется на длительное время и не отвечает на определенные действия (для Android-приложений это обычно 5 секунд). Возникнуть такая ситуация может, например, из-за долгой операции ввода-вывода или блокирующего запроса к базе данных. Помимо негативного пользовательского опыта возникновение таких проблем может привести к потере данных, а потому требует эффективных механизмов и инструментов для их обнаружения и решения.

Tracer предоставляет набор инструментов, которые позволяют отслеживать не только сбои и блокировки основного потока вашего приложения, но и ошибки, возникшие в коде на языке нативного программирования (NATIVE), и некритические сбои или ошибки загрузки данных (NON_FATAL). За отправку данных о событиях типа CRASH, ANR и NATIVE отвечает CrashReportConfiguration. Для репортинга NON_FATAL-ов есть отдельный инструмент.

Для того, чтобы оценить надежность приложения и его способность сохранять работоспособность в течение продолжительного периода, Tracer позволяет рассчитывать crash-free – процент пользователей, у которых не возникало сбоев в работе приложения за выбранный период. Отвечает за фичу CrashFreeConfiguration. Рассчитывается метрика как (1 - (Пользователи со сбоем / Все пользователи)) * 100%. При этом важно понимать, что использование приложения на разных устройствах одного пользователя или переустановка приложения на текущем устройстве будут обозначены как самостоятельные единицы при расчётах. Отчёты о полученных Tracer-ом сбоях и графики по событиям можно найти в разделе «Сбои».

ВАЖНО! Tracer хранит данные о событиях за последние 90 дней.

Подключение зависимостей к проекту

В вашем <project>/<app-module>/build.gradle.kts:

dependencies { implementation(platform("ru.ok.tracer:tracer-platform:0.5.2")) implementation("ru.ok.tracer:tracer-crash-report") }

Если вы хотите дополнительно поддержать сбор и анализ нативных крэшей, следует подключить соответствующую зависимость:

В вашем <project>/<app-module>/build.gradle.kts:

dependencies { implementation(platform("ru.ok.tracer:tracer-platform:0.5.2")) implementation("ru.ok.tracer:tracer-crash-report-native") }

Чтобы Tracer генерировал человекочитаемые стектрейсы, необходимо включить загрузку отладочной информации из нативных библиотек. Подробнее о зависимостях и включении загрузки символов из библиотек — на странице Быстрый старт

После подключения зависимостей следует установить плагины в конфигурацию Tracer:

В вашем Application.kt:

class MyApplication : Application(), HasTracerConfiguration { override val tracerConfiguration: List<TracerConfiguration> get() = listOf( CrashReportConfiguration.build { // ваши опции }, CrashFreeConfiguration.build { // ваши опции }, ) }

Описание CrashReportConfiguration

На данный момент в CrashReportConfiguration есть несколько параметров, отвечающих за отправку событий определенных типов. Настроить эти параметры можно при помощи опций CrashReportConfiguration.Builder:

ОпцияОписание
setEnabledОтвечает за включение/выключение отправки сбоев (CRASH). По умолчанию включена.
setSendAnrОтвечает за включение/выключение отправки ANR. По умолчанию включена.
setNativeEnabledОтвечает за включение/выключение отправки нативных крэшей (NATIVE). Значение по умолчанию зависит от того, подключена ли зависимость tracer-crash-report-native. Если подключена, то и репортинг по умолчанию включен. Если не подключена – выключен.

ВАЖНО! Включить репортинг нативных крэшей без подключения соответствующей зависимости не выйдет, а вот выключить репортинг при наличии зависимости – пожалуйста.

Описание CrashFreeConfiguration

Перед настройкой CrashFreeConfiguration убедитесь, что вы включили отправку крэшей в CrashReportConfiguration, иначе использование этого плагина будет бесполезно.

Опции CrashFreeConfiguration.Builder:

ОпцияОписание
setEnabledОтвечает за включение/выключение подсчёта crash-free users. По умолчанию включен.

Опасные опции CrashFreeConfiguration.Builder – используйте с умом:

ОпцияОписание
setExperimentalMaxSessionsToUploadПозволяет установить количество сессий, которое должно накопиться для отправки батча. По умолчанию установлено 10.

Рекомендуется использовать только для тестов!
setExperimentalMaxSessionTimeSpanToUploadПозволяет указать, как долго следует копить сессии для отправки батча. По умолчанию установлено 4 часа (в ms).

Рекомендуется использовать только для тестов!

Описание TracerCrashReport

Для отправки NON_FATAL-ов используется метод TracerCrashReport.report, принимающий в качестве параметра объект Throwable:

// Залоггировать не фатальную ошибку. TracerCrashReport.report(NonFatalException("I'll be ok soon"))

По умолчанию все сбои группируются по общим частям стектрейса, но в случае non-fatal'ов такая группировка является на самой эффективной. Дело в том, что не всегда стектрейс и место, в котором залогировали ошибку, связаны между собой. Чтобы избежать замусирования сбоев большим количеством non-fatal'ов существует способ повлиять на эту группировку и собрать все non-fatal'ы одного вида ошибки в одну группу при помощи специального ключа issueKey. Этот параметр также будет отображаться в названии события.

Преимущество issueKey в том, что не только вы сможете легко найти non-fatal'ы, относящиеся к конкретной проблеме, но и другие разработчики смогут легко найти по ключу точку логирования этой ошибки (и удалить при необходимости) и отследить его в вашем issue-трекере.

Чтобы установить ключ, воспользуйтесь методом TracerCrashReport.report с параметром issueKey:

// Залогировать нефатальную ошибку с ключом ISSUE-001 TracerCrashReport.report(NonFatalException("What a terrible failure"), issueKey = "ISSUE-001")

ВАЖНО! На текущий момент в Tracer есть лимит в 1 млн событий в день. Поэтому рекомендуется не злоупотреблять этим методом.

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