1.前言
Android系统中,在app中进行一些操作时,系统中的ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会在app进行操作app时,
检测App的响应时间,如果App在特定时间无法响应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。
以下四个情况都可以造成ANR发生:
1.InputDispatching Timeout:在app进行操作时,在主线程中5秒内无法响应屏幕触摸事件或键盘输入事件
2.BroadcastQueue Timeout :在app内执行前台广播(BroadcastReceiver)的onReceive()函数时在主线程中10秒没有处理完成,后台为60秒。
3.Service Timeout :在系统Service的生命周期的函数中在特定时间内(前台服务20s,后台服务200s)在主线程中无法完成响应。
4.ContentProvider Timeout :ContentProvider的publish在主线程中在10s内没进行完。
(进程启动过程中,如果发生会直接杀进程以及清理相应信息,而不会弹出ANR的对话框)
接下来就来分析在主线程中InputDispatching造成阻塞输入无响应的分析
2.framework层app中InputDispatching造成的ANR原理分析的核心类
frameworks/native/services/inputflinger/InputDispatcher.cpp
frameworks/base/services/core/java/com/android/server/wm/WindowMana