手把手分析no focused window疑难ANR详细视频+笔记-千里马实战wms专题课程

背景:

有给大家布置相关的分析疑难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。
查看源码确实是这样设置的:

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值