Ответ: ANR — это системная ошибка, которая возникает, когда приложение не отвечает в течение установленного времени.
По умолчанию:
- 5 секунд блокировки UI потока
- 10 секунд для
BroadcastReceiver
- 20 секунд для
Service
Как это происходит внутри Android?
1. ActivityManagerService (AMS) следит за responsiveness
- Все события (
startActivity
,broadcast
,service
) проходят черезActivityManagerService
(в System Server)
2. InputDispatcher отправляет событие в приложение
- Когда пользователь тапает экран —
InputDispatcher
(в native-сервере input’ов) передаёт событие в UI-поток процесса приложения через Binder
3. Looper main/UI thread должен быстро обработать событие
- Если UI-поток занят (например, долгий
onCreate()
,onDraw()
,onTouch()
илиBroadcastReceiver
) — он не успевает отчитаться системе, что жив
4. Watchdog следит, чтобы ответ был в срок
- В
system_server
работаетWatchdog
-тред, который:- следит за состоянием всех handler’ов (
AMS
,WMS
, и пр.) - если что-то не отвечает → пишет ANR, делает
dropbox
,tombstone
, и прерывает процесс
- следит за состоянием всех handler’ов (
5. AMS создаёт ANR отчёт
Если приложение не отвечает в срок:
- AMS вызывает
appNotResponding()
- собирается
traces.txt
со стеком всех потоков - сохраняется в
/data/anr/
- показывается UI-диалог: «Приложение не отвечает. Подождать/Закрыть»