Android-Monkey解析(一)

Android-Monkey概要分析

1. 简介

  • 形式:命令行工具
  • 本质:Monkey是一个模拟器、设备上运行的程序
  • 用途:对开发的应用作压力测
  • 基本语法
    1
    adb shell monkey [options] <event-count>
  • 具体实例
    1
    adb shell monkey -p your.package.name -v 500

2. 能力

  1. 事件生成:Monkey可生成伪随机用户事件流(譬如轻触、点击、手势)和很多系统级事件
  2. 事件注入:Monkey将事件流发送到系统中
  3. 系统监控:应用崩溃、响应超时,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. 结构

4.1 文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
└── monkey
├── Logger.java
├── Monkey.java
├── MonkeyActivityEvent.java
├── MonkeyCommandEvent.java
├── MonkeyEvent.java
├── MonkeyEventQueue.java
├── MonkeyEventSource.java
├── MonkeyFlipEvent.java
├── MonkeyGetAppFrameRateEvent.java
├── MonkeyGetFrameRateEvent.java
├── MonkeyInstrumentationEvent.java
├── MonkeyKeyEvent.java
├── MonkeyMotionEvent.java
├── MonkeyNetworkMonitor.java
├── MonkeyNoopEvent.java
├── MonkeyPermissionEvent.java
├── MonkeyPermissionUtil.java
├── MonkeyPowerEvent.java
├── MonkeyRotationEvent.java
├── MonkeySourceNetwork.java
├── MonkeySourceNetworkVars.java
├── MonkeySourceNetworkViews.java
├── MonkeySourceRandom.java
├── MonkeySourceRandomScript.java
├── MonkeySourceScript.java
├── MonkeyThrottleEvent.java
├── MonkeyTouchEvent.java
├── MonkeyTrackballEvent.java
├── MonkeyUtils.java
├── MonkeyViewException.java
└── MonkeyWaitEvent.java

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
2
3
4
5
6
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Java 31 749 1571 4427
-------------------------------------------------------------------------------
SUM: 31 749 1571 4427
-------------------------------------------------------------------------------