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