一、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 |