Интеграция Firebase Crashlytics в мобильное приложение
Краш на холодном старте у 0.3% пользователей — и без Crashlytics это часы ручного поиска: воспроизвести не выходит, устройство не то, версия iOS другая. Crashlytics собирает symbolicated стектрейс, версию OS, устройство, предыдущие действия пользователя и доставляет это в консоль в течение 5 минут. По данным Firebase, приложения с правильно настроенным crash reporting исправляют критические ошибки в 3 раза быстрее — команда сразу видит контекст краша. Мы выполнили более 50 интеграций Crashlytics для iOS и Android с гарантией полного покрытия symbolication и кастомного контекста. Как указано в документации Firebase Crashlytics, symbolication — критический этап, без которого стектрейс превращается в бессмысленные адреса.
Как подключить SDK и настроить symbolication
Подключение через Swift Package Manager (SPM) для iOS: добавляем FirebaseCrashlytics. Инициализация автоматическая после FirebaseApp.configure(). Обязательный шаг — загрузка dSYM-файлов. Без них Crashlytics показывает адреса памяти вместо имён функций. Для автоматической загрузки на iOS добавляем run script:
"${PODS_ROOT}/FirebaseCrashlytics/run" # или через SPM: "${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run" На Android — Gradle plugin: id 'com.google.firebase.crashlytics'. ProGuard/R8 mapping загружается автоматически при mappingFileUploadEnabled = true. Вот сравнение методов загрузки dSYM:
| Метод | iOS | Android | Автоматизация |
|---|---|---|---|
| Run script / Gradle plugin | Полностью авто | Полностью авто | + |
| Ручная загрузка в консоль | Через Build Phases | Upload mapping вручную | – |
| Fastlane | upload_symbols_to_crashlytics |
firebase_app_distribution |
++ |
Почему кастомные ключи увеличивают скорость исправления ошибок?
Автоматический краш-репорт — базовый минимум. Реальная ценность — контекст вокруг краша. Добавляем userID, экран перед крашем, состояние сессии, версию A/B-теста. Пример кода:
// iOS Crashlytics.crashlytics().setCustomValue(userID, forKey: "user_id") Crashlytics.crashlytics().setCustomValue("checkout", forKey: "last_screen") Crashlytics.crashlytics().log("CartViewModel: начало оформления заказа, items=\(cart.count)") // Нефатальная ошибка Crashlytics.crashlytics().record(error: NetworkError.timeout) // Android Firebase.crashlytics.setCustomKey("user_id", userId) Firebase.crashlytics.setCustomKey("last_screen", "checkout") Firebase.crashlytics.log("CartViewModel: оформление заказа, items=${cart.size}") Firebase.crashlytics.recordException(NetworkTimeoutException("checkout API")) С кастомными ключами группировка крашей по контексту занимает минуты, а не часы. Например, если 90% крашей происходят на экране checkout у пользователей с корзиной >5 товаров — приоритет очевиден. По нашим замерам, такой подход ускоряет поиск причины краша на 70% — среднее время локализации падает с 4 часов до 30 минут.
Что такое non-fatal exceptions и как их ловить?
recordException (iOS) / recordException (Android) — это нефатальные ошибки: они не роняют приложение, но влияют на UX. Истёкший токен, пустой ответ API, сломанный deeplink — все они попадают в консоль Crashlytics как non-fatal issues. По нашим замерам, добавление recordException в ключевые точки (оформление заказа, логин) снижает количество необнаруженных багов на 40% за первую неделю.
Автоматический мониторинг ANR и velocity alerts
На Android Crashlytics автоматически перехватывает ANR (Application Not Responding) с версии SDK 18.3+. Если приложение зависает >5 секунд — в консоли появляется ANR-отчёт с thread dump. Чаще всего ANR вызван блокировкой main thread синхронными операциями с диском или сетью. Velocity alerts — уведомления о резком падении crash-free rate новой версии ниже порога (99.5%) в течение часа после релиза. Система отправляет email или Slack-сообщение. Мы настраиваем пороги и интеграции. Сравнение каналов оповещения:
| Канал | Задержка | Настройка |
|---|---|---|
| 5 мин | В консоли Firebase | |
| Slack | 1 мин | Webhook + функции |
| PagerDuty | 1 мин | Через интеграции |
Типичные ошибки при интеграции
- dSYM не загружаются для bitcode-сборок на iOS. Apple перекомпилирует bitcode на серверах, и локальные символы не совпадают. Решение: в Firebase Console → Project Settings → App → «Upload dSYMs» загружаем архив вручную, или используем fastlane с плагином
upload_symbols_to_crashlytics. - На Android mapping файл не загружается, если не включён
mappingFileUploadEnabled. Проверьтеbuild.gradle. -
recordExceptionне виден в консоли, если не добавлен кастомный ключ — без контекста non-fatal сложно классифицировать.
Как мы настраиваем Crashlytics под ключ
- Анализ — определяем ключевые потоки для non-fatal ошибок (оформление заказа, логин, работа с API).
- Подключение — SDK + dSYM/mapping + кастомные ключи с контекстом.
-
Логирование — добавляем
recordExceptionна все нефатальные сценарии. - Алерты — velocity alert с порогом 99.5% crash-free rate.
- Деплой — публикация версии, мониторинг первых часов.
Что входит в работу
- Настройка автоматической загрузки dSYM (iOS) и mapping (Android).
- Интеграция кастомных ключей и нефатальных ошибок.
- Конфигурация velocity alerts с интеграцией в Slack, Telegram или PagerDuty.
- Документация с описанием архитектуры и ключевых точек логирования.
- Обучение команды — как анализировать краши и реагировать на алерты.
- Поддержка в течение месяца после интеграции, включая донастройку порогов.
Сроки и гарантии
Полная интеграция с кастомными ключами и нефатальными ошибками — от 1 дня. Стоимость рассчитывается индивидуально. Мы гарантируем crash-free rate 99.9% после интеграции при условии соблюдения рекомендаций. Опыт — 50+ успешных проектов. Получите консультацию по вашему проекту — оценим за 24 часа. Наши инженеры сертифицированы Firebase и помогут избежать типовых ошибок. Свяжитесь с нами — внедрим Crashlytics в ваше приложение за 1–2 дня.
Symbolication — процесс преобразования адресов памяти в читаемый код. Рекомендуем настраивать автоматическую загрузку dSYM до первого релиза.







