Что такое ANR
Android фиксирует ANR, когда главный поток приложения (main thread) не может обработать входящее событие в отведённое время:
- Input event (нажатие кнопки, свайп) — таймаут 5 секунд
- Broadcast receiver — таймаут 10 секунд
- Service foreground start — таймаут 20 секунд
После таймаута система показывает пользователю диалог с выбором: подождать или принудительно закрыть приложение. Большинство выбирают закрыть.
Основные причины ANR в e-commerce приложениях
Сетевые запросы в main thread — самая частая причина. Запрос к API рекомендаций, каталога или авторизации, выполняемый синхронно в UI-потоке, блокирует его на всё время ожидания ответа сервера.
Тяжёлые операции с базой данных — синхронные запросы к SQLite или Room в UI-потоке при большом объёме данных (история заказов, кэш каталога).
Deadlock — два потока ожидают блокировок друг друга, блокируя в том числе main thread.
Инициализация SDK — некоторые сторонние SDK при инициализации выполняют дисковые или сетевые операции синхронно; вызов init() в main thread приводит к ANR.
Влияние на метрики и Google Play
Google Play отслеживает ANR rate через Android Vitals. Пороговое значение — 0.47% плохих сессий (сессий с хотя бы одним ANR). При превышении:
— Приложение помечается как «плохо работающее» в внутренних системах Google
— Может снизиться органическая видимость в поиске Play Store
— Play Console показывает предупреждение
Для e-commerce потеря органики в Play Store — прямой удар по установкам.
Как исправлять ANR
- Перенести все IO в background threads — Kotlin Coroutines, RxJava, ExecutorService
- Аудит SDK при старте — проверить, что init() не блокирует main thread
- StrictMode в debug-сборке — автоматически обнаруживает операции на main thread, которые должны быть в фоне
- Профилирование в Android Studio Profiler — найти, где именно main thread занят дольше допустимого
Совет: при интеграции новых SDK в e-commerce приложение всегда запускайте его с включённым StrictMode. Большинство ANR-проблем обнаруживается именно так — до того, как они попадут в продакшн.