由于Android本身的设计,以及应用程序和系统在开发过程中的缺陷,经常会在测试过程中遇到各种各样异常和ANR问题。在完成功能开发后通常通过压力测试来保证系统的稳定性,本文介绍Android的压力测试工具Monkey使用方法。
一,简介:
Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的法。
二:操作方法
通过help 可以列出命令的选项,如下:
shell@mstarnapoli_hifly:/ # monkey --help
** Error: Unknown option: --help
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
[--profile-wait MILLISEC]
[--device-sleep-time MILLISEC]
[--randomize-script]
[--script-log]
[--bugreport]
[--periodic-bugreport]
COUNT
-p 选项:【如果用此参数指定了一个或几个包,Monkey将只允许系统启动这些包里的Activity,要指定多个包,需要使用多个-p选项,每个-p选项指定一个包】-s 选项:【伪随机数生成器的 seed 值。如果用相同的seed 值再次运行Monkey ,它将生成相同的事件序列,如果是概率出现的问题,通过设置相同的seed值来复现问题】
-v选项: 【指定返回日志级别,共分三个级别】
比如命令:
monkey -p com.hybroad.launcher.activity -p com.hybroad.launcher.view -v -v -v –s 10 10000
表示伪随机数生成器的种子是10,在com.hybroad.launcher.activity和com.hybroad.launcher.view中执行10000个事件序列,并提供较高级别的日志
三:测试结果分析
Monkey Test 执行过程中在下列三种情况下会自动停止:
1.如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止。
2.如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错。
3.如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。
通过多次并且不同设定下的Monkey 测试才算它是一个稳定性足够的程序。
获取到monkey 执行的log后我们需要查看日志是否出现上述2 和3 报错,显然2属于系统崩溃问题在日志中搜索“Exception" 3是ANR问题,在日志中搜索“ANR”便能很方便找到问题,如下红色部分表明出现空指针异常了。
Sending Touch (ACTION_DOWN): 0:(1882.0,455.0)
:Sending Touch (ACTION_UP): 0:(1882.2484,460.26718)
:Sending Touch (ACTION_DOWN): 0:(1581.0,97.0)
:Sending Touch (ACTION_UP): 0:(1580.5397,85.56268)
:Sending Touch (ACTION_DOWN): 0:(440.0,283.0)
:Sending Touch (ACTION_UP): 0:(433.6487,274.82684)
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-3.0)
:Sending Touch (ACTION_DOWN): 0:(1206.0,263.0)
:Sending Touch (ACTION_UP): 0:(1185.9463,256.7876)
:Sending Trackball (ACTION_MOVE): 0:(1.0,-3.0)
:Sending Touch (ACTION_DOWN): 0:(1074.0,738.0)
:Sending Touch (ACTION_UP): 0:(1049.6573,762.4713)
:Sending Touch (ACTION_DOWN): 0:(1113.0,903.0)
:Sending Touch (ACTION_UP): 0:(1117.7465,878.39905)
:Sending Touch (ACTION_DOWN): 0:(1085.0,300.0)
:Sending Touch (ACTION_UP): 0:(1080.334,299.08066)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,0.0)
:Sending Trackball (ACTION_UP): 0:(0.0,0.0)
// CRASH: com.hybroad.launcher (pid 3620)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: unknown
// Build Changelist: V1.0.svn-38.0716
// Build Time: 1405522645000
<span style="color:#FF0000;">// java.lang.NullPointerException
// at com.hybroad.launcher.activity.VideoDetailActivity$13.onClick(VideoDetailActivity.java:448)</span>
// at android.view.View.performClick(View.java:4240)
// at android.view.View.onKeyUp(View.java:7928)
// at android.widget.TextView.onKeyUp(TextView.java:5579)
// at android.view.KeyEvent.dispatch(KeyEvent.java:2854)
// at android.view.View.dispatchKeyEvent(View.java:7343)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1393)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1933)
// at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1408)
// at android.app.Activity.dispatchKeyEvent(Activity.java:2384)
// at com.hybroad.launcher.activity.VideoDetailActivity.dispatchKeyEvent(VideoDetailActivity.java:157)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1860)
// at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3832)
// at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3815)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3420)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3470)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3439)
// at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3524)
// at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3447)
// at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3581)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3420)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3470)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3439)
// at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3447)
// at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3420)
// at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3470)
// at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3439)
// at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3557)
// at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3707)
// at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:1982)
// at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1698)
// at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1689)
// at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1959)
// at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
// at android.os.MessageQueue.nativePollOnce(Native Method)
// at android.os.MessageQueue.next(MessageQueue.java:132)
// at android.os.Looper.loop(Looper.java:124)
// at android.app.ActivityThread.main(ActivityThread.java:5103)
// at java.lang.reflect.Method.invokeNative(Native Method)
// at java.lang.reflect.Method.invoke(Method.java:525)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:773)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:589)
// at dalvik.system.NativeStart.main(Native Method)
//
** Monkey aborted due to error.
Events injected: 3098
:Sending rotation degree=0, persist=false
:Dropped: keys=1 pointers=5 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=23339ms (0ms mobile, 0ms wifi, 23339ms not connected)
** System appears to have crashed at event 3098 of 1000000 using seed 1409267204529
蓝色部分日志表明出现了ANR异常:
// NOT RESPONDING: com.hybroad.launcher (pid 6012)
<span style="color:#000099;">ANR in com.hybroad.launcher (com.hybroad.launcher/.activity.SubMenuActivity)
Reason: keyDispatchingTimedOut
Load: 3.97 / 2.2 / 0.93
CPU usage from 6313ms to 101ms ago:</span>
98% 1375/system_server: 52% user + 45% kernel / faults: 2239 minor
75% 1630/com.hybroad.phone_remote: 39% user + 35% kernel / faults: 131 minor
68% 2385/com.hybroad.airplay: 40% user + 28% kernel / faults: 17 minor
18% 1035/tvos: 9.3% user + 9.1% kernel
18% 6012/com.hybroad.launcher: 13% user + 5.3% kernel / faults: 3363 minor 5 major
5.6% 1019/surfaceflinger: 2% user + 3.5% kernel
2.5% 5657/mediaserver: 0.3% user + 2.2% kernel / faults: 18 minor
0.6% 1608/com.hybroad.inputmethod.remote: 0.6% user + 0% kernel / faults: 1 minor
0.6% 4772/com.android.commands.monkey: 0.3% user + 0.3% kernel / faults: 24 minor
0.3% 1029/livecap: 0% user + 0.3% kernel
0.3% 2255/RTW_CMD_THREAD: 0% user + 0.3% kernel
0.1% 5/kworker/u:0: 0% user + 0.1% kernel
0.1% 22/kworker/u:1: 0% user + 0.1% kernel
0.1% 420/cifs_mem_clear: 0.1% user + 0% kernel
0.1% 1812/mdnsd: 0% user + 0.1% kernel / faults: 1 minor
0% 2244/rel_supplicant: 0% user + 0% kernel / faults: 51 minor 3 major
49% TOTAL: 27% user + 21% kernel + 0% softirq
CPU usage from 681ms to 1214ms later:
67% 1375/system_server: 37% user + 30% kernel / faults: 23 minor
7.5% 1728/Binder_7: 5.6% user + 1.8% kernel
5.6% 1688/Binder_3: 3.7% user + 1.8% kernel
5.6% 1689/Binder_4: 1.8% user + 3.7% kernel
5.6% 1729/Binder_8: 3.7% user + 1.8% kernel
5.6% 1899/Binder_A: 3.7% user + 1.8% kernel
3.7% 1375/system_server: 1.8% user + 1.8% kernel
3.7% 1386/Binder_1: 3.7% user + 0% kernel
3.7% 1387/Binder_2: 1.8% user + 1.8% kernel
3.7% 1397/ActivityManager: 0% user + 3.7% kernel
3.7% 1714/Binder_5: 1.8% user + 1.8% kernel
3.7% 1715/Binder_6: 3.7% user + 0% kernel
3.7% 1730/Binder_9: 1.8% user + 1.8% kernel
3.7% 1900/Binder_B: 3.7% user + 0% kernel
33% 1630/com.hybroad.phone_remote: 24% user + 9.4% kernel / faults: 1 minor
30% 1813/Timer-0: 22% user + 7.5% kernel
16% 1035/tvos: 3.7% user + 13% kernel
3.7% 1369/1035keypad Inpu: 1.8% user + 1.8% kernel
3.7% 1414/HDMITx_Task: 3.7% user + 0% kernel
3.7% 1700/Mdebug Monitor: 0% user + 3.7% kernel
1.8% 1406/Picture Monitor: 0% user + 1.8% kernel
1.8% 1698/Internal_MHLthr: 0% user + 1.8% kernel
3.7% 1019/surfaceflinger: 0% user + 3.7% kernel
3.7% 1186/SurfaceFlinger: 0% user + 3.7% kernel
3.7% 2385/com.hybroad.airplay: 3.7% user + 0% kernel
3.7% 2402/Timer-0: 3.7% user + 0% kernel
33% TOTAL: 17% user + 15% kernel
procrank:
PID Vss Rss Pss Uss cmdline
1375 70196K 69848K 47811K 44824K system_server
1515 66980K 64488K 43472K 40784K com.android.systemui
6012 55568K 43604K 23783K 21476K com.hybroad.launcher
1035 56792K 18508K 17888K 17580K /applications/bin/tvos
1630 31496K 31412K 13415K 12060K com.hybroad.phone_remote
1020 37196K 37072K 10593K 5184K zygote
5511 39404K 28252K 9760K 7964K com.android.systemui:screenshot
4772 22584K 22556K 9660K 6436K com.android.commands.monkey
1954 24868K 24780K 6770K 5188K com.miui.mihome2
1921 23480K 23388K 6647K 5312K com.miui.mihome.lockscreen
5657 10796K 10792K 6327K 5164K /system/bin/mediaserver
1532 22468K 22380K 5764K 4708K android.process.media
1660 24420K 24344K 5759K 4224K system:ui
1560 23100K 23004K 5574K 4172K com.miui.mihome2:download
1641 21048K 20948K 4481K 3524K com.jrm.servicecontainer
1608 20764K 20680K 4463K 3532K com.hybroad.inputmethod.remote
2385 18860K 18764K 3807K 3048K com.hybroad.airplay
1019 46628K 7604K 3380K 2328K /system/bin/surfaceflinger
1778 18440K 18348K 3262K 2504K com.hybroad.dlna
1574 18404K 18296K 3024K 2200K com.mstar.android.providers.tv
1794 17868K 17772K 2728K 1812K com.hybroad.phone_remote.daemon
1820 17444K 17344K 2621K 1868K org.opencv.engine:OpenCVEngineProcess
1652 17396K 17296K 2531K 1772K com.broadcom.bluetoothmonitor
1871 16808K 16712K 2434K 1708K com.android.settings
2035 16416K 16312K 2223K 1500K com.jrm.localmm
1018 2440K 2440K 2101K 2088K /system/bin/debuggerd
1905 16432K 16332K 2095K 1388K com.android.onetimeinitializer
2426 16104K 16004K 2064K 1356K com.mstar.tvsetting
1029 5072K 5072K 1818K 1260K /system/bin/livecap
1021 4372K 4372K 1490K 1024K /system/bin/drmserver
6274 1652K 1652K 1410K 1404K procrank
1028 1252K 1252K 975K 968K /system/bin/upnp_tv_receiver
2244 1892K 1892K 955K 832K rel_supplicant
1027 22020K 2180K 788K 316K /system/bin/virtualkeypad
1017 1612K 1612K 744K 644K /system/bin/netd
1015 1508K 1508K 679K 596K /system/bin/vold
1812 848K 848K 553K 544K /system/bin/mdnsd
1 536K 536K 450K 388K /init
1024 1228K 1228K 435K 360K /system/bin/keystore
2242 356K 356K 356K 356K /system/bin/busybox
1016 928K 928K 355K 316K /system/bin/resourcemanager
1031 716K 716K 226K 208K /system/bin/browserserver
2905 488K 488K 205K 128K sh
1036 476K 476K 197K 120K /system/bin/sh
2091 504K 504K 187K 176K /system/bin/dhcpcd
1023 456K 456K 162K 152K /system/bin/installd
674 220K 220K 154K 92K /sbin/ueventd
1037 168K 168K 148K 148K /sbin/adbd
6216 432K 428K 147K 132K /system/bin/dnssd
1014 348K 344K 109K 104K /system/bin/servicemanager
1026 348K 344K 105K 100K /system/bin/logwrapper
1034 332K 332K 94K 88K /system/bin/dnssd_daemon
------ ------ ------
267207K 226160K TOTAL
RAM: 598736K total, 135424K free, 12932K buffers, 156884K cached, 7668K shmem, 19324K slab
// procrank status was 0
[ 192.609759] RTL871X: no packet in tx packet buffer (0)
[ 193.919795] RTL871X: survey done event(b)
anr traces:
----- pid 6012 at 2014-08-16 12:44:43 -----
Cmd line: com.hybroad.launcher
JNI: CheckJNI is off; workarounds are off; pins=0; globals=159