ANR в Android-е, как он появляется под капотом?

Ответ: 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, и прерывает процесс

5. AMS создаёт ANR отчёт

Если приложение не отвечает в срок:

  • AMS вызывает appNotResponding()
  • собирается traces.txt со стеком всех потоков
  • сохраняется в /data/anr/
  • показывается UI-диалог: «Приложение не отвечает. Подождать/Закрыть»

Опубликовано

в

от

Метки: