Отслеживание падений приложения: Crashlytics или Sentry
Практика4 минРедакция Innovialabs
Коротко
Crashlytics — бесплатный и быстрый способ видеть падения, если вы уже в Firebase; Sentry сильнее в ошибках, производительности и self-hosted, но сложнее и платный на объёме. В обоих случаях без загрузки dSYM и mapping-файлов отчёты нечитаемы.
Коротко: что выбрать
Firebase Crashlytics — разумный выбор по умолчанию для мобильного приложения: бесплатный, быстро подключается, хорошо работает с Firebase Analytics и Remote Config. Sentry выбирают, когда нужно больше: единая система ошибок для мобильного приложения и бэкенда, трассировка производительности, гибкие правила алертов или размещение на своём сервере.
| Критерий | Crashlytics | Sentry |
|---|---|---|
| Стоимость | Бесплатно | Есть бесплатный тариф, дальше оплата по объёму событий; можно развернуть у себя |
| Фокус | Падения и нефатальные ошибки в мобайле | Ошибки, производительность, релизы на всех платформах |
| Платформы | iOS, Android, Flutter, Unity, React Native (через сторонний модуль) | iOS, Android, Flutter, React Native, веб, бэкенд |
| Алерты | Базовые, включая резкий рост падений | Гибкие правила, интеграции с Slack, Telegram через вебхуки и т. п. |
| Хранение данных | Только облако Google | Облако или self-hosted |
Crash-free rate: главная метрика стабильности
Crash-free users — доля пользователей, у которых за период не было ни одного падения. Crash-free sessions — доля сессий без падений. Первая метрика показывает, сколько людей пострадало, вторая — насколько часто приложение падает при обычном использовании.
Смотрите на обе и сравнивайте по версиям. Если новая версия заметно хуже предыдущей, это повод остановить поэтапный релиз в App Store Connect или Google Play Console, пока не вышел фикс.
Символикация: почему стектрейс нечитаем
В релизной сборке код оптимизирован и обфусцирован, поэтому вместо имён функций в отчёте будут адреса памяти или имена вроде a.b.c. Чтобы превратить их обратно в понятный стектрейс, нужны файлы символов:
- iOS — dSYM. Генерируются при сборке, если в Build Settings для Release указано
DWARF with dSYM File. Их нужно загружать для каждой сборки. - Android — mapping.txt. Создаётся R8/ProGuard при минификации. Без него имена классов будут обфусцированы.
- Native-код (NDK, C++) — отдельные символьные файлы.
- Flutter — при сборке с
--obfuscate --split-debug-infoнужно загрузить и debug-info. - React Native — source maps для JavaScript-бандла.
Самая частая ошибка — символы загружены для одной сборки и забыты для следующей. Автоматизируйте загрузку в CI, а не делайте её вручную.
Подключение Crashlytics
- Создайте проект в Firebase и добавьте приложения iOS и Android.
- Положите конфиги
GoogleService-Info.plistиgoogle-services.jsonв проект. - Добавьте SDK Crashlytics.
- На Android подключите Gradle-плагин — он сам загружает mapping-файл:
plugins {
id("com.google.gms.google-services")
id("com.google.firebase.crashlytics")
}
- На iOS добавьте в Build Phases скрипт загрузки dSYM из документации Firebase.
- Вызовите тестовое падение и проверьте, что оно появилось в консоли с читаемым стектрейсом.
Логируйте и нефатальные ошибки — например, ошибки парсинга ответа API. Добавляйте ключи вроде экрана, роли пользователя и версии конфигурации, но не пишите персональные данные.
Подключение Sentry
- Создайте проект в Sentry и получите DSN.
- Установите SDK и инициализируйте его как можно раньше при запуске. Пример для Flutter:
await SentryFlutter.init(
(options) {
options.dsn = "https://<key>@<host>/<project>";
options.tracesSampleRate = 0.2;
},
appRunner: () => runApp(const MyApp()),
);
- Настройте
sentry-cliв CI для загрузки dSYM, mapping-файлов и source maps. - Передавайте release и environment, чтобы отделять продакшен от тестовых сборок и сравнивать версии.
Алерты и приоритизация
Не все падения одинаково важны. Сортируйте их по влиянию:
- Сколько пользователей затронуто, а не сколько событий. Одно устройство может дать сотни повторов.
- Где происходит падение: на оплате, регистрации или старте приложения — критично, в редком экране настроек — может подождать.
- Новое или регрессия: проблема, которая появилась в последней версии, важнее старой и стабильной.
- Тренд: резкий рост после релиза требует реакции в тот же день.
Настройте минимум три алерта: новая проблема в свежей версии, резкий рост числа падений, падение crash-free ниже вашего порога. Отправляйте их в канал команды, а не на почту, которую никто не читает.