又到了轻松愉快的周末了,各位大盆友,此刻的你们是不是还在睡懒觉哇?今天想给大家分享一个很好用的自动化工具--monkey(猴子大人)。
~ monkey程序由android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar
~Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey
通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行测试。比如,Android的设备上面要是有休眠功能的话,咱们可以设置手机休眠功能为15秒,然后我们通过monkey(adb shell monkey -p android.chrome.com -v-v-v --throttle 16000 --pct-motion 50 --pct-syskeys 50 -s 12 100000 > d:\monkey_05.log)设定15秒或者16秒后点击一次,这样连续点击个一万次甚至更多来看看程序是否会发生异常。最后只要查看日志就好了。
首先,我们要搭建环境,只要下载一个jdk和sdk就可以了,具体的操作流程可以参考:
jdk:https://blog.csdn.net/write6/article/details/79136388
sdk:https://blog.csdn.net/u011541946/article/details/77142045
里面的博客写的很详细清晰的啦
其次,打开手机的开发者调试工具,用usb数据线l连接你的手机。
关于测试:
a, 运行cmd,打开dos窗口
![](/qrcode.jpg)
b, 执行adb devices, 查看连接的手机
c, 执行adb connect 手机IP, 连接手机
d, 执行adb shell 进入控制台
e, 执行adb shell monkey --help, 看是否掉同monkey工具文档,(如果提示,common not found,即找不到monkey工具,环境变量配置有问题,如果提示帮助文档信息,即可调用monkey)
对于一些重要的命令详解,希望大家都了解一下,经常用到的就记一下啦。
基础参数
-p <allowed-package-name> 指定一个包或多个包
-s <seed> 指定一个随机生成器的seed值
-v 指定反馈信息级别(日志之别的详细程度,可以支持3个-v)
-throttle <millseconds> 指定事件之间的固定延迟(ms)
-c <main-category> 指定一个或多个类别名
-f <scriptfile> 指定运行monkey脚本
事件参数(值得注意的是,所有的时间参数的总和不能大于100%)
--pct-touch <percent> 指定触摸事件百分比
--pct-motion <percent> 指定动作事件百分比
--pct-trackball <percent> 指定轨迹事件百分比
--pct-syskeys <percent> 指定系统按键事件百分比
--pct-nav <percent> 指定基本导航事件百分比
--pct-majornav <percent> 指定主要导航事件百分比
--pct-appswitch <percent> 指定应用启动事件百分比
--pct-flip <percent> 指定flip(弹)事件的百分比
--pct-anyevent <percent> 指定其他类型事件百分比
--pct-pinchzoom <percent> 指定缩放(捏)事件百分比
调试参数
--ignore-crashes 忽略因崩溃或异常引起的停止运行
--ignore-timeouts 忽略应用发生超时错误(ANR)
--ignore-security-exceptions 忽略应用发生任何权限错误
--monitor-native-crashes 监视并报告monkey运行时native code的崩溃事件
--ignore-native-crashes 忽略因native code的崩溃事件
--kill-process-after-error 在应用出错后通知系统杀死发生错误的进程
--hprof 在事件序列前后立即生成profilfing report
--dbg-no-events 监视应用程序所调用的包之间的转换
--wait-dbg 暂停执行中的monkey,直到有调试器与它连接
实战:
a,获取包名称
筛选包名称:adb shell dumpsyswindow w | findstr \/ | findstr name="PACKAGENAME"
b,组合参数驱动包名称进行
adb shell monkey -p PACKAGENAME -v -v -v --throttle 200 -s 1 --ignore-crashes --ignore-timeouts --ignore-native- crashes --pct-touch 30 100000 2>/Users/admin/Desktop/error.txt 1>/Users/admin/Desktop/info.txt
解释:
-p PACKAGENAME 对你的app包进行测试
-v -v -v 第一个-v:level0级别 日志输出,仅提供启动提示,测试完成和最终结果等少了信息
第二个-v:level1级别 日志输出,提供较详细的日志,包括每个发送到Activity的事件信息
第三个-v:level2级别 日志输出,最详细的日志,包括测试中选中或未选中的Acitvity信息
-s 1 伪随机数生成seed值,值为1 ,相同seed值再次执行monkey,讲产生相同的时间操作(场景多用于复现bug)
--throttle 200 事件间隔200毫秒
--ignore-crashes 忽略应用程序崩溃,继续往下执行直到结束
--ignore-timeouts 忽略应用程序发送的ANR错误,继续往下执行直到结束
--ignore-native-crashes 忽略Android native-code引起的崩溃,继续往下执行直到结束
--pct-touch 30 模拟触摸事件占比30%
100000 模拟执行10万次
2>Users/admin/Desktop/error.txt Level2级别日志保存到error.txt日志文件
1>/Users/admin/Desktop/info.txt Level1级别日志保存到info.txt日志文件
注意:以上命令,操作事件只占权重百分比的30%,还可以继续添加其他事件,看事件情况,模拟事件可以指定多个,但权重不得超过100%
常会用的命令:
获取activity:adb shell dumpsys activity | findstr “mResume”
查看本机所有包:adb shell pm list package -f
查看本机所有的包:adb shell pm list packages
查看第三方的安装包:adb shell pm list package -3
查找系统所有包:adb shell pm list package -s
查看启动包中搜索包:adb shell pm list packages -e “packagename”
获取当前打开的包:adb shell dumpsys window | findstr mCurrentFocus
(前面的为包名,斜杠后面的是当前启动的acivity)
在执行向下滑动的命令时,打开了通知栏,然后又开始了瞎点的操作。这时可在执行monkey命令之前,先执行禁用通知栏的命令
禁用:adb shell settings put global policy_control immersive.full=*
解禁:adb shell settings put global policy_control null
最后咱们再看一下日志分析吧 :
4.1 在日志中搜索关键字:
a.搜索报告中的关键字“ANR”,看有无应用无响应的事件(Application Not Responding)
b.搜索报告中的关键字“crash”,看有无崩溃的事件
c.搜索报告中的关键字“exception”,看有无其他异常事件。(如果出现空指针, NullPointerException,需格外重视)
d.内存泄露问题搜索"GC"(需进一步分析)
4.2 初步分析法:
a.先找到出现错误的位置
b.查看出现错误之前2个switch之间的activity
c.手动执行事件,复现问题
d.若以上步骤还不能找出,产生错误时,有会seed值,输入相同的seed值,重新按照之前命令跑monkey。还有就是时间后面的权重不能超过100,不然monkey跑不起来。
4.3 详细分析法:
a.ANR问题:在日志中搜索“ANR”(“Application Not Responding"),说明有bug,出现ANR,一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。这个就是一个比较严重的缺陷。把耗时的操作另起线程来处理就可以了。
b.分析log中的具体信息:查看log中第一个Switch,主要是查看Monkey执行的是那一个Activity,譬如下面的log中,执行的是com.tencent.smtt.SplashActivity,在下一个swtich之间的,如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
c.内存泄漏
c1:内存泄漏弹出out of memory对话框
c2:对于有内存泄漏但是没有单出out of memory对话框的情况,可以通过logcat文件GC出信息,(GC:java的垃圾回收机制)
GC_FOR_ALLOC: 因为在分配内存时候内存不够引起的
GC_EXPLICIT 表明GC被显式请求触发的,如System.gc调用,
GC_CONCCURRENT: 表明GC在内存使用率达到一定的警戒值时候,自动触发
GC_BEFORE_OOM 表明在虚拟机抛出内存不够异常oom之前,执行最后一次回收内存垃圾
c3:发现内存泄露--内存报告分析(利用hprof参数的内存快照生成内存报告,在发现内存泄露后,可以执行相同的monkey,只需多加一个参数--hprof
最后,给大家送一张图:
其实讲到这里,monkey工具的用法其实都讲完了,就看你怎么实操了。如何把用例写好,或者想到更好的用例,然后通过monkey命令的形式去进行测试。有更好的建议欢迎大家留言。