一、Monkey命令概述
NO  | 命令  | 说明  | 用法  | 解释  | 
1  |  -p ALLOWED_PACKAGE  | 用于指定某个apk,可以使用多个-p选项,但是每个-p命令选项只能用于一个apk  如果不指定-p,Monkey就会默认进行全系统测试。  |  -p com.android.contacts  | 可以进行特定apk的Monkey测试  | 
2  |  -c MAIN_CATEGORY  | 用于指定某个类,可以使用多个-c选项,但是每个-c命令选项只能用于一个类。如不指定类,Monkey就默认执行Intent.Category_LAUNCHER或者Intent.Category_MONKEY  |  -c intent.CATEGORY_LAUNCHER  | 所有类别:  * CATEGORY_DEFAULT  * CATEGORY_BROWSABLE  * CATEGORY_TAB  * CATEGORY_ALTERNATIVE  * CATEGORY_SELECTED_ALTERNATIVE  * CATEGORY_LAUNCHER  * CATEGORY_INFO  * CATEGORY_HOME  * CATEGORY_PREFERENCE  * CATEGORY_TEST  * CATEGORY_CAR_DOCK  * CATEGORY_DESK_DOCK  * CATEGORY_CAR_MODE   | 
3  |  --ignore-crashes  | 忽略程序崩溃。设置此选项后,Monkey会执行完所有的事件,不会因crash而停止。  |  --ignore-crashes  | 针对各种crash的忽略,监控,停止进程操作  | 
4  |  --ignore-timeouts  | 忽略程序无响应。设置此选项后,Monkey会执行完所有的事件,不会因ANR而停止。  |  --ignore-timeouts  | |
5  |  --ignore-security-exceptions  | 忽略证书或认证异常。设置此选项后,Monkey会执行完所有的事件,不会因认证或证书异常而停止。  |  --ignore-security-exceptions  | |
6  |  --monitor-native-crashes  | 监视系统中本地代码发生的崩溃。  |  --monitor-native-crashes  | |
7  |  --ignore-native-crashes  | 忽略本地代码导致的崩溃。设置忽略后,Monkey将执行完所有的事件,不会因此停止。  |  --ignore-native-crashes  | |
8  |  --kill-process-after-error  | 设置了该选项,出错的程序就会停止。  |  --kill-process-after-error  | |
10  |  --pct-touch PERCENT  | 调整触摸事件的百分比  |  --pct-touch 20  | 所有的事件的百分比应该是100%,从Monkey测试报告中没有发现特定事件的影响:比如在U8800上进行100%的轨迹球事件测试,没有发现任何影响。  | 
11  |  --pct-motion PERCENT  | 调动作事件的百分比  |  --pct-motion 20  | |
12  |  --pct-trackball PERCENT  | 调整轨迹球事件的百分比  |  --pct-trackball 10  | |
13  |  --pct-syskeys PERCENT  | 调整系统按键事件的百分比(home\back\call\end call\volume key)  |  --pct-syskeys 5  | |
14  |  --pct-nav PERCENT  | 调整基本导航事件的百分比  |  --pct-nav 5  | |
15  |  --pct-majornav PERCENT  | 调整主要导航事件的百分比(ok\cancel\menu等引发图形接口的动作)  |  --pct-majornav 10  | |
16  |  --pct-appswitch PERCENT  | 调整启动活动的百分比  |  --pct-appswitch 10  | |
17  |  --pct-flip PERCENT  | 调整点击事件的百分比  |  --pct-flip 10  | |
18  |  --pct-anyevent PERCENT  | 调整其他类型事件的百分比(其他所有类型)  |  --pct-anyevent 10  | |
19  |  --pkg-blacklist-file PACKAGE_BLACKLIST_FILE  | apk黑名单,屏蔽掉黑名单中的apk。  |  --pkg-blacklist-file /data/blacklist/blacklist.txt  | 1.需要新建黑白名单文件夹和同名txt文件。  2.然后在txt文件中编辑apk列表。  | 
20  |  --pkg-whitelist-file PACKAGE_WHITELIST_FILE  | apk白名单,只测试包含在白名单中的apk  |  --pkg-whitelist-file /data/whitelist/whitelist.txt  | |
21  |  --wait-dbg  | 一旦连接了调试器,Monkey就会停止。  |  --wait-dbg  | 开发调试时使用  | 
9  |  --hprof  | 用于在Monkey事件时序的前后,在/data/misc中生成5Mb左右的profiling报告。  | 在data\misc文件夹下产生一个“.hprof”的文件(heap-dump-tm1312534653-pid159.hprof)  | |
22  |  --dbg-no-events  | 设置该选项后,Monkey会执行初始启动,进入到测试活动中而不产生任何事件。可以设置几个apk包以及其他环境,来监视应用程序所调用的包之间的转换。  |  --dbg-no-events  | |
25  |  --port port  | 为Monkey开启专用端口。之后Monkey就不会执行,此时你就可以像Monkey一样乱点,Monkey会输出你点击后的回馈信息。如果你打完命令后,模拟器没有启动你所要启动的包,需要自己启动你在-p中指定的应用.  | 开启专用端口后,人可以模拟Monkey进行操作。用于开发手动重现问题。  | |
26  |  -s SEED  | 随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件时序。  |  -s 100  | 主要帮助开发排查错误并验证修改的代码  | 
27  |  -v  | 每个-v都将增加反馈信息的级别。共3个级别,因此,-v -v -v可以提供最详细的设置信息。  |  -v -v -v  | 使用3个v命令,可以在Monkey测试报告中看最详细的设置信息  | 
28  |  --throttle MILLISEC  | 事件之间插入的固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定,Monkey将尽可能快的产生并执行事件。  |  --throttle 3000  | 设置事件间的时间延时  | 
29  |  --randomize-throttle  | 事件之间插入随机延时。  |  --randomize-throttle  | |
30  |  COUNT  | 执行数  | 99999  | 执行事件次数  | 
二、死机log信息汇总
NO  | log信息类型  | 可以解决哪些问题  | 如何获得不同的log信息  | 说明  | 如何导出该文件  | 
1  | Logcat  | App crash  | 通过命令获得:  #adb shell logcat –v time > c:\logcat-log.txt  | 无  | 可以通过命令导出  | 
2  | Bugreport  | App crash  | 获取bugreport和dumpstate:  #adb shell bugreport > bugreport-yyyy-mm-dd-hh-mm-ss.txt  #adb shell dumpstate > dumpstate-yyyy-mm-dd-hh-mm-ss.txt  | dumpstate是一个具体对系统的各个信息进行收集的程序  bugreport则会以服务的形式来启动dumpstate,它不完成具体的收集操作,只负责将dumpstate的信息通过socket的形式进行接收并重定向出来。它存储在/mnt/sdcard/bugreports或者/data/bugreports或/HWUserData  | 可以实现自动导出  | 
3  | Dump log  | App crash  | 从qpst或者dump工具导出  | 1.利用QPST efs工具,手动创建dump目录和一个空白的debug.dbg文件在dump目录下。  2.通过QXDM将NV905设置为0(0表示进入dump,1表示重启,2或者未激活表示不做任何动作)  | 只能手动导出  | 
4  | ANR trace  | App not responding  | Trace.txt文件保存在在/data/anr中,可以通过命令导出  | 无  | 可以通过命令导出  | 
5  | Dropbox  | App crash、kernel  | 保存在/data/system/dropbox,该目录下有4类信息对分析比较有帮助:  1.APANIC_CONSOLE@xxxxxxxxxxxxx.txt.gz  2.APANIC_THREADS@xxxxxxxxxxxxx.txt.gz  3.system_server_watchdog@xxxxxxxxxxxxx.txt  4.system_server_crash@xxxxxxxxxxxxx.txt  | APANIC_CONSOLE@xxxxxxxxxxxxx.txt.gz:记录的是核心发生死机的时候的核心LOG  APANIC_THREADS@xxxxxxxxxxxxx.txt.gz:核心发生死机的时候各个线程在核心中的调用stack  system_server_watchdog@xxxxxxxxxxxxx.txt:记录了发生死机的时刻上系统对SystemServer中的各个线程的调用stack进行记录的一个文件  system_server_crash@xxxxxxxxxxxxx.txt:记录了发生死机的时刻上SystemServer中的具体死机的异常点  | 可以实现自动导出  | 
6  | Tombstones  | Native  | 保存在/data/tombstones,该目录下生成一个tombstone_xx文件  | Tombstone文件是异常进程的调用栈信息,在该进程异常退出或崩溃时由android的后台进程debuggerd负责生成  | 可以实现自动导出  | 
7  | Coredump  | Native  | 一是编译器支持:要产生coredump文件,在android编译的时候要加上调试-g选项以支持coredump文件的生成。  二是环境参数支持:可以修改<工程目录>system/core/rootdir下的init.rc文件来支持coredump文件的产生。  | 这是一种常见的linux收集进程异常信息的机制。用户态进程在中止时将产生信号,linux内核根据信号的类型来决定是否要产生coredump文件。Android上保留了这种机制,但默认是关闭的。要使进程产生coredump文件,还要满足两个条件:一是编译器支持,二是环境参数支持。  | 目前没有开发使用过该信息去处理死机问题  | 
8  | Kmsg  | Kernel、Native  | 保存在cat/proc/kmsg来查看sysrq信息,它用来收集内核和用户态进程信息。  需要通过adb命令:  打开这个功能,运行:  # echo 1 > /proc/sys/kernel/sysrq  关闭这个功能:  # echo 0 > /proc/sys/kernel/sysrq  | sysrq信息:  只要内核没有被完全锁住,不管内核在做什么事情,使用sysrq可以立即打印出内核的信息,当然也包括用户态进程的信息。  如果系统出现挂起的情况或者在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,亦可使用sysrq方式来收集信息。  | 可以实现自动导出,但是需要先开启该功能。  | 
9  | Dontpanic  | Kernel  | 有三个文件保存在在/data/dontpanic/目录下:  apanic_console:记录内核的控制台信息  apanic_threads:记录的是panic时内核寄存器、调用栈等信息 apanic_sysinfo:记录meminfo、zoneinfo、slabinfo、vmallocinfo等信息。  | apanic_sysinfo:  在apanic中打开这些文件并用printk读取到内核log_buf中,然后再利用apanic的写入flash机制将这些信息分别保存到/data/dontpanic/目录下  | apanic_sysinfo需要开发手动增加的,而非系统自动生成。  | 
10  | Mondem log  | mondem  | 通过QPST工具连接手机打开/err文件,并导出其中的log文件  | 通过QPST获得的高通死机log err文件夹下的内容(适用于7x25/7x27平台)通过QPST可以获得err文件夹下的内容,该目录下的内容是ARM9在死机的时候记录在ARM9侧的LOG记录,通过该目录可以简单的判断一下ARM9侧的死机情况。  | 只能手动导出  | 
三、参考数据
NO  | 手机  | 延时(ms)  | 执行时间(ms)  | 执行时间(minute)  | 注入事件数  | 事件执行频率:个/分钟  | Monkey停止原因  | 
1  | HTC  | 无延时  | 1148065  | 19  | 17205  | 899  | at com.htc.album.DisplayManager.onMenuItemSelected  | 
2  | 1551528  | 26  | 19401  | 750  | android.app.ActivityThread.performLaunchActivity  | ||
3  | 1002859  | 17  | 14937  | 894  | at com.android.htcdialer.BaseSmartSearchList.onKeyDown  | ||
4  | 2679478  | 45  | 37625  | 843  | at android.app.ActivityThread.performLaunchActivity  | ||
5  | 553359  | 9  | 8229  | 892  | java.lang.RuntimeException  at android.app.ActivityThread.performResumeActivity  | ||
6  | 725423  | 12  | 10348  | 856  | java.lang.NullPointerException  at com.htc.android.worldclock.DeskClock.dispatchKeyEvent  | ||
7  | 1480935  | 25  | 18897  | 766  | java.lang.NullPointerException  at com.google.android.street.StreetView.setPanoramaConfig  | ||
8  | 1068266  | 18  | 12814  | 720  | ANR in com.htc.launcher (com.htc.launcher/.Launcher)  | ||
9  | 2575371  | 43  | 34454  | 803  | java.lang.RuntimeException: Unable to resume activity  at android.app.ActivityThread.performResumeActivity  | ||
10  | 589575  | 10  | 8492  | 864  | android.view.WindowManager$BadTokenException: Unable to add window  at android.view.ViewRoot.setView  | ||
1  | Nexus  | 无延时  | 610986  | 10  | 18906  | 1857  | java.lang.IllegalStateException: Calling RS with no Context active.  | 
2  | 585847  | 10  | 16862  | 1727  | ANR in com.google.android.voicesearch  | ||
3  | 2384462  | 40  | 71757  | 1806  | ANR in com.google.android.apps.maps:driveabout   | ||
4  | 751051  | 13  | 18085  | 1445  | ANR in com.google.android.apps.maps:driveabout   | ||
5  | 1180138  | 20  | 31844  | 1619  | OutOfMemory  | ||
6  | 1004487  | 17  | 25498  | 1523  | java.lang.IllegalArgumentException  at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface  | ||
7  | 1316022  | 22  | 32390  | 1477  | ANR in com.google.android.apps.maps  | ||
8  | 2227825  | 37  | 63641  | 1714  | java.lang.IllegalArgumentException  at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface  | ||
9  | 1291264  | 22  | 36456  | 1694  | ANR in com.google.android.apps.maps   | ||
10  | 1200919  | 20  | 35125  | 1755  | ANR in com.google.earth (com.google.earth/.EarthActivity)  | ||
1  | C8800(大内存)  | 无延时  | 219247  | 4  | 2958  | 809  | ANR in com.android.camera   | 
2  | 72382  | 1  | 1248  | 1035  | java.lang.RuntimeException: lock failed  at android.hardware.Camera.lock(Native Method)  | ||
1  | U8800  | 无延时  | 241502  | 4  | 3800  | 944  | java.lang.NullPointerException  at com.erdo.unicom.GameMIDlet$10.onClick  | 
2  | 486920  | 8  | 8646  | 1065  | java.lang.RuntimeException: An error occured while executing doInBackground  at android.os.AsyncTask$3.done  | ||
3  | 1183262  | 20  | 19594  | 994  | SocketTimeoutException  at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)  | ||
4  | 158476  | 3  | 5005  | 1895  | android.view.WindowManager$BadTokenException  at android.view.ViewRoot.setView  | ||
5  | 133167  | 2  | 2097  | 945  | java.lang.RuntimeException: Unable to resume activity  at android.app.ActivityThread.performResumeActivity  | ||
6  | 428677  | 7  | 8227  | 1151  | java.lang.NullPointerException  at com.erdo.unicom.WelcomeForm.onKeyUp  | ||
7  | 371265  | 6  | 6991  | 1130  | java.lang.RuntimeException: Unable to pause activity {com.android.contacts/com.android.contacts.commonext.GroupGridActivity}  at android.app.ActivityThread.performPauseActivity  | ||
8  | 526763  | 9  | 8633  | 983  | java.lang.NullPointerException  at com.huawei.inputmethod.hwpal.PinyinIME.showCandidateWindow  | ||
9  | 591910  | 10  | 8633  | 875  | android.view.WindowManager$BadTokenException  | ||
10  | 270742  | 5  | 7561  | 1676  | java.lang.NullPointerException  at com.erdo.unicom.WelcomeForm.onKeyUp  | 










