参考:
疑难ANR原因分析-冻结导致直播讲解相关完整笔记_02-22 10:13:28.197 2302 3531 i windowmanager: anr -优快云博客
1.
分析过程:
anr一般问题可能是如下套路:
1、log看具体哪个进程哪个时间点anr,看看anr的类型
2、找到对应的anr的trace,看看anr对应主线程的是否有阻塞耗时等堆栈
上面方式确实对于应用自己原因耗时等引发anr确实够了,但是系统开发往往很多anr都没办法简单通过上述步骤找到原因,很可能trace中根本啥线索没有。
————————————————
找ANR发生时间点,看看啥原因ANR
02-18 20:08:25.283 485 577 I WindowManager: ANR in input window owned by pid=3930. Reason: Input dispatching timed out ([Gesture Monitor] Screenshot 0 (server) is not responding. Waited 5000ms for MotionEvent(deviceId=4, eventTime=39032316052000, source=TOUCHSCREEN | STYLUS | BLUETOOTH_STYLUS, displayId=0, action=MOVE, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=22.8, yPrecision=11.1, xCursorPosition=nan, yCursorPosition=nan, pointers=[0: (803.0, 1434.9)]), policyFlags=0x62000000)
日志可以看出ANR是在pid=3930,原因是因为MotionEvent在5秒前就已经发送,但是Gesture Monitor] Screenshot这个接受者根本没有响应导致,这里也打印表面原因就是Gesture Monitor] Screenshot没有响应导致的ANR,注意这里的
MotionEvent(deviceId=4, eventTime=39032316052000
这个事件的eventTime后续可以去InputDispatcher中进行追踪,看看啥时候派发的
2.2 针对这中无法得出anr结论的,anr查找到一般建议从源头出发开始查,比如inputDispatch相关的派发事件日志,这里正常情况下InputDispatcher没详细日志,因为比较频烦,所以这里需要自己手动开放一些InputDispatcher的相关日志:
————————————————
A.查看线程 和时间、原因
B .查看对应的
查看ANR时候派发的事件
MotionEvent(deviceId=4, eventTime=39032316052000
看看在InputDispatcher中是啥情况
C. 接受事件相关打印
如果有打印,那么这里大家也就很容易想到看看Gesture Monitor] Screenshot这个进程3930到底发生了什么,在这个02-18 20:08:20.276 时间点后,日志搜索后发现重大的线索:
D.关闭复现。