1.12 ANR场景与触发流程

less than 1 minute read

1.12.1 ANR场景

* Service Timeout, 20S无响应
* BroadcastQueue Timeout, 10S未执行完成
* InputDispatching Timeout, 输入5秒无响应

1.12.2 Service触发流程

* 执行`Service#onCreate()`,调用`bumpServiceExecutingLocked()` -> `mAm.mHandler.sendMessageAtTime()`发送超时消息
* `ActivityThread#handleCreateService()`, 调用`Service#onCreate()`后调用`mAm.mHandler#removeMessage()`移除ANR消息
* `ActivityManagerService.MainHandler#handleMessage()`接受到ANR消息 -> `ActiveService#serviceTimeout()` -> `mAm.appNotResponding()`

1.12.3 BroadcastReceiver触发流程

* `BroadcastprocessNextBroadcat()` -> `setBroadcatTimeout()` -> `mHandler#sendMessageAtTime(BROADCAST_TIMEOUT_MSG)`
* `performReceiveLocked()`处理广播消息完成后, 调用`mHandlerMessages(BROADCAST_TIMEOUT_MSG)`, 移除广播超时消息
* `BroadcastHandler#handleMessage()` -> `mService#appNotResponding()`

1.12.4 ContentProvider触发流程

* `ActivityManager#attachApplicationLocked()` -> `mHandler#sendMessageDelayed(msg, CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG)`
* `ActivityManager#publishContentProviders()` -> `mHandler#removeMessages(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG)`移除ANR消息
* `ActivityManagerService#MainHandler` -> `ActivityManagerService#appNotResponding()`处理ANR