检测弹窗与蒙层的方法

背景

弹窗的分为系统级别的弹窗和应用内的。

系统弹窗 一般有几种,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

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171211G02M1W00?refer=cp_1026

扫码关注云+社区