我们查看官方文档,表里只给出了8种事件(可以看我上篇的翻译文档)。但我们运行Monkey后,却发现有11种事件!最坑爹的是,在每种事件的百分比后面,他还不给注明是什么事件!

原来不同的Android SDK中的Event percentages种类数和顺序是不一样的!

我们可以查看android-4.2.2_r1.2中的MonkeySourceRandom.java中定义的这些值:

  1. public static final int FACTOR_TOUCH        = 0;
  2. public static final int FACTOR_MOTION       = 1;
  3. public static final int FACTOR_PINCHZOOM    = 2;
  4. public static final int FACTOR_TRACKBALL    = 3;
  5. public static final int FACTOR_ROTATION     = 4;
  6. public static final int FACTOR_NAV          = 5;
  7. public static final int FACTOR_MAJORNAV     = 6;
  8. public static final int FACTOR_SYSOPS       = 7;
  9. public static final int FACTOR_APPSWITCH    = 8;
  10. public static final int FACTOR_FLIP         = 9;
  11. public static final int FACTOR_ANYTHING     = 10;
  12. public static final int FACTORZ_COUNT       = 11;    // should be last+1
  13. private static final int GESTURE_TAP = 0;
  14. private static final int GESTURE_DRAG = 1;
  15. private static final int GESTURE_PINCH_OR_ZOOM = 2;

然后再来看Monkey.java源码中的processOptions()方法

  1. private boolean processOptions() {
  2. // quick (throwaway) check for unadorned command
  3. if (mArgs.length < 1) {
  4. showUsage();
  5. return false;
  6. }
  7. try {
  8. String opt;
  9. while ((opt = nextOption()) != null) {
  10. if (opt.equals("-s")) {
  11. mSeed = nextOptionLong("Seed");
  12. } else if (opt.equals("-p")) {
  13. mValidPackages.add(nextOptionData());
  14. } else if (opt.equals("-c")) {
  15. mMainCategories.add(nextOptionData());
  16. } else if (opt.equals("-v")) {
  17. mVerbose += 1;
  18. } else if (opt.equals("--ignore-crashes")) {
  19. mIgnoreCrashes = true;
  20. } else if (opt.equals("--ignore-timeouts")) {
  21. mIgnoreTimeouts = true;
  22. } else if (opt.equals("--ignore-security-exceptions")) {
  23. mIgnoreSecurityExceptions = true;
  24. } else if (opt.equals("--monitor-native-crashes")) {
  25. mMonitorNativeCrashes = true;
  26. } else if (opt.equals("--ignore-native-crashes")) {
  27. mIgnoreNativeCrashes = true;
  28. } else if (opt.equals("--kill-process-after-error")) {
  29. mKillProcessAfterError = true;
  30. } else if (opt.equals("--hprof")) {
  31. mGenerateHprof = true;
  32. } else if (opt.equals("--pct-touch")) {
  33. int i = MonkeySourceRandom.FACTOR_TOUCH;
  34. mFactors[i] = -nextOptionLong("touch events percentage");
  35. } else if (opt.equals("--pct-motion")) {
  36. int i = MonkeySourceRandom.FACTOR_MOTION;
  37. mFactors[i] = -nextOptionLong("motion events percentage");
  38. } else if (opt.equals("--pct-trackball")) {
  39. int i = MonkeySourceRandom.FACTOR_TRACKBALL;
  40. mFactors[i] = -nextOptionLong("trackball events percentage");
  41. } else if (opt.equals("--pct-rotation")) {
  42. int i = MonkeySourceRandom.FACTOR_ROTATION;
  43. mFactors[i] = -nextOptionLong("screen rotation events percentage");
  44. } else if (opt.equals("--pct-syskeys")) {
  45. int i = MonkeySourceRandom.FACTOR_SYSOPS;
  46. mFactors[i] = -nextOptionLong("system (key) operations percentage");
  47. } else if (opt.equals("--pct-nav")) {
  48. int i = MonkeySourceRandom.FACTOR_NAV;
  49. mFactors[i] = -nextOptionLong("nav events percentage");
  50. } else if (opt.equals("--pct-majornav")) {
  51. int i = MonkeySourceRandom.FACTOR_MAJORNAV;
  52. mFactors[i] = -nextOptionLong("major nav events percentage");
  53. } else if (opt.equals("--pct-appswitch")) {
  54. int i = MonkeySourceRandom.FACTOR_APPSWITCH;
  55. mFactors[i] = -nextOptionLong("app switch events percentage");
  56. } else if (opt.equals("--pct-flip")) {
  57. int i = MonkeySourceRandom.FACTOR_FLIP;
  58. mFactors[i] = -nextOptionLong("keyboard flip percentage");
  59. } else if (opt.equals("--pct-anyevent")) {
  60. int i = MonkeySourceRandom.FACTOR_ANYTHING;
  61. mFactors[i] = -nextOptionLong("any events percentage");
  62. } else if (opt.equals("--pct-pinchzoom")) {
  63. int i = MonkeySourceRandom.FACTOR_PINCHZOOM;
  64. mFactors[i] = -nextOptionLong("pinch zoom events percentage");
  65. } else if (opt.equals("--pkg-blacklist-file")) {
  66. mPkgBlacklistFile = nextOptionData();
  67. } else if (opt.equals("--pkg-whitelist-file")) {
  68. mPkgWhitelistFile = nextOptionData();
  69. } else if (opt.equals("--throttle")) {
  70. mThrottle = nextOptionLong("delay (in milliseconds) to wait between events");
  71. } else if (opt.equals("--randomize-throttle")) {
  72. mRandomizeThrottle = true;
  73. } else if (opt.equals("--wait-dbg")) {
  74. // do nothing - it's caught at the very start of run()
  75. } else if (opt.equals("--dbg-no-events")) {
  76. mSendNoEvents = true;
  77. } else if (opt.equals("--port")) {
  78. mServerPort = (int) nextOptionLong("Server port to listen on for commands");
  79. } else if (opt.equals("--setup")) {
  80. mSetupFileName = nextOptionData();
  81. } else if (opt.equals("-f")) {
  82. mScriptFileNames.add(nextOptionData());
  83. } else if (opt.equals("--profile-wait")) {
  84. mProfileWaitTime = nextOptionLong("Profile delay" +
  85. " (in milliseconds) to wait between user action");
  86. } else if (opt.equals("--device-sleep-time")) {
  87. mDeviceSleepTime = nextOptionLong("Device sleep time" +
  88. "(in milliseconds)");
  89. } else if (opt.equals("--randomize-script")) {
  90. mRandomizeScript = true;
  91. } else if (opt.equals("--script-log")) {
  92. mScriptLog = true;
  93. } else if (opt.equals("--bugreport")) {
  94. mRequestBugreport = true;
  95. } else if (opt.equals("--periodic-bugreport")){
  96. mGetPeriodicBugreport = true;
  97. mBugreportFrequency = nextOptionLong("Number of iterations");
  98. } else if (opt.equals("-h")) {
  99. showUsage();
  100. return false;
  101. } else {
  102. System.err.println("** Error: Unknown option: " + opt);
  103. showUsage();
  104. return false;
  105. }
  106. }
  107. } catch (RuntimeException ex) {
  108. System.err.println("** Error: " + ex.toString());
  109. showUsage();
  110. return false;
  111. }
  112. // If a server port hasn't been specified, we need to specify
  113. // a count
  114. if (mServerPort == -1) {
  115. String countStr = nextArg();
  116. if (countStr == null) {
  117. System.err.println("** Error: Count not specified");
  118. showUsage();
  119. return false;
  120. }
  121. try {
  122. mCount = Integer.parseInt(countStr);
  123. } catch (NumberFormatException e) {
  124. System.err.println("** Error: Count is not a number");
  125. showUsage();
  126. return false;
  127. }
  128. }
  129. return true;
  130. }

所以,Monkey运行结果中对应的就应该是:

0:--pct-touch//touch
events percentage触摸事件百分比(触摸事件是一个在屏幕单一位置的按下-抬起事件)

1:--pct-motion//motion
events percentage手势事件百分比(手势事件是由一个在屏幕某处的按下事件、一系列的伪随机移动、一个抬起事件组成)即一个滑动操作,但是是直线的,不能拐弯

2:--pct-pinchzoom//pinch
zoom events percentage二指缩放百分比,即智能机上的放大缩小手势操作

3:--pct-trackball//trackball
events percentage轨迹球事件百分比(轨迹球事件包括一个或多个随机移动,有时还伴有点击。轨迹球现在智能手机上已经没有了,就是类似手柄的方向键一样)

4:--pct-rotation//screen
rotation events percentage屏幕旋转百分比,横屏竖屏

5:--pct-nav//nav
events percentage”基本”导航事件百分比(导航事件包括上下左右,如方向输入设备的输入)老手机的上下左右键,智能机上没有

6:--pct-majornav//major
nav events percentage”主要”导航事件百分比(这些导航事件通常会引发UI的事件,例如5-way pad的中间键、回退键、菜单键)

7:--pct-syskeys//system(key)
operations percentage”系统”按钮事件百分比(这些按钮一般专供系统使用,如Home, Back, Start Call, End Call,音量控制)

8:--pct-appswitch//app
switch events percentage启动activity事件百分比。在随机的间隔里,Monkey会执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法

9:--pct-flip//keyboard
flip percentage键盘轻弹百分比,如点击输入框,键盘弹起,点击输入框以外区域,键盘收回

10:--pct-anyevent//anyevents
percentage其他类型事件百分比。包括了其他所有的类型事件,如按键、其他不常用的设备上的按钮等等。

参考:

http://blog.csdn.net/jlminghui/article/details/42261307

http://blog.csdn.net/jlminghui/article/details/42268187
源码:

https://code.google.com/p/android-source-browsing/source/browse/cmds/monkey/src/com/android/commands/monkey/Monkey.java?repo=platform--development&name=android-4.2.2_r1.2

Monkey日志信息的11种Event percentages的更多相关文章

  1. [信息收集]11种绕过CDN查找真实IP方法【转载】

    今天在看一些有关CDN的文章的时候,发现一篇写的蛮好的文章,故转载过来. 原文链接:https://www.cnblogs.com/qiudabai/p/9763739.html 0x01 验证是否存 ...

  2. C#添加错误日志信息

    错误日志是软件用来记录运行时出错信息的文本文件.编程人员和维护人员等可以利用错误日志对系统进行调试和维护. 系统日志 系统日志包含了由Windows系统组件记录的事件.例如,在启动期间装入驱动程序或其 ...

  3. Monkey测试:日志信息分析

    在跑monkey时,我们需要将日志输出到文件,然后对日志信息进行分析. 一.输出日志到文件 在monkey命令后加>文件地址 如:adb shell monkey 1000>E:/text ...

  4. Monkey框架(测试方法篇) - monkey日志分析

    Monkey日志分析是Monkey测试中非常重要的一个环节,通过日志分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题.介绍日志 ...

  5. 安卓app测试之Monkey日志分析

    转:原文:https://blog.csdn.net/a136332462/article/details/76066909  一.一般测试结果分析-搜索关键字: 1.无响应问题可以在日志中搜索 “A ...

  6. monkey日志管理

    日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和 ...

  7. Appium自动化测试教程-自学网-monkey日志管理

    日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和 ...

  8. 如何分析和研究Log文件 ,如何看日志信息

    如何分析和研究Log文件 ,如何看日志信息 . Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处 ...

  9. Swing应用开发实战系列之五:后台日志信息前台监控器

    作为一个程序设计人员,我们深知日志的重要性,对于日志的监控,我们通常不外乎采用以下两种方式:日志文件方式和后台打印方式,常规情况下,这两种日志监控方式完全可以满足我们对日志监控的需要.但是,当我们用S ...

随机推荐

  1. Shape详解

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  2. nmap --script http-enum,http-headers,http-methods,http-php-version -p 80 目标域

    从http服务器上收集到更多地信息 nmap --script http-enum,http-headers,http-methods,http-php-version  -p 80 目标域

  3. 线程池模块thernd

    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time def task(i): print ...

  4. 不该被忽视的CoreJava细节(一)

    一.系列文章导言 <不该被忽视的CoreJava细节>系列文章将会持续更新.我希望自己通过这一系列文章的写作,能与读者一起进步,逐步完善对Java体系结构的了解. 二.本期关注点 几乎翻看 ...

  5. DataGridView控件使用大全

    转自:http://www.cnblogs.com/xiaofengfeng/archive/2011/04/16/2018504.html DataGridView控件 DataGridView是用 ...

  6. Pylint 是什么

    Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考 ...

  7. 浅谈Scrum敏捷开发:4个输入/输出、3个关键物、3个会议

    文章对Scrum敏捷开发流程进行系统的分析,希望借此文能够加深你对敏捷开发的认知,更好的展开产品工作. Scrum敏捷开发,是一种敏捷开发框架,是一个增量的.迭代的开发过程,具备可视.可集成和可运行使 ...

  8. HDU 3697 Selecting courses 选课(贪心)

    题意: 一个学生要选课,给出一系列课程的可选时间(按分钟计),在同一时刻只能选一门课程(精确的),每隔5分钟才能选一次课,也就是说,从你第一次开始选课起,每过5分钟,要么选课,要么不选,不能隔6分钟再 ...

  9. sparkSQL中udf的使用

    在Spark中使用sql时一些功能需要自定义方法实现,这时候就可以使用UDF功能来实现 多参数支持 UDF不支持参数*的方式输入多个参数,例如String*,不过可以使用array来解决这个问题. 定 ...

  10. java之接口相关知识

    1.接口用interface来声明 //定义一个动物接口 public interface Animal{ public void eat(); public void travel(); } 2.接 ...