Что такое ANR (Application Not Responding)
Что проверяют
Понимаете ли вы, что ANR это не «приложение тормозит», а конкретный вердикт системы, и знаете ли, за что именно он выносится. Дальше почти всегда идёт вопрос про диагностику: где брать трейс и как отличить блокировку главного потока от взаимоблокировки или зависшего вызова в чужой процесс.
Как отвечать
Система следит не за скоростью, а за отзывчивостью главного потока. ANR показывается, когда приложение слишком долго не обрабатывает ввод (порядка пяти секунд), не завершает onReceive у широковещательного приёмника, не поднимает сервис за отведённое время или не отвечает из ContentProvider.
Причины: сеть, диск или база в главном потоке; разбор больших ответов; тяжёлый onCreate или onBindViewHolder; блокирующее ожидание через runBlocking, join или synchronized на главном потоке; взаимоблокировка; синхронный вызов в чужой процесс, который сам подвис.
Чем лечат: вынести работу в фоновые диспетчеры корутин, отложенное и гарантированное отдать WorkManager, не блокировать главный поток ожиданием результата, разгрузить старт экрана. AsyncTask сейчас не предлагают, он устарел.
Диагностика: файл трейсов ANR со стеками всех потоков, ApplicationExitInfo в современных версиях, StrictMode в отладочной сборке ловит диск и сеть в главном потоке, профилировщик и метрики магазина показывают, на каких устройствах это массово.
Где спотыкаются
Называют порог в пять секунд единственным. Порогов несколько, и на практике часто срабатывает не ввод, а приёмник или старт сервиса, где времени отведено больше, но и работа тяжелее.
Считают, что достаточно завернуть всё в корутину. Корутина на главном диспетчере занимает тот же поток, а runBlocking внутри обработчика нажатия даёт ровно тот же ANR.
Смотрят в трейсе только на свой стек. В файле есть стеки всех потоков, и ответ обычно там: главный поток стоит на мониторе, который держит фоновый.