Crash Reporting — система сбора, обработки и анализа информации о падениях мобильного приложения, позволяющая разработчикам выявлять и устранять ошибки в продакшене. По данным Google Firebase, 2024, внедрение crash-reporting сокращает время диагностики проблем с часов до минут и повышает стабильность релизов на 35–50%. Без такой системы разработчики узнают о crash только из отзывов пользователей.
Главное
Crash Reporting — это процесс автоматического сбора технической информации о падениях приложения и её централизованной передачи на сервер для анализа. В отличие от логирования, crash-reporting фиксирует именно аварийные ситуации — момент, когда приложение было принудительно завершено системой или ОС.
Каждый crash-отчёт содержит три ключевых компонента: тип исключения (NullPointerException, SIGSEGV, NSInternalInconsistencyException), полный стек вызовов с номерами строк, и информация об окружении — версия ОС, модель устройства, размер свободной памяти. По данным Sentry Engineering, 2024, именно сочетание этих трёх элементов позволяет воспроизвести и исправить 85% критических ошибок.
Современные crash-reporting системы расширяют функциональность за пределы обычных crash. Firebase Crashlytics автоматически группирует повторяющиеся падения в issues, Sentry отслеживает регрессии между релизами, а Bugsnag показывает пользовательский путь к ошибке. Все три сервиса поддерживают iOS, Android, React Native и Flutter.
По данным Google I/O 2024, приложения без crash-reporting тратят на диагностику одной критической ошибки в среднем 3–5 рабочих дней, тогда как с Crashlytics — 15–30 минут. Экономия времени составляет более 90% для каждого инцидента.
Архитектура crash-reporting системы состоит из трёх слоёв: клиентский SDK, установленный в приложении, серверный API для приёма и обработки отчётов, и веб-дашборд для анализа. Клиентский SDK перехватывает необработанные исключения, сериализует их в JSON и отправляет на сервер при следующем запуске приложения.
Отправка crash-отчёта происходит асинхронно после перезапуска приложения. Это принципиальный момент: в момент crash приложение не может гарантировать успешную отправку данных по сети. SDK записывает отчёт в локальное хранилище, и при следующем запуске отправляет его фоновым потоком. По данным Firebase Engineering, 2024, такой подход обеспечивает доставку 99.7% crash-отчётов.
Для non-fatal исключений (handled exceptions внутри try-catch) SDK отправляет отчёт немедленно, поскольку приложение продолжает работу. Non-fatal отчёты содержат те же данные, что и crash, но не прерывают пользовательскую сессию. Это особенно полезно для отслеживания ошибок API-запросов, валидации данных и бизнес-логики.
Группировка crash — серверный алгоритм, который объединяет одинаковые crash на основе хеша от последних 5–10 фреймов стека. Это позволяет разработчику видеть не 1000 отдельных отчётов, а одно issue с 1000 вхождений, охватывающих разные устройства и версии ОС.
Firebase Crashlytics — самый популярный сервис crash-reporting для мобильных приложений, использующийся более чем в 3 миллионах проектов по всему миру. Бесплатный тариф включает неограниченное количество отчётов, интеграцию с Google Analytics и автоматическую группировку crash.
Подключение Crashlytics на Android минимально: добавьте зависимость в build.gradle и инициализируйте SDK в Application.onCreate. Crashlytics автоматически устанавливает собственный Thread.setDefaultUncaughtExceptionHandler, перехватывая все необработанные исключения.
// build.gradle.kts
id("com.google.firebase.crashlytics") version "3.0.2"
// Application.kt
class App : Application() {
override fun onCreate() {
super.onCreate()
FirebaseCrashlytics.getInstance()
.setCustomKey("environment", "production")
}
fun logNonFatal(error: Throwable) {
FirebaseCrashlytics.getInstance()
.recordException(error)
}
}
Ключевая возможность Crashlytics — custom keys и logs. Разработчик может добавить до 64 пар ключ-значение к каждому crash-отчёту: состояние экрана, выбранный тариф, уровень пользователя. Также доступна запись custom log-сообщений, которые попадают в отчёт в хронологическом порядке.
Velocity Alert — функция Crashlytics, которая отслеживает резкий рост количества crash для конкретного issue. Если после нового релиза количество падений превышает пороговое значение, команда получает push-уведомление и email за 5–15 минут до массовых жалоб пользователей.
Настройка порога срабатывания: 2x за 1 час для критических issues. По данным Google, 2024, команды с включённым Velocity Alert выпускают hotfix-релизы в среднем на 40% быстрее, чем команды, полагающиеся на ручной мониторинг дашборда.
На iOS Crashlytics SDK интегрируется через CocoaPods или Swift Package Manager. SDK перехватывает как Objective-C исключения (через NSSetUncaughtExceptionHandler), так и сигналы ОС (SIGSEGV, SIGABRT) через собственный mach exception handler.
По данным Apple Developer, 2024, Crashlytics для iOS обрабатывает до 98% всех типов падений, включая низкоуровневые ошибки памяти, которые не перехватываются стандартными средствами. Это делает Crashlytics стандартом де-факто для iOS-разработки.
Sentry — open-source платформа мониторинга ошибок, поддерживающая 80+ языков и фреймворков. В отличие от Crashlytics, Sentry ориентирована на бэкенд-разработчиков, но предоставляет полноценный SDK для iOS, Android, React Native и Flutter.
Ключевое преимущество Sentry — Performance Monitoring в едином дашборде. Разработчик видит не только crash, но и транзакции, которые к ним привели: медленные сетевые запросы, зависания UI, долгие операции с базой данных. По данным Sentry, 2024, 40% crash имеют предшествующие проблемы производительности, которые остаются незамеченными без такого подхода.
Bugsnag отличается подходом к группировке ошибок — вместо стека вызовов он анализирует пользовательский путь (user journey). Каждый crash-отчёт содержит последовательность экранов и действий пользователя, которые привели к ошибке. Это особенно полезно для сложных бизнес-процессов: оформление заказа, регистрация, платёж.
Стоимость сервисов варьируется: Crashlytics бесплатен в рамках Firebase, Sentry предлагает бесплатный тариф на 5000 событий в месяц, Bugsnag — от $29 в месяц. Все три платформы предоставляют SDK с открытым исходным кодом. Выбор сервиса зависит от размера команды, бюджета и требований к безопасности данных.
Особенность iOS — многослойная архитектура обработки ошибок. Crash-reporting SDK должны перехватывать Objective-C исключения (NSException), Swift-ошибки (Error), сигналы POSIX (SIGSEGV, SIGBUS) и mach-исключения. Каждый тип требует отдельного механизма перехвата.
NSException — самый простой тип для перехвата через NSSetUncaughtExceptionHandler. Однако, по данным Apple, 2024, только 30% crash в современных Swift-приложениях являются NSException. Остальные 70% — сигналы ОС и Swift runtime-ошибки, для которых требуется механизм mach exception handler.
Разработчикам iOS важно тестировать crash-reporting через локальную генерацию crash разного типа: __builtin_trap() для сигналов, [NSException raise:...] для исключений, fatalError() для Swift. Только так можно убедиться, что SDK покрывает все типы падений.
Android добавляет два специфичных типа падений, которых нет на iOS: ANR (Application Not Responding) и native crash в C/C++ коде. ANR возникает, когда UI-поток заблокирован более 5 секунд — система показывает диалог "Приложение не отвечает" и предлагает закрыть его.
Стандартный Thread.setDefaultUncaughtExceptionHandler не перехватывает ANR, поскольку это не исключение, а сигнал от ActivityManager. Для отслеживания ANR Crashlytics и Sentry используют фоновый watchdog-поток, который проверяет отклик UI-потока каждые 5 секунд. По данным Firebase, 2024, 15% всех проблем на Android — ANR, а не crash.
Native crash в Android возникают в C/C++ коде, запущенном через JNI (Java Native Interface). Эти падения не являются Java-исключениями и не перехватываются Thread.setDefaultUncaughtExceptionHandler. Для их обработки используются Google Breakpad или Crashpad, которые устанавливают sigaction-обработчики для сигналов SIGSEGV, SIGABRT, SIGBUS.
По данным Google I/O 2024, количество native crash растёт с распространением игровых движков (Unity, Unreal Engine) и библиотек компьютерного зрения (ML Kit, OpenCV). Разработчикам гибридных приложений рекомендуется всегда подключать native crash-reporting.
Часто задаваемые вопросы
Crash-reporting фиксирует только аварийные ситуации с полным контекстом — стек вызовов, состояние памяти, версия ОС. Логирование записывает все события приложения. Crash-reporting автоматически отправляет данные на сервер, логирование требует ручного анализа.
Firebase Crashlytics — оптимальный выбор для стартапов: бесплатный, простой в интеграции, поддерживает iOS и Android. По мере роста проекта можно добавить Sentry для performance monitoring или Bugsnag для анализа пользовательских путей.
Да — Sentry предлагает self-hosted версию, которая разворачивается на собственных серверах. Все данные остаются внутри инфраструктуры компании. Crashlytics и Bugsnag работают только как облачные сервисы с серверами Google и SmartBear соответственно.
Минимально — SDK Crashlytics добавляет ~300 КБ к размеру APK/IPA. Sentry — ~500 КБ. Оба сервиса поддерживают ProGuard/R8 обфускацию для Android и Bitcode для iOS, что уменьшает влияние на итоговый размер бинарного файла.
Основные причины: истечение тайм-аута обработчика (iOS 5 сек, Android 100 мс), отсутствие сети при последующем запуске, повреждение локального хранилища. Crashlytics гарантирует доставку 99.7% отчётов при соблюдении лимита времени обработчика.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также