既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
*/
@Override
public int appEarlyNotResponding(String s, int i, String s1) throws RemoteException {
return 0;
}
/**
* 应用产生ANR时回调此方法,
* Return 0 时显示 "应用停止响应" 弹窗。
* Return 1 时不做任何操作,等待应用恢复正常;
* Return -1 时结束产生ANR的应用.
*/
@Override
public int appNotResponding(String processName, int pid,
String processStats) throws RemoteException {
return -1;
}
/**
* 系统停止响应时回调此方法,可以在这个方法里面对设备进行些恢复工作
*/
@Override
public int systemNotResponding(String msg) throws RemoteException {
return 0;
}
};
**进程变化监听**
由于ActivityController服务存在被干扰的情况,我们需要其他服务进行辅助判断,通过ActivityManager注册IProcessObserver可以获取进程变化的回调,特别是在onForegroundActivitiesChanged方法内可以判断是否触发页面切换。
**通过IProcessObserver可以实现的功能:**
\*\*①. \*\*在onForegroundActivitiesChanged方法内监听页面变化;
\*\*②. \*\*在onProcessStateChanged和onProcessDied方法内可以统计App的线程生命周期;
\*\*③. \*\*可以统计app运行期间创建的线程信息;
\*\*④. \*\*该服务被不同进程注册时,相互间互不影响;
**缺点:**
\*\*①. \*\*没有直观信息,需要使用uid进行关联,处理复杂;
IProcessObserver mProcessObserver = new IProcessObserver.Stub() {
//与用户交互的Activity发生变化时foregroundActivities为true,否则foregroundActivities为false
//uid产生该活动的应用标识,可以用包信息匹配到具体的应用
//pid 当前活动的线程/进城ID
@Override
public void onForegroundActivitiesChanged(int pid, int uid,
boolean foregroundActivities) throws RemoteException {
if(foregroundActivities) {
//
}
}
//活动状态发生变化时调用,在此方案内实际意义不大
@Override
public void onProcessStateChanged(int pid, int uid, int importance)
throws RemoteException {
}
//结束时调用
@Override
public void onProcessDied(int pid, int uid) throws RemoteException {
}
};
**综合应用**
**上面两种方案各有优劣,我们可以将他们整合在一个流程内实现较为完善的截图机制:**
**①.** 首先我们的服务主要依赖于ActivityController进行页面变化的感知,以便于获取详细的信息和精确控制;
\*\*②. \*\*我们注册IProcessObserver进行辅助验证,当页面发生变化时我们进行截屏,并通过ActivityController最后一次接收事件的时间判断其服务状态,如果服务状态异常,那么我们重新注册ActivityController服务;
\*\*③. \*\*开始监控页面时我们初始化一个定时器,可以定时(2S)截取屏幕,将当前截图Bitmap与上一次的截图Bitmap做图像匹配,如果图片相似度小于0.8,那么可以认定页面发生了变化,如果5S内没有保存过页面信息,那么需要重新初始化ActivityController服务。
**Root设备的特殊方案**
Android系统是基于Linux系统的移动操作系统。它们可以通过getevent命令输出键盘和屏幕事件,包括响应事件的坐标区域和键盘key值。但是Android系统基于安全考虑,大部分真机系统是没有权限执行getevent命令的,它不会输出任何有效信息,但是华为手机(荣耀20 i)上却可以正常使用。这是一个非常危险的权限,大家自己的手机还是不要开启开发者模式了!
/dev/input/event2: EV_ABS ABS_MT_POSITION_X 0000024b
/dev/input/event2: EV_ABS ABS_MT_POSITION_Y 0000065d
/dev/input/event2: EV_ABS ABS_MT_PRESSURE 000000f5
/dev/input/event2: EV_ABS ABS_MT_TRACKING_ID 00000000
/dev/input/event2: EV_ABS ABS_MT_TOUCH_MAJOR 000000a5
/dev/input/event2: EV_ABS ABS_MT_TOUCH_MINOR 00000087
/dev/input/event2: EV_ABS ABS_MT_ORIENTATION ffffffc6
/dev/input/event2: EV_ABS ABS_MT_BLOB_ID 00000002
/dev/input/event2: EV_SYN SYN_MT_REPORT 00000000
/dev/input/event2: EV_KEY BTN_TOUCH DOWN
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_ABS ABS_MT_POSITION_X 0000024b
/dev/input/event2: EV_ABS ABS_MT_POSITION_Y 0000065c
/dev/input/event2: EV_ABS ABS_MT_PRESSURE 00000067
/dev/input/event2: EV_ABS ABS_MT_TRACKING_ID 00000000
/dev/input/event2: EV_ABS ABS_MT_TOUCH_MAJOR 000000b4
/dev/input/event2: EV_ABS ABS_MT_TOUCH_MINOR 000000a5
/dev/input/event2: EV_ABS ABS_MT_ORIENTATION ffffffc1
/dev/input/event2: EV_ABS ABS_MT_BLOB_ID 00000002
/dev/input/event2: EV_SYN SYN_MT_REPORT 00000000
/dev/input/event2: EV_SYN SYN_REPORT 00000000
/dev/input/event2: EV_SYN SYN_MT_REPORT 00000000
/dev/input/event2: EV_KEY BTN_TOUCH UP
/dev/input/event2: EV_SYN SYN_REPORT 00000000
\*\*ABS\_MT\_POSITION\_X \*\*屏幕的横坐标,后面一列是坐标的十六进制数据
\*\*ABS\_MT\_POSITION\_Y \*\*屏幕纵坐标,后面一列是坐标的十六进制数据
**BTN\_TOUCH** 代表屏幕事件,后面如果是DOWN则代表按下,后面如果是UP代表抬起
我们可以根据ABS\_MT\_POSITION\_X和ABS\_MT\_POSITION\_Y信息和BTN\_TOUCH为DOWN的事件计算响应按下事件的屏幕位置,然后通过BTN\_TOUCH为UP的事件计算抬起的屏幕位置,然后用按下和抬起的坐标差来判断该时间是点击还是滑动,然后我们可以进行屏幕截图,甚至在截图上绘制事件的轨迹。
**最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:**


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618608311)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**