Android-Monkey解析(一)
Android-Monkey概要分析
1. 简介
- 形式:命令行工具
- 本质:Monkey是一个模拟器、设备上运行的程序
- 用途:对开发的应用作压力测
- 基本语法
1
adb shell monkey [options] <event-count>
- 具体实例
1
adb shell monkey -p your.package.name -v 500
2. 能力
- 事件生成:Monkey可生成伪随机用户事件流(譬如轻触、点击、手势)和很多系统级事件
- 事件注入:Monkey将事件流发送到系统中
- 系统监控:应用崩溃、响应超时,Monkey会停止并报告错误
3. 选项
基于Monkey命令行选项,分析功能和使用状况。
类型 | 选项 | 功能 | 使用 |
---|---|---|---|
常规参数 | -help | 输出使用指南 | 常用 |
-v | 指定反馈信息级别,即日志详细程度,共三级,使用多级时,需要多次使用-v | 常用 | 事件 | -s | 指定伪随机数生成器的seed值,如果seed值相同,则两次monkey测试产生的事件序列也相同 | 常用 |
--throttle | 指定注入事件间的时延间隔,单位ms;如果未指定,则不延迟,系统会尽快地生成事件;常见为300ms | 常用 | |
--pct-touch | 调整轻触事件所占百分比(屏幕上单个位置上按下、释放事件) | 常用 | |
--pct-motion | 调整滑动事件所占百分比(屏幕上某个位置按下、一系列伪随机滑动动作、释放事件) | 常用 | |
--pct-trackball | 调整轨迹球事件所占百分比(一个或多个随机动作,有时会触发点击) | 不常用 | |
--pct-syskeys | 调整系统按键事件所占百分比(预留系统使用:主屏幕、返回、发起通话、结束通话、音量控制,百分比较小) | 不常用 | |
--pct-nav | 调整基本导航事件所占百分比(输入设备的上、下、左、右作为方向) | 不常用 | |
--pct-majornav | 调整主要导航事件所占百分比(5-way键盘的菜单键、中间键、回退键) | 不常用 | |
--pct-appswitch | 调整Activity启动事件所占百分比(以最大限度覆盖软件包中所有Activity) | 不常用 | |
--pct-flip | 调整键盘按键事件所占百分比(与键盘相关操作,如点击输入框键盘弹起、点击输入框外侧键盘回收) | 不常用 | |
--pct-anyevent | 调整其他类型事件所占百分比(包括所有其他类型事件:按键、不常用按钮等,不常用) | 不常用 | |
--pct-pinchzoom | 调整缩放事件所占百分比(模拟进行放大缩小操作:两处同时按下、同时移动、同时抬起) | 常用 | |
--pct-permission | 调整权限事件所占百分比(待分析) | 常用 | |
约束 | -p | 指定一个或多个app包,不使用时默认允许启动所有app | 常用 |
-c | 指定一个或多个类别,不使用时选择Intent.CATEGORY_LAUNCHER或Intent.GATEGORY_MONKEY类别所列的Activity | 不常用 | |
调试 | --dbg-no-events | 将初始启动到测试Activity,但不会生成任何事件 | 不常用 |
--hprof | 在Monkey事件序列之前和之后立即生成分析报告,将在/data/misc下生成大型(约5M)文件 | 不常用 | |
--ignore-crashes | 应用发生崩溃或异常时,Monkey将忽略并继续发事件给系统,直至事件计数结束 | 常用 | |
--ignore-timeouts | 应用程序发生超时错误时,Monkey将忽略并继续发事件给系统,直至事件计数结束 | 常用 | |
--ignore-security-exceptions | 应用程序发生权限错误导致异常时,Monkey将忽略并继续发事件给系统,直至事件计数结束 | 常用 | |
--kill-process-after-error | 当Monkey由于应用程序出错停止时,将通知系统停止发生错误的进程(PS:正常结束并不会停止已启动的进程,设备会停留在最后状态) | 不常用 | |
--monitor-native-crashes | 监视并上报系统原生代码中发生的崩溃,可配合--kill-process-after-error选项使用 | 不常用 | |
--wait-dbg | 阻止Monkey执行,直到为其连接了调试程序 | 不常用 | |
COUNT | 次数 | 常用 | |
脚本 | -setup | 执行单个脚本 | 常用 |
-f | 多次调用,执行多个脚本 | 常用 | |
--port | 连接服务器,执行TCP从连接服务器中获取的Monkey脚本 | 常用 | |
--randomize-script | 执行随机Monkey脚本,需要和-f一起使用 | 常用 | |
名单 | --pkg-blacklist-file | 白名单列表 | 不常用 |
--pkg-whitelist-file | 黑名单列表 | 不常用 |
4.1 文件结构
1 | └── monkey |
4.2 事件类型
classDiagram class MonkeyEvent{ } class MonkeyKeyEvent{ } class MonkeyMotionEvent{ } class MonkeyTouchEvent{ } class MonkeyTrackballEvent{ } class MonkeyRotationEvent{ } class MonkeyActivityEvent{ } class MonkeyFlipEvent{ } class MonkeyThrottleEvent{ } class MonkeyPermissionEvent{ } class MonkeyNoopEvent{ } MonkeyEvent <-- MonkeyKeyEvent MonkeyEvent <-- MonkeyMotionEvent MonkeyEvent <-- MonkeyRotationEvent MonkeyEvent <-- MonkeyActivityEvent MonkeyEvent <-- MonkeyFlipEvent MonkeyEvent <-- MonkeyThrottleEvent MonkeyEvent <-- MonkeyPermissionEvent MonkeyEvent <-- MonkeyNoopEvent MonkeyMotionEvent <-- MonkeyTouchEvent MonkeyMotionEvent <-- MonkeyTrackballEvent
MonkeyEvent基类中定义:
- 9种事件类型参数:
- 常用事件:Key事件、Touch事件、Rotation事件、Permission事件、Noop事件
- 不常用事件:Trackball事件、Activity事件、Flip事件、Throttle事件、
- 4种执行结果参数:
- 正常执行:Success、Fail
- 异常返回:Remote Exception、Security Exception
- 3种方法:
injectEvent(IWindowManager iwm, IActivityManager iam, int verbose)
:依赖WMS、AMS,进行事件注入isThrottlable()
:判断事件是否需要做延迟getEventType()
:获取当前事件类型
4.3 事件
5. 代码统计
1 | Language files blank comment code |
相关文章