Інтеграція 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 дня. Вартість — від $500, залежно від складності. Економія: заощаджуєте до 10 годин на місяць на пошуку крашів, що еквівалентно $1000. Ми гарантуємо crash-free rate 99.9% після інтеграції за умови дотримання рекомендацій. Досвід — 5+ років на ринку, 50+ успішних проєктів. Наші інженери сертифіковані Firebase і допоможуть уникнути типових помилок. Отримайте консультацію щодо вашого проєкту — оцінимо за 24 години. Зв'яжіться з нами — впровадимо Crashlytics у ваш додаток за 1–2 дні.
Symbolication — процес перетворення адрес пам'яті у читабельний код. Рекомендуємо налаштовувати автоматичне завантаження dSYM до першого релізу.







