Ответ: 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-диалог: «Приложение не отвечает. Подождать/Закрыть»