adb monkey
1)PC端已安装adb环境及做好配置
注:需要安装JDK、Android SDK并分别进行环境变量配置(此不为本次重点,不提供安装细则,可以参考本文档底部提供的参阅文件)
2)对adb命令和monkey有一定的了解
3)手机端已安装对应测试app,本文将以ownbank为例
4)测试前需要将android机(测试手机)的顶部状态栏进行屏蔽——目前通过开发隐藏或adb命令隐藏的还是可以同过下拉显示出来
当下前端开发未能实现客户端顶部状态栏永久隐藏。
1.将 Android 设备和 adb
主机(PC)连接到同一个 WiFi 网络
是否设置代理为可选操作,当前设置代理是为了方便抓包查看接口的请求情况)。
2.Android 设备需要把开发者工具-允许调试功能打开
3.使用USB数据线连接Android 设备和 adb
主机(PC)
建议使用USB,稳定性测试掉电速度很快、方便充电,同时方便不通过其他配置打开Android Studio就可以捕获日志。如果只是短时间操作,均可以选择远程连接设备。
4.打开cmd窗口或PowerShell命令窗口并确认调试包
当前使用PowerShell:
> adb devices #查看已连接的设备 List of devices attached R5CR205QY8R device > adb shell pm list packages -3 | findstr xxx #查询包名包含“xxx”字符的第三方安装包/对应测试包,当前没有安装 > adb install -r -t D:\download\XXX_V1.1.90_20230215-common-stability_test.apk #安装测试包 Performing Streamed Install Success > adb shell pm list packages -3 | findstr ownbank #再次查询,确认包名 package:com.finance.ownbank.dev > |
5.monkey命令执行
> adb shell monkey -p com.xxx.dev -v - v - v --throttle 3 -s 1000 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt |
当前操作说明:
指令 | 说明 |
---|
-p com.xxx.dev | 对包名为com.finance.ownbank.dev的app应用进行测试,如需要指定多个包,使用命令: adb shell monkey -p com.finance.ownbank.dev -p 其他包名 |
-v -v -v | 指定日志的级别(即日志详细程度) |
--throttle 3 | 延时3毫秒,单位是毫秒 |
-s 1000 | 随机数种子,用于指定伪随机数生成的seed值,如果seed值相同则两次monkey测试所生成的时间序列也相同,建议使用,方便复现和回归测试 |
--ignore-crashes | 忽略闪退或崩溃,继续发送执行事件、直到事件数执行完成 |
--ignore-timeouts | 忽略超时导致的异常(如ANR),继续发送执行事件、直到事件数执行完成 |
--ignore-native-crashes | 忽略native-code引起的崩溃,继续发送执行事件、直到事件数执行完成 |
10000000 | 执行10000000次事件 |
1>C:\Users\panpj\2023022021_info.txt | 把level 1的日志保存到C:\Users\panpj\2023022021_info.txt |
2>C:\Users\panpj\2023022021_info.txt | 把level 2的日志保存到C:\Users\panpj\2023022021_info.txt |
monkey参数说明:
—— | 参数 | 说明 |
---|
基本参数 | -p <allowed-package-name> | 指定一个或多个包 |
---|
-s <seed> | 指定一个随机数生成器的seed值 |
--throttle <milliseconds> | 指定事件之间的固定延迟(ms) |
-v | 指定反馈信息级别(信息级别就是日志的详细程度),最多3个级别: -v //缺省值,仅提供启动提示、测试完成和最终结果等的少量信息 -v -v //较为详细的日志,包含每个Activity的事件信息 -v -v -v //最详细的日志 |
-c <main-category> | 指定一个或多个类别名 |
-f <scriptfile> | 运行指定的monkey脚本 |
事件参数 | --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> | 指定缩放(捏)事件百分比 |
--pct-permission <percent> | 指定permission事件百分比,默认是0 |
调试参数 | --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报告 |
--dbg-no-events | 监视应用程序所调用的包之间的转换 |
--wait-dbg | 暂停执行中的monkey,直到有调试器与它连接 |
1.日志开头

解析命令信息,包括被执行的测试包、指令操作次数及其他参数信息等。

2.日志结尾

指令操作次数、耗时,命令操作结束标识语“Monkey finished”。
3.日志内容分析
事件 | 关键字 | 备注 |
---|
程序无响应 | ANR | Application Not Responding |
程序崩溃 | CRASH | 一般日志体现为“Exception”或“Error”,常见: 1)NullPointerException:空指针异常 2)SQLException:操作数据库异常类 3)ClassCastException:类型转换异常 4)NumberFormatException:数值转化异常 5)ClassNotFoundException:指定的类不存在 6)ArithmeticException:数学运算异常,如程序中出现了除以零等 7)ArrayIndexOutOfBoundsException:数组越界异常 8)IllegalArgumentException:方法的参数错误 9)IllegalAccessException:没有类访问权限 10)ArrayStoreException:错误对象存储到数组 11)FileNotFoundException:文件未找到 12)IndexOutOfBoundsException:下标越界异常 13)ActivityNotFoundException Activity:未找到异常 14)IllegalStateException:非法状态异常 15)SecurityException 安全异常 16)StackOverflowError:堆栈异常错误 17)OutOfMemoryError:内存溢出错误 |
其他问题 | Exception meninfo | 同上可能导致崩溃的Exception,可以通过“Exception”关键字进行搜索, meninfo关注是否存在OOM |
Monkey执行的Activity | Switch | 一般通过Switch确认异常所在的Activity位置 |
可以通过关键字对采集的日志进行搜索、通过PowerShell或cmd命令窗口或android studio的日志输出进行确认,可以结合抓包工具、kibana等日志进一步确认业务请求的情况。
注:Android Studio切换日志等级后,日志就会被清空,建议慎用该功能。
4.问题重现
1)通过日志确认出错前的事件操作、手动执行复现;
2)按照原来的操作场景重新执行对应含seed值的命令进行复现。
monkey复现之seed值
使用-s参数来指定命令执行的seed值
Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。
用于指定伪随机数生成器的 seed 值,如果 seed 相同,则两次 monkey 测试所产生的事件序列也相同的。
monkey 测试1:adb shell monkey -p com.kaiyuan.developmentbusiness –s 10 100
monkey 测试2:adb shell monkey -p com.kaiyuan.developmentbusiness –s 10 100
两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;
稳定性测试过程中APP端没有出现ANR、Crash和任意Exception及OOM等情况(含日志),以及不存在业务请求的异常、客户端操作的异常等。
-
执行命令参考
测试人员可以结合以上指令根据需要进行测试:
adb shell monkey -p com.xx.dev - v - v - v --throttle 3 -s 1 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt adb shell monkey -p com.xxx.dev -v - v - v --throttle 3 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 20 --pct-motion 20 --pct-flip 20 --pct-pinchzoom 20 --pct-trackball 20 500000 1>C:\Users\panpj\20230222-info_02.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 20 --pct-motion 20 --pct-flip 20 --pct-pinchzoom 20 --pct-trackball 20 -s 100 500000 1>C:\Users\panpj\20230222-info_02.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 50 --pct-motion 50 50000 1>C:\Users\panpj\20230222-info_05.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 50 --pct-motion 50 50000 1>C:\Users\panpj\20230222-info_05.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 50 --pct-motion 50 -s 500000000 500000000 1>C:\Users\panpj\20230222-info.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 100 -s 50000 50000000 1>C:\Users\panpj\20230228-info.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 100 -s 50000 50000000 1>C:\Users\panpj\2023022819-info.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v -s 50000 50000000 1>C:\Users\panpj\20230301-info.txt adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 100 -s 500 50000 2>C:\Users\panpj\2023030220-info.txt -- 不同事件操作 # 触摸事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct- touch 100 -s 500 5000 2>C:\Users\panpj\2023030709- touch -info.txt # 动作事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-motion 100 -s 500 5000 2>C:\Users\panpj\2023030715-motion-info.txt # 轨迹事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-trackball 100 -s 500 5000 2>C:\Users\panpj\202303071501-trackball-info.txt # 系统按键事件(音量调节等) adb shell monkey -p com.xxx.dev--ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-syskeys 100 -s 500 5000 2>C:\Users\panpj\202303071502-syskeys-info.txt # 基本导航事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-nav 100 -s 500 5000 2>C:\Users\panpj\202303071507-nav-info.txt # 主要导航事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-majornav 100 -s 500 5000 2>C:\Users\panpj\202303071514-majornav-info.txt # 应用启动事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-appswitch 100 -s 500 5000 2>C:\Users\panpj\202303071515-appswitch-info.txt # flip(弹)事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-flip 100 -s 500 5000 2>C:\Users\panpj\202303071516-flip-info.txt # 其他类型事件 adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-anyevent 100 -s 500 5000 2>C:\Users\panpj\202303071516-anyevent-info.txt # 缩放(捏)事件(含有输入) adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-pinchzoom 100 -s 500 5000 2>C:\Users\panpj\2023030719-pinchzoom-info.txt # permission事件(没看到什么操作) adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes -v - v - v --pct-permission 100 -s 500 5000 2>C:\Users\panpj\202303071527-permission-info.txt |
firebase监控到的异常:----这个平台监控的数据不够精准,有发现顶部统计数据不对齐的情况以及客户端获取到崩溃但是这里没有捕获到的情况
1.adb命令--远程连接设备
> adb devices #查看已连接的设备,当前没有连接设备 List of devices attached > adb tcpip 5555 #打开adb连接设备的端口,需要先使用数据线将PC跟测试手机进行连接 restarting in TCP mode port: 5555 > adb connect 10.10.24.73 #连接手机ip地址(关于手机-状态信息-IP地址 或 连接-WiFi-已连接的wifi-IP地址),无线连接 connected to 10.10.24.73:5555 > adb devices #再次查看已连接的设备,设备连接成功,以下两个都是同一个手机设备,一个是数据线连接的、一个是无线连接,此时可以把PC跟测试手机连接的数据线断开,避免因不能识别命令具体是针对哪个设备进行而影响后面操作 List of devices attached R5CR205QY8R device 10.10.24.73:5555 device > adb devices #拔掉数据线后,再次查看已连接的设备,当前断开数据线是为了方便在暴力操作情况下的耗电情况,如果稳定性测试的时间很长、不建议通过ip+端口进行连接 List of devices attached 10.10.24.73:5555 device |
2.adb命令--隐藏状态栏相关
> adb shell settings put global policy_control immersive.full=* #隐藏状态栏和虚拟键 > adb shell settings put global policy_control immersive.status=* #仅隐藏状态栏 > adb shell settings put global policy_control immersive.navigation=* #仅隐藏虚拟键 > adb shell settings put global policy_control null #恢复状态栏和虚拟键 > adb shell o1q:/ $ service call statusbar 1 // 下拉显示命令行 Result: Parcel(00000000 '....' ) o1q:/ $ service call statusbar 2 // 收缩状态栏 Result: Parcel(00000000 '....' ) |
3.Android studio的性能分析面板
APP性能测试时可以结合该监控进行相关指标确认,有兴趣可以拓展学习下Android studio相关功能。

可参阅文档:
1、adb基本介绍:Android 调试桥 (adb)
2、adb环境安装:adb环境配置详细
3、monkey的基本介绍和用法:UI/Application Exerciser Monkey