Monkey介绍
Monkey程序由Android系统自带,是Android SDK提供的一个命令行工具, 可运行Android模拟器和实体设备上。Monkey会发送伪随机的用户事件流,通过Monkey程序模拟用户触摸屏幕、滑动、 按键等操作来对程序进行压力测试,检测多长时间发生异常、会Crash、以及内存泄露检测可称为随机测试或稳定性测试。
Monkey 命令启动方式:
a)可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试
b)在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试
c ) 在Android机或者模拟器上直接执行monkey 命令,可以在Android机上安装Android终端模拟器
Monkey框架
Monkey命令基本参数
-p
用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果丌指定包, monkey将允许系统启动设备中的所有app。
指定一个包:adb shell monkey -p com.shjt.map 100
指定多个包:adb shell monkey -p fishjoy.control.menu –p com.shjt.map 100
-v
用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下 表所示:
Level 0 : adb shell monkey -p com.shjt.map -v 100 // 缺省值,仅提供启动提示、测试完成和最终结果等少量信息
Level 1 : adb shell monkey -p com.shjt.map -v -v 100 // 提供较为详细的日志,包括每个发送到Activity的事件信息
Level 2 : adb shell monkey -p com.shjt.map -v -v -v 100 // 最详细的日志,包括了测试中选中/未选中的Activity信息
—s随机数种子(没有指定此值会默认生成一个seed)
用亍指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例:
monkey测试1:adb shell monkey -p com.shjt.map –s 10 100
monkey测试2:adb shell monkey -p com.shjt.map –s 10 100
—throttle毫秒
每个事件的间隔时间3000毫秒
例:adb shell monkey -p com.shjt.map --throttle 3000 100
实时测试
1、配好sdk、adb环境
2、手机连接电脑,开启开发者模式和调试模式
3、adb devices查看设备连接情况
4、进入要测试的app,查看包名
adb shell dumpsys window | findstr mCurrentFocus
adb shell dumpsys window w |findstr \/ |findstr name=
5、向app发送一些事件
向app发送10个随机事件,adb shell monkey -p com.rabbit.doctor -v 10 仅提供启动提示、测试完成和最终结果等少量信息
向app发送10个随机事件,adb shell monkey -p com.rabbit.doctor -v -v 10 提供较为详细的日志,包括每个发送到Activity的事件信息
向app发送10个随机事件,adb shell monkey -p com.docrab.pro -v -v -v 10 最详细的日志,包括了测试中选中/未选中的Activity信息
指定一个seed值-s 10,相同的seed值执行的操作相同 adb shell monkey -p com.rabbit.doctor -v -s 10 10
向app发送100个随机事件,每个事件间隔3秒 adb shell monkey -p com.docrab.pro --throttle 3000 -v -v -v 50
向app发送10个随机事件,并保存至路径下adb shell monkey -p com.rabbit.doctor -v 10 >c:\monkeylog.txt
向指定设备device压测 adb -s emulator-5554 shell monkey -p your.www.com -v 500 -s 加 device emulator-5554
6、测试结果展示
C:\Windows\system32>adb shell monkey -p com.docrab.pro -v 100 //p表示指定测试程序,v表示monkey生成的详细随机事件名,100事件数
:Monkey: seed=1510018290134 count=100 //开始未指定时,随机生成的seed值
:AllowPackage: com.docrab.pro //包名
: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: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0% //表示跳转到com.example.android.apis 里面的ApiDemos这一个Activity里。
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.docrab.pro/com.squareup.leakcanary.internal.DisplayLeakActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.docrab.pro/com.squareup.leakcanary.internal.DisplayLeakActivity } in package com.docrab.pro
:Sending Touch (ACTION_DOWN): 0:(501.0,218.0)
// Injection Failed
:Sending Touch (ACTION_UP): 0:(492.16553,221.75143)
// Injection Failed
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-4.0) //发送的一些动作,如点击按下,点击放开,移动。
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
:Sending Touch (ACTION_DOWN): 0:(462.0,51.0)
:Sending Touch (ACTION_UP): 0:(377.56924,0.0)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-1.0)
:Sending Touch (ACTION_DOWN): 0:(451.0,1139.0)
:Sending Touch (ACTION_UP): 0:(445.72433,1140.6277)
:Sending Touch (ACTION_DOWN): 0:(717.0,464.0)
:Sending Touch (ACTION_UP): 0:(720.0,483.52737)
:Sending Trackball (ACTION_MOVE): 0:(-4.0,3.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
:Sending Touch (ACTION_DOWN): 0:(684.0,69.0)
:Sending Touch (ACTION_UP): 0:(691.5189,169.68057)
:Sending Touch (ACTION_DOWN): 0:(376.0,1005.0)
:Sending Touch (ACTION_UP): 0:(382.10815,1030.8892)
Events injected: 100 //完成次数
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=2 trackballs=0 flips=0 rotations=0 //丢弃的,键=0,指针=2,轨迹球=0,翻转=0。
## Network stats: elapsed time=327ms (0ms mobile, 0ms wifi, 327ms not connected) //花费时间
// Monkey finished //完成
Monkey日志分析
1、正常情况, 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
2、异常情况
Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
1. 程序无响应的问题: 在日志中搜索 “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:\
3、异常问题搜索 “Exception”(如果出现空指针, NullPointerException,需格外重视,肯定有bug)。
4、内存泄露问题搜索"GC"(需进一步分析)
1、当手机提示Out of Memory(内存不足)时基本确定有内存泄露的问题。
2、当查看logcat时有GC字段,可能有内存泄露问题。
与GC相关的字段有如下四个:
GC_FOR_ALLOC 在分配内存时内存不够引发
GC_EXPLICIT 表明GC被显式请求触发的,如System.gc调用
GC_CONCURRENT, 表明GC在内存使用率达到一定的警戒值时,自动触发
GC_BEFORE_OOM, 表明在虚拟机抛出内存不够异常OOM之前,执行最后一次回收内存垃圾
当出现内存泄露问题时可以加上--hprof参数再执行一次monkey测试,便可获得对应的profiling报告。
如果指定了这个选项,monkey会在发送时间的前后生成app内存快照文件,一般会在手机设备的/data/misc目录下生成hprof的文件。【/data/misc 需要root权限,可以在手机上安装个RE查看或通过手机助手查看
BUG实例1:
BUG实例2:
adb指令:
关闭adb服务 adb kill-server
开启adb服务 adb start-server
上传文件:
adb push <本地文件><远程路径> 例:adb push d:\3.txt storage/sdcard
下载文件:
adb pull <远程路径><本地路径> 例:adb pull storage/sdcard/3.txt d:\
输出调试的信息:adb bugreport
android list targets #显示系统中全部android平台
adb install -r 应用程序.apk #安装apk程序
adb push D:Test.apk/syste/app/ #安装apk程序
adb push D:file.txt/system/temp/ #向手机写入文件
adb pull /system/temp/ D:file.txt #从手机获取文件
adb logcat #查看日志
adb logcat | find "com.rabbit.doctor" >c:\hello.txt #记录日志到电脑上
adb logcat -v time > d:/sss.log #当前日志输出到d盘的sss.log中
打印日志保存下来
adb logcat | find "com.koubeigongzuo.ck" >C:/logg.txt
实时监控对应app日志
adb logcat | find "com.koubeigongzuo.ck"
实时监控对应app报错日志
adb logcat *:E | find "com.koubeigongzuo.ck"
显示所有优先级大于等于错误(Error)的日志
adb logcat *:E
显示所有优先级大于等于严重错误的日志
adb logcat *:F
查看安卓版本号
adb shell pm dump com.koubeigongzuo.ck | findstr "versionName
apk的应用信息、版本信息
adb shell dumpsys package com.koubeigongzuo.ck
获取应用执行时的内存等相关信息
adb shell dumpsys meminfo com.koubeigongzuo.ck
点击
adb shell input tap 250 250
滑动
adb shell input swipe 250 250 300 300