Что такое 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

  1. Перенести все IO в background threads — Kotlin Coroutines, RxJava, ExecutorService
  2. Аудит SDK при старте — проверить, что init() не блокирует main thread
  3. StrictMode в debug-сборке — автоматически обнаруживает операции на main thread, которые должны быть в фоне
  4. Профилирование в Android Studio Profiler — найти, где именно main thread занят дольше допустимого

Совет: при интеграции новых SDK в e-commerce приложение всегда запускайте его с включённым StrictMode. Большинство ANR-проблем обнаруживается именно так — до того, как они попадут в продакшн.