Monkey 入门指南
操作步骤:
第一步:进入链接https://www.androiddevtools.cn/#,下载下图中的包
第二步:解压压缩包
1.2配置环境变量
操作步骤:
第一步:右击我的电脑,查看属性,然后在弹出的界面点击“高级系统设置”
第二步:点击“环境变量”
第三步:找到path,点击编辑按钮
第四步:点击新建,添加platform-tools的路径到环境变量,如下图所示
第五步:点击确定按钮并退出
1.3环境验证
1.3.1adb环境验证
操作步骤:
第一步:打开cmd,输入adb
第二步:输入adb monkey
1.3.2连接真机
使用前提:
1 手机是可以正常使用的
2 使用的数据线必须是可以传输数据的(比如:购买充电宝所赠送的数据线只可以充电,不支持数据传输)
操作步骤:
第一步:usb刚连手机时会有弹窗“是否允许访问手机数据”,点击允许,打开通知导航栏,会显示“使用usb传输文件”,如果不是,则手动选择;
第二步:打开开发者选项中的允许usb调试,安卓各机型开启开发者选项的方式不同,可根据自己的机型百度。
第三步:在cmd中输入adb devices,如果显示出设备名称,则连接真机成功;
1.3.3连接模拟器
下载地址:https://www.yeshen.com/pg/yeshen
安装完之后的使用步骤如下:
第一步:打开夜神多开器
第二步:点击“添加模拟器”,设置不同的安卓系统版本
第三步:启动模拟器
第四步:在cmd下使用adb devices 验证模拟器是否可用
Monkey是Android中的一个命令行工具,通过Monkey程序模拟用户触摸屏幕、滑动、按键等操作来对应用程序进行压力测试,检测程序多久的时间会发生异常。
Monkey测试,所有的事件都是随机产生的,不带任何人的主观性。monkey测试有以下三个特点:
第一、测试的对象仅为应用程序包,有一定的局限性。
第二、Monky测试使用的事件数据流是随机的,不能进行自定义。
第三、可对MonkeyTest的对象,事件数量,类型,频率等进行设置。
用法:adb shell monkey -p package.name -v times
分析:
-p表示对象包
–v 表示日志级别
package.name 表示apk的包名
times 表示运行次数
实例:
运行方法一:在cmd下直接运行monkey命令:
adb shell monkey -p com.youdao.calculator -v 10
运行方法二:
adb shell
monkey -p com.youdao.calculator -v 10
备注:使用exit可以退出adb shell
备注:使用时推荐把monkey日志保存下来,日志保存参考4.1
aapt是sdk自带的一个工具,在sdk\builds-tools\目录下,本例子以xsteach.apk包为例子。
操作步骤:
第一步:在sdk\builds-tools\目录下进入cmd窗口
第二步:在cmd下运行aapt dump badging D:\apktools\xsteach.apk
第三步:找到apk的包名:com.xsteach.appedu
Apktools下载地址:
链接:https://pan.baidu.com/s/1bxEpXLicpw3MKFhPqJX_gw
提取码:76cv
下载完直接使用,操作步骤如下:
步骤一:在apktools目录下打开cmd
步骤二:在cmd下运行aapt dump badging xsteach.apk
步骤三:找到apk的包名:com.xsteach.appedu
我们可以使用adb shell monkey -help 查看monkey有哪些命令参数,如果下图所示:
用于约束限制,用此参数指定一个或多个包(Package,即App)。指定包之后,monkey将只允许系统启动指定的APP,如果不指定包,将允许系统启动设备中的所有APP.
* 指定一个包: adb shell monkey -p com.android.calendar 10
* 指定多个包:adb shell monkey -p com.android.calendar –p com.baidu.browser.apps -p com.tencent.wstt.gt 100
* 不指定包:adb shell monkey 100
用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下表所示:
日志级别 Level0
示例 adb shell monkey -p com.android.calendar –v 10
说明缺省值,仅提供启动提示、测试完成和最终结果等少量信息
日志级别 Level 1
示例 adb shell monkey -p com.android.calendar –v -v 10
说明提供较为详细的日志,包括每个发送到Activity的事件信息
日志级别 Level 2
示例 adb shell monkey -p com.android.calendar –v -v –v 10
说明最详细的日志,包括了测试中选中/未选中的Activity信息
用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。
Monkey 测试1:adb shell monkey -p com.android.calendar -s 10 100
Monkey 测试2:adb shell monkey -p com.android.calendar –s 10 100
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。
用于指定用户操作(即事件)间的时延,单位是毫秒;
adb shell monkey -p com.android.calendar --throttle 2000 10
备注:每隔2s执行一个随机流时间,方便定位分析可能是在哪个屏幕出现crash
11种事件:触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动Activity事件、键盘事件、其他类型事件。
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比)
示例:
--pct-touch{+百分比}
调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)
adb shell monkey -p com.android.calenda --pct-touch 10 100
--pct-motion {+百分比}
调整手势事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随件机事和一个up事件组成)
adb shell monkey -p com.youdao.calculator --pct-motion 20 10
--pct-pinchzoom {+百分比}
调整二指缩放事件的百分比(二指缩放事件即智能机上的放大缩小手势操作)
adb shell monkey -p com.youdao.calculator --pct-pinchzoom 30 10
--pct-trackball {+百分比}
调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
adb shell monkey -p com.youdao.calculator --pct-trackball 30 10
--pct-rotation {+百分比}
调整屏幕旋转事件的百分比(横屏和竖屏)
adb shell monkey -p com.youdao.calculator --pct-rotation 40 10
--pct-nav {+百分比}
调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
adb shell monkey -p com.youdao.calculator --pct-nav 40 10
--pct-majornav {+百分比}
调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)
adb shell monkey -p com.youdao.calculator --pct-majornav 50 10
--pct-syskeys {+百分比}
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)
adb shell monkey -p com.youdao.calculator --pct-syskeys 50 10
--pct-appswitch {+百分比}
调整启动Activity的百分比(在随机间隔里,Monkey通过调用startActivity方法最大限度地开启该package下的全部Activity的一种方法)
adb shell monkey -p com.youdao.calculator --pct-appswitch 50 10
--pct-flip {+百分比}
调整键盘事件的百分比(键盘事件如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等)
adb shell monkey -p com.youdao.calculator --pct-flip 50 10
--pct-anyevent {+百分比}
调整其他类型事件的百分比(包罗了所有其他类型的时间,如按键、其他不常用的设备按钮等)
adb shell monkey -p com.youdao.calculator --pct-anyevent 50 10
通过调试类命令,可以对Monkey进行一些简单的调试,可以快速定位Monkey执行过程中的一些问题。如果用户想监控应用程序所调用的包之间的转换,则可以用 –dbg-no-events参数;如果用户想监控内存泄露,可以用—hprof参数。
设置此选项,Monkey将执行初始启动,进入一个测试Activity,不会再进一步生成事件。为了得到最佳结果,把它与-v、一个或几个包约束,以及一个保持Monkey运行30秒或更长事件的非零值联合起来,从而提供一个可以监视应用程序所调用的包之间的转换的环境
将在事件执行之前和执行之后生成内存快照文件存放在手机的data/misc目录。通过对比执行前后的内存快照文件,可以协助定位内存泄露问题。由于内存快照文件比较大,所有要小心使用。
用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行。如果使用此参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数完成。
adb shell monkey -p com.youdao.calculatorr --ignore-crashes 10
测试过程中即使程序崩溃,Monkey依然会继续发送事件直到事件数目达到10为止
adb shell monkey -p com.youdao.calculator 10
测试过程中,如果app程序崩溃,Monkey将会停止运行
用于指定当应用程序发生超时错误,如ANR(Application No Responding)错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
adb shell monkey -p com.youdao.calculator --ignore-timeouts 10
用于指定当应用程序发生许可错误时(如证书许可,网络许可等),Monkey是否停止运行。如果使用此参数,即使应用程序发生许可错误,Monkey依然会发送事件,直到事件计数完成。
adb shell monkey -p com.youdao.calculator --ignore-security-exceptions 10
用于指定当应用程序发生错误时,是否停止其运行。
当Monkey由于一个错误而停止时,出错的app将继续处于运行状态。
如果指定此参数,Monkey将会通知系统停止发生错误的进程。
(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
adb shell monkey -p com.youdao.calculator --kill-process-after-error 10
用于指定是否监视并报告应用程序发生崩溃的本地代码。
adb shell monkey -p com.youdao.calculator --monitor-native-crashes 10
停止执行中的Monkey,直到有调试器和它相连接
限制Monkey不测试于指定黑名单文档中记录的包。
若没有指定这个参数,Monkey将执行系统内所有的包。
限制Monkey只测试于指定白名单文档中记录的包。
若没有指定这个参数,Monkey将执行系统内所有的包。
指定Monkey执行用户自定义的脚本文件
adb shell monkey -p com.youdao.calculator -v 100 >>d:\monkeylog.txt
-p :对象包
包名:com.youdao.calculator
-v :日志级别
运行次数:1000
第一步:在cmd下使用adb shell
第二步:monkey -p com.youdao.calculator -v 1000 > /mnt/sdcard/monkeylog.txt
-p :对象包
包名:com.youdao.calculator
-v :日志级别
运行次数:1000
第一步:在cmd下使用adb shell
第二步:monkey -p com.youdao.calculator -v 1000 > /mnt/sdcard/monkeylog.txt > /sdcard/error.txt
-p :对象包
包名:com.youdao.calculator
-v :日志级别
运行次数:1000
#测试的命令信息
Events injected: 100
## Network stats: elapsed time=1186ms (0ms mobile, 0ms wifi, 1186ms not connected)
#随机种子值,执行事件数量
:Monkey: seed=1568209983751 count=100
#运行的应用
:AllowPackage: com.youdao.calculator
#Category包含LAUNCHER和MONKEY
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
#各事件百分比
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: 25.0%
// 6: 15.0%
// 7: 2.0%
// 8: 2.0%
// 9: 1.0%
// 10: 13.0%
#启动app事件
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.calculator/.activities.MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.calculator/.activities.MainActivity } in package com.youdao.calculator
#具体执行的动作、以及坐标位置
:Sending Touch (ACTION_DOWN): 0:(655.0,235.0)
:Sending Touch (ACTION_UP): 0:(623.27386,154.98427)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,4.0)
:Sending Touch (ACTION_DOWN): 0:(240.0,402.0)
:Sending Touch (ACTION_UP): 0:(219.07697,402.69543)
无
4.2.4.1 判断成功
//执行的事件数量
Events injected: 100000
//旋转的角度为0
:Sending rotation degree=0, persist=false
//丢失的事件数量
:Dropped: keys=0 pointers=160 trackballs=0 flips=0 rotations=0
//网络状态(移动网0ms,wifi网络0ms,未连接359261ms)
## Network stats: elapsed time=359261ms (0ms mobile, 0ms wifi, 359261ms not connected)
// Monkey finished
4.2.4.2 判断失败
//显示Monkey执行失败
** Monkey aborted due to error.
//执行的事件数量
Events injected: 190
//丢失的事件数量
:Dropped: keys=0 pointers=11 trackballs=0 flips=0
//网络状态
## Network stats: elapsed time=27954ms (27954ms mobile, 0ms wifi, 0ms not connected)
//提示在执行到第190个事件时出现崩溃,用的种子随机数是0
** System appears to have crashed at event 190 of 200 using seed 0
如果在执行monkey的过程中,出现Crash or ANR,error.txt中会显示错误日志。
五、如何重现异常
排查步骤:
第一步:通过monkey找到是app的哪个模块出错(推荐使用延时参数throttle,这样可以肉眼看到在哪个界面出现crash)
第二步:查看Monkey里面出错前的一些事件动作,并手动执行该动作
第三步:若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样,方便重现
一般的测试结果分析:
1、ANR问题:在日志中搜索“ANR”
2、崩溃问题:在日志中搜索“Exception” Force Close
Crash关键字 |
Crash原因 |
java.lang.NullPointerException |
空指针异常 |
java.lang.ArrayIndexOutofBoundsException |
数组溢出 |
java.lang.ClassNotFoundException |
类不存在 |
java.lang.ArithmeticException |
数学运算异常 |
java.lang.IllegalArgumentException |
方法参数异常 |
java.io.FileNotFoundException |
文件未找到 |
java.lang.NumberFormatException |
数值转化异常 |
java.lang.StackOverflowError |
堆栈异常错误 |
java.lang.OutOfMemoryError |
内存溢出错误 |