«У меня вылетает» — сообщение, по которому невозможно ничего понять. Ни модели телефона, ни экрана, ни действия. А на устройствах разработчиков всё работает. Разберём, как превратить эти жалобы в конкретную строку кода.
Сначала — сбор отчётов
Пока в приложении нет сбора падений, разговор беспредметный. Подключается это за час: библиотека фиксирует момент вылета, стек вызовов, модель устройства, версию системы и версию приложения, и отправляет отчёт, когда появится сеть.
После подключения картина меняется: вместо «иногда вылетает» вы видите, что 80 процентов падений приходятся на одно место в коде и на Android 13, и чинится это одной правкой.
Важно подключить сбор до массового запуска, а не после жалоб: отчёты собираются только с тех версий, где библиотека уже стоит.
Что даёт сама площадка
Google Play показывает падения в консоли разработчика в разделе с показателями качества: сколько сессий закончилось вылетом, на каких устройствах, с какими стеками. App Store Connect отдаёт похожие данные в разделе с метриками. Это бесплатно и работает без дополнительных библиотек, но данных меньше и приходят они с задержкой.
Что чаще всего оказывается причиной
Обращение к тому, чего нет. Сервер вернул ответ без ожидаемого поля, приложение обратилось к нему напрямую — вылет. Особенно часто на редких сценариях: пустой список заказов, профиль без фотографии, товар без цены.
Нехватка памяти. Проявляется на дешёвых телефонах и почти никогда на устройствах разработчиков. Обычно виноваты большие изображения, которые загружаются в полном размере вместо уменьшенного.
Разрешения. Пользователь отказал в доступе к камере или файлам, а код продолжает работать так, будто доступ есть.
Старые версии систем. Функция, доступная с определённой версии, вызывается без проверки. На новых телефонах работает, на старых — вылет.
Плохая связь. Запрос оборвался посередине, ответ пришёл наполовину. Проверяется включением режима слабой сети в инструментах разработчика.
Как воспроизвести
Имея стек вызовов, воспроизвести падение обычно несложно: видно экран и действие. Дальше берут устройство с той же версией системы — или эмулятор, если модель редкая, — и повторяют шаги. Если не воспроизводится, помогает ограничение памяти и медленная сеть: большинство «неуловимых» падений живут именно там.
Порядок действий
Подключить сбор отчётов, если его нет. Выпустить версию со сбором и подождать сутки. Посмотреть, какие падения дают больше всего случаев — обычно первые два-три пункта покрывают почти всё. Починить их, выпустить и снова посмотреть цифры.
Такой цикл за две-три итерации обычно снижает долю сессий с падениями до долей процента. Это заметно и по отзывам: люди перестают писать «постоянно вылетает» и начинают писать по делу.
Как читать отчёт о падении
Отчёт выглядит пугающе, но полезной информации в нём немного. Первое — тип ошибки: обращение к пустому значению, выход за границы списка, нехватка памяти. Второе — стек вызовов: список функций, приведших к падению. Ищите в нём первые строки, относящиеся к вашему коду, а не к системным библиотекам: именно там причина.
Третье — контекст: модель устройства, версия системы, версия приложения, свободная память. Если все падения приходятся на одну версию Android или на устройства с малым объёмом памяти, причина сужается сразу.
Для приложений, собранных с сокращением кода, отчёт приходит нечитаемым набором символов. Чтобы он превращался в осмысленные названия, при каждой сборке нужно сохранять файл соответствия и загружать его в сервис сбора отчётов. Без этого отчёты бесполезны — частая причина, по которой команда «ничего не понимает» в собранной статистике.
Падения, которые не падения
Отдельный класс жалоб: приложение не вылетает, а зависает. Экран замирает, кнопки не отвечают, человек закрывает его вручную и говорит «вылетело». В отчётах о падениях этого не видно вообще.
Причина почти всегда одна — тяжёлая работа в главном потоке: разбор большого ответа сервера, обработка изображения, запрос к базе на десятки тысяч записей. Лечится переносом работы в фоновый поток. Находится через инструменты профилирования или по простому признаку: зависание случается там, где загружается много данных.
Похожая история — бесконечный индикатор загрузки. Запрос ушёл, ответа нет, таймаут не задан, и приложение ждёт вечно. Всегда задавайте предельное время ожидания и показывайте понятное сообщение с кнопкой повтора.
Сколько падений — это нормально
Ориентир, к которому стоит стремиться: меньше одного процента сессий с падениями. Google Play считает приложение проблемным при превышении определённого порога и начинает понижать его в выдаче магазина, а на карточке появляется предупреждение для пользователей. То есть падения бьют не только по впечатлению, но и по установкам.
Достичь нуля невозможно: у части устройств экзотические прошивки, у части кончается память в момент запуска. Но разница между тремя процентами и половиной процента ощущается и в отзывах, и в возвратах пользователей.