背景
弹窗的分为系统级别的弹窗和应用内的。
系统弹窗 一般有几种,ANR的弹窗,APP crash的弹窗,各种权限弹窗。用户弹窗比较多的是dialog,或者是fragment dialog,最麻烦的就是各种新手引导,新手引导一般是半透明的,图像匹配和处理都有点麻烦。
分析
adb shell 检测弹窗或者蒙层,考虑这个问题有两种思路
蒙层
考虑从View Hierarchy,需要分析
View Hierarchy的日志中,越往下,就是越顶层。
i,蒙层的显示与关闭就一个一个visibile和gone的区别 :(
举个例子
ii,通过检测有没有对应的控件挂载,这个通过diff就可以看得出来
弹窗
i,有弹窗的话,必然会增加window,在WindowManagerService中必然有备案
在我的测试中是最有效的,一般一个activity中有子弹窗
如果是权限弹窗(permission)的话,需要检测permission的的packageIntall的window。当然各种系统的弹窗都可以抓。
ii,surfaceflinger渲染过程中必然会增加一层或多层layer
可以抓叠加层,如果是系统级别的crash的话,那么layer上可以看出变化
Activity 当作弹窗
这个是蛮蛋疼的一种实现,目的应该是为了随时随地弹窗。想到两种解决办法:
i,检查下最顶层的activity是什么,在脚本中做处理。
ii,查看window中的大小,没有铺满全屏的话,就是Activity当Dialog使用了
检测的思路
i,每个tap,click执行前都注入一下检查,提供callback
ii,提供关注关键词的方法,让开发者在某个页面关注某个view,或者某个window的叠加
iii,在gui部分提供更便利的检测方法,分析这些出来的东西有点工作量的
实现
完整代码放在
https://github.com/wuyisheng/ATX
领取专属 10元无门槛券
私享最新 技术干货