背景:
有给大家布置相关的分析疑难ANR:no focused window相关的作业:
如何分析疑难ANR:no focused window?-学员课程笔记
当然大家如果学习了马哥的wms相关课程,也可以不看笔记,直接用下面的anr相关的日志进行实战分析看看是否可以分析出这个anr问题:
https://share.weiyun.com/utw4FyrT ----logcat日志
https://share.weiyun.com/kmITqC4X ----dumpsys window的日志输出
实战讲解视频:
https://www.bilibili.com/video/BV1TQnSzWEqv/
讲解过程中相关笔记
1、events日志和InputDispatcher日志确定anr时间点
am_anr日志

查看InputDispatcher
12:30:03.965 时间点开始派发发现没有no focus window
过了将近5s后
12:30:08.968 时间点就爆出了ANR
所以am_anr日志看到的时间点正确是anr真实发生时间。
2、查看input_focus相关日志,确定大概anr出现的范围,应该重点排查哪些模块
正常的Activity启动对于焦点这部分
明显看到有
先有新窗口Focus request,再有上一个窗口的Focus leaving,最后有新窗口的Focus entering
但是日志中看看新窗口相关的日志
明显发现新窗口既没有Focus request,也没有新窗口的Focus entering。
那么这里就可以基本上断定这个anr肯定是出现在wms层面,而且排查范围要缩小在Focus request这个日志前面的流程
3、查询详细的proto相关的日志,寻找直接原因
按照wms课程讲解相关方法:
先看Looking for相关的日志,这里主要关注remotesubmix.MainActivity这个窗口的
03-14 12:30:10.831 13693 26871 V WindowManager: Looking for focus: Window{57382a5 u0 com.example.remotesubmix/com.example.remotesubmix.MainActivity}, flags=-2122252024, canReceive=false, reason=fromTouch= false isVisibleRequestedOrAdding=true mViewVisibility=0 mRemoveOnExit=false flags=-2122252024 appWindowsAreFocusable=true canReceiveTouchInput=true displayIsOnTop=true displayIsTrusted=true transitShouldKeepFocus=false
可以看到都为false,自然就不会有上面的Focus request,那么为啥这里的canReceive=false,日志也有打印reason
reason=fromTouch= false isVisibleRequestedOrAdding=true mViewVisibility=0 mRemoveOnExit=false flags=-2122252024 appWindowsAreFocusable=true canReceiveTouchInput=true displayIsOnTop=true displayIsTrusted=true transitShouldKeepFocus=false
但是直接看好像你也不知道具体原因一般需要对比看,这里找个正常可以focus窗口进行对比。
4、找到直接原因后,通过与正常可以获取焦点的activity进行对比,得出根本原因
找个电话的Activity进行对比
电话的日志,他是 canReceive=true
03-14 12:29:53.316 13693 18457 V WindowManager: Looking for focus: Window{856e3b1 u0 com.android.dialer/com.android.dialer.main.impl.MainActivity}, flags=-2122252032, canReceive=true, reason=fromTouch= false isVisibleRequestedOrAdding=true mViewVisibility=0 mRemoveOnExit=false flags=-2122252032 appWindowsAreFocusable=true canReceiveTouchInput=true displayIsOnTop=true displayIsTrusted=true transitShouldKeepFocus=false
拿这里正常的reason和上面异常reason进行对比,发现就一个flag参数有差异,其他的参数都一样。
电话Activity正常的flag
flags=-2122252032
remotesubmix.MainActivity异常无法focus的flag:
flags=-2122252024
再结合代码:
那么就清楚了,其实就是flag中带了FLAG_NOT_FOCUSABLE这个标志,当然就不可以成为focus的window。
5、验证找出的根本原因是否正确,结合dump window进行验证
验证确实发现ANR的Activity窗口的flag是fl=NOT_FOCUSABLE ,所以这个anr可以确诊为属于app自身设置了NOT_FOCUSABLE的flag。
查看源码确实是这样设置的:



被折叠的 条评论
为什么被折叠?



