目录
[-p <测试的包名列表>](#-p <测试的包名列表>)
[-v 显示日志详细程度](#-v 显示日志详细程度)
[-s 伪随机数生成器的种子值](#-s 伪随机数生成器的种子值)
[--throttle < 毫秒>](#--throttle < 毫秒>)
[--ignore-crashes 忽略崩溃](#--ignore-crashes 忽略崩溃)
[--ignore-timeouts 忽略超时](#--ignore-timeouts 忽略超时)
[--monitor-native-crashes 监视本地崩溃代码](#--monitor-native-crashes 监视本地崩溃代码)
[--ignore-security-exceptions 忽略安全异常](#--ignore-security-exceptions 忽略安全异常)
[--kill-process-after-error 发生错误停止运行并保持当前状态](#--kill-process-after-error 发生错误停止运行并保持当前状态)
[在日志中搜索 "ANR"](#在日志中搜索 “ANR”)
[崩溃问题搜索 "CRASH"](#崩溃问题搜索 “CRASH”)
[异常问题搜索 "Exception"](#异常问题搜索 “Exception”)
adb的操作命令格式一般为:adb shell monkey +命令参数
常用参数
-p <测试的包名列表>
用于约束限制,用此参数指定一个或多个包。指定包之后,Monkey将只允许系统启动指定的APP。如果不指定包,Monkey将允许系统启动设备中的所有APP。
不指定包:adb shell monkey 50
指定一个包执行50次:adb shell monkey -p 包名 50
指定多个包执行50次:adb shell monkey -p 包名1 -p 包名2 50
具体有哪些包名,可以通过adb shell,进入data/data/路径下,ls查看。
-v 显示日志详细程度
用于指定反馈信息级别(信息级别就是日志的详细程度),差异为-v的数量。总共分3个级别,分别对应的参数:
Level 0 : adb shell monkey -p 包名 -v 100 //默认级别,仅提供启动提示、测试完成和最终结果等少量信息
Level 1 : adb shell monkey -p 包名 -v -v 100 //提供较为详细的日志,包括每个发送到Activity的事件信息
Level 2 : adb shell monkey -p 包名 -v -v -v 100 //最详细的日志,包括了测试中选中/未选中的Activity信息
-s 伪随机数生成器的种子值
用于指定伪随机数生成器的seed值。如果使用相同的种子值重新运行Monkey,它将生成相同的事件序列,[-s 500 (事件序列) 1000(事件数)],例如:
test1:adb shell monkey -p com.youdao.dict -s 10 -v 100
test2:adb shell monkey -p com.youdao.dict -s 10 -v 100
--throttle < 毫秒>
在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被完成。
例如:adb shell monkey -p com.youdao.dict --throttle 200 50 //表示执行50个用户事件数,事件间隔为200毫秒
--ignore-crashes 忽略崩溃
当应用程序崩溃或发生任何失控异常时,Monkey将停止运行。如果设置此选项,即使应用程序崩溃,Monkey将继续向系统发送事件,直到事件计数完成。
例如:adb shell monkey -p com.youdao.dict --ignore-crashes 100 //测试过程中即使程序崩溃,Monkey依然会继续发送事件,直到事件数目达到100为止
--ignore-timeouts 忽略超时
当应用程序发生任何超时错误时(如"Application Not Responding"),Monkey将停止运行。如果设置此选项,即使应用程序发生ANR错误,Monkey将继续向系统发送事件,直到计数完成。
例如:adb shell monkey -p com.youdao.dict --ignore-timeouts 100 //测试过程中即使程序发生ANR错误,Monkey依然会继续发送事件,直到事件数目达到100为止
--monitor-native-crashes 监视本地崩溃代码
监视并报告Android系统中本地代码的崩溃事件。
例如:adb shell monkey -p com.youdao.dict --monitor-native-crashes 100 //原理同上
--ignore-security-exceptions 忽略安全异常
当应用程序发生许可错误时(如证书许可,网络许可等),Monkey将停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
例如:adb shell monkey -p com.youdao.dict --ignore-security-exceptions 100 //原理同上
--kill-process-after-error 发生错误停止运行并保持当前状态
当应用程序发生错误时,停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
例如:adb shell monkey -p com.youdao.dict --kill-process-after-error 100 //同上
--pct-事件类别+事件类别百分比
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)
操作事件简介
Monkey所执行的随机事件流中包含11大事件,分别是触摸(touch)、手势(motion)、缩放(pinchzoom)、轨迹(trackball)、屏幕旋转(rotation)、基本导航(nav)、主要导航(mojornav)、系统按键(syskeys)、Activity启动(appswitch)、键盘翻转(flip)、其他事件(anyevent)。Monkey通过这11大事件来模拟用户的常规操作,对手机App进行稳定性测试。
--pct-touch 触摸事件
--pct-motion 手势事件
--pct-pinchzoom 二指缩放事件
--pct-trackball 轨迹事件
--pct-rotation 屏幕旋转事件
--pct-nav 基本导航事件
--pct-majornav 主要导航事件
--pct-syskeys 系统按键事件
--pct-appswitch 启动activity事件
--pct-flip 键盘翻转事件
--pct-anyevent 其他类型事件
实例
adb shell monkey -p com.android.gallery3d -s 50 --ignore-crashes --ignore-timeouts --monitor-native-crashes --ignore-security-exceptions --kill-process-after-error --throttle 300 -v -v -v 10000 >D:\monkey_log\monkey_log.txt //将跑完monkey后写入到电脑D盘的指定目录下并生成一个文件
Monkey日志分析
正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
异常情况
Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
在日志中搜索 "ANR"
程序无响应的问题: 在日志中搜索 "ANR",ANR: Application Not Responding 应用程序无响应。ANR一般有以下三种类型:
1:KeyDispatchTimeout(5 seconds) --主要类型:按键或触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds):BroadcastReceiver在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) --小概率类型:Service在特定的时间内无法处理完成
此外当ANR问题发生后我们可以使用adb pull命令(此命令无需root权限)从被测设备的/data/anr目录下导出名为traces.txt的对应log文件。例子: adb pull /data/anr/traces*.txt > C:\
崩溃问题搜索 "CRASH"
异常问题搜索 "Exception"
(如果出现空指针, NullPointerException,需格外重视,肯定有bug)
下面的属于monkey自己的问题。不用管。
:Sending Flip keyboardOpen=false
Got IOException performing flipjava.io.IOException: write failed: EINVAL (Invalid argument)
// Injection Failed
内存泄露问题搜索"GC"(需进一步分析)
当手机提示Out of Memory(内存不足)时基本确定有内存泄露的问题。
当查看logcat时有GC字段,可能有内存泄露问题。
与GC相关的字段有如下四个:
GC_FOR_ALLOC 在分配内存时内存不够引发
GC_EXPLICIT 表明GC被显式请求触发的,如System.gc调用
GC_CONCURRENT, 表明GC在内存使用率达到一定的警戒值时,自动触发
GC_BEFORE_OOM, 表明在虚拟机抛出内存不够异常OOM之前,执行最后一次回收内存垃圾
当出现内存泄露问题时可以加上--hprof参数再执行一次monkey测试,便可获得对应的profiling报告。
adb shell monkey -p 包名 --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >c:\monkey.txt
如果指定了这个选项,monkey会在发送时间的前后生成app内存快照文件,一般会在手机设备的/data/misc目录下生成hprof的文件。(注: /data/misc 需要root权限,可以在手机上安装个RE查看或通过手机助手查看)
参考资料:
adb命令之monkey使用_adb monkey-CSDN博客
app压力测试(1)-------adbmonkey 报告分析_adb monkey app压测后文件怎么分析-CSDN博客