Інтеграція Firebase Crashlytics в мобільний додаток
Крах на холодному старті у 0.3% користувачів. У логах пристрою — EXC_BAD_ACCESS без стеку. Без Crashlytics це означає години пошуку: воспроізвести не виходить, пристрій не той, версія iOS інша. Crashlytics збирає symbolicated стектрейс, версію OS, пристрій, попередні дії користувача та доставляє це в консоль протягом хвилин після краху.
Підключення SDK
iOS через Swift Package Manager: додаємо FirebaseCrashlytics з репозиторію firebase-ios-sdk. Інніціалізація відбувається автоматично через FirebaseApp.configure() в AppDelegate або через @main + FirebaseOptions.
Обов'язковий крок, який часто пропускають: завантаження dSYM. Без символьних файлів Crashlytics показує адреси пам'яті замість імен функцій. Для автоматичної завантаження додаємо run script у Build Phases:
"${PODS_ROOT}/FirebaseCrashlytics/run"
# або через SPM:
"${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"
На Android SDK підключається через Gradle plugin: id 'com.google.firebase.crashlytics' у app/build.gradle. ProGuard/R8 mapping завантажується автоматично при збірці release-варіанту якщо налаштовано firebaseCrashlytics { mappingFileUploadEnabled = true }.
Кастомні ключі та логи
Автоматичний краш-звіт — це базовий мінімум. Справжня цінність — контекст навколо краху:
// iOS
Crashlytics.crashlytics().setCustomValue(userID, forKey: "user_id")
Crashlytics.crashlytics().setCustomValue("checkout", forKey: "last_screen")
Crashlytics.crashlytics().log("CartViewModel: початок оформлення замовлення, items=\(cart.count)")
// Нефатальна помилка — потрапляє в Crashlytics без краху додатку
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"))
recordException / record(error:) — потужний інструмент для відстеження помилок, які не роняють додаток, але впливають на UX: істекший токен, порожня відповідь API, зламаний deeplink.
ANR та non-fatal на Android
На Android Crashlytics автоматично перехоплює ANR (Application Not Responding) з версії SDK 18.3+. Якщо додаток зависає на >5 секунд — у консолі з'являється ANR-звіт зі станом thread dump. Це окрема категорія від крашів, часто пов'язана з блокуванням main thread синхронними операціями з диском або мережею.
Crashlytics + Alerts
У консолі Firebase налаштовуємо velocity alerts: якщо нова версія набирає crash-free rate нижче порога (зазвичай 99.5%) протягом години після релізу — приходить email/Slack-сповіщення. Дозволяє впіймати регресію до того, як вона накриє всю аудиторію.
Типова помилка при інтеграції
dSYM не завантажуються для bitcode-збірок (актуально для старих iOS-проектів). Apple перекомпілює bitcode на своїх серверах, і фінальні символи відрізняються від локальних. Рішення: у Firebase Console → Project Settings → App → «Upload dSYMs» завантажуємо архів вручну, або налаштовуємо fastlane з плагіном firebase_app_distribution та upload_symbols_to_crashlytics.
Що входить у роботу
- Підключення SDK (SPM / CocoaPods на iOS, Gradle на Android)
- Налаштування автозавантаження dSYM / mapping файлів
- Кастомні ключі для контексту: user_id, екран, стан сесії
-
recordExceptionдля нефатальних помилок у ключових потоках - Velocity alert у консолі
Термін
Повна інтеграція з кастомними ключами та нефатальними помилками: 1 день. Вартість розраховується індивідуально.







