压力测试 Monkey 应用程序无响应ANR Application No Response(转)
压力测试 第一次接触这个概念,客户端做压力测试,没听说过。其实是有的,典型:疯狂的点击屏幕。今天试验了一把,原理:用脚本疯狂去模拟点击事件,如何去模拟点击事件呢,就是好比一个人,随便去点,不一定非得就去点击有反应的控件。
看看打印的log:
m.android.settings/.WirelessSettings } in package com.android.settings
:Sending Pointer ACTION_DOWN x=209.0 y=147.0
:Sending Pointer ACTION_UP x=209.0 y=147.0
:Sending Pointer ACTION_MOVE x=-2.0 y=0.0
// Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.i
ntent.category.HOME] cmp=com.android.launcher/.Launcher } in package com.android //这种非本程序的包,是不去模拟的
.launcher
:Sending Pointer ACTION_DOWN x=219.0 y=29.0 //疯狂模拟各个位置的点击事件
:Sending Pointer ACTION_UP x=219.0 y=29.0
:Sending Pointer ACTION_DOWN x=319.0 y=18.0
:Sending Pointer ACTION_UP x=319.0 y=18.0
:Sending Pointer ACTION_DOWN x=179.0 y=91.0
:Sending Pointer ACTION_UP x=179.0 y=91.0
:Sending Pointer ACTION_DOWN x=212.0 y=176.0
:Sending Pointer ACTION_UP x=212.0 y=176.0
:Sending Pointer ACTION_DOWN x=196.0 y=193.0
:Sending Pointer ACTION_UP x=196.0 y=193.0
:Sending Pointer ACTION_MOVE x=-5.0 y=-2.0
// CRASH: com.acp.main (pid 325)
// Short Msg: Array index out of range: 0
// Long Msg: java.lang.ArrayIndexOutOfBoundsException: Array index out of range://程序出问题了,数组越界了,测试到这,测试就会自动停止了。
0
// Build Label: android:generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-k
eys
// Build Changelist: 35983
// Build Time: 1273161972
// ID:
// Tag: AndroidRuntime
// java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 0
// at java.util.Vector.elementAt(Vector.java:331)
// at com.acp.main.BuyTg$3.onItemClick(BuyTg.java:142)
// at android.widget.AdapterView.performItemClick(AdapterView.java:284)
// at android.widget.ListView.performItemClick(ListView.java:3285)
// at android.widget.AbsListView.onKeyUp(AbsListView.java:1757)
// at android.widget.ListView.commonKey(ListView.java:2059)
// at android.widget.ListView.onKeyUp(ListView.java:1968)
// at android.view.KeyEvent.dispatch(KeyEvent.java:1061)
// at android.view.View.dispatchKeyEvent(View.java:3683)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:746)
// at android.widget.ListView.dispatchKeyEvent(ListView.java:1943)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyE
vent(PhoneWindow.java:1655)
// at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(Phone
Window.java:1102)
// at android.app.Activity.dispatchKeyEvent(Activity.java:2038)
// at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(
PhoneWindow.java:1631)
// at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2368)
// at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2338)
// at android.view.ViewRoot.handleMessage(ViewRoot.java:1641)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:123)
// at android.app.ActivityThread.main(ActivityThread.java:4363)
// at java.lang.reflect.Method.invokeNative(Method.java:-2)
// at java.lang.reflect.Method.invoke(Method.java:521)
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.ja
va:860)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
// at dalvik.system.NativeStart.main(NativeStart.java:-2)
** Monkey aborted due to error.
Events injected: 571
:Dropped: keys=0 pointers=15 trackballs=0 flips=0
## Network stats: elapsed time=68130ms (68130ms mobile, 0ms wifi, 0ms not connec
ted)
** System appears to have crashed at event 571 of 1500 using seed 0
# monkey -p com.acp.main -v 6000
monkey -p com.acp.main -v 6000
:Monkey: seed=0 count=6000
:AllowPackage: com.acp.main
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 15.0%
// 3: 25.0%
// 4: 15.0%
// 5: 2.0%
// 6: 2.0%
// 7: 1.0%
// 8: 15.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.categ
ory.LAUNCHER;launchFlags=0x10000000;component=com.acp.main/.BootUI;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.in
tent.category.LAUNCHER] cmp=com.acp.main/.BootUI } in package com.acp.main
:Sending Pointer ACTION_MOVE x=-4.0 y=2.0
// Allowing start of Intent { cmp=com.acp.main/.DesktopUI } in package com.a
cp.main //本程序内的跳转是允许的
// activityResuming(com.acp.main)
:Sending Pointer ACTION_UP x=0.0 y=0.0
// Allowing start of Intent { cmp=com.acp.main/.LoginUI } in package com.acp
.main
// activityResuming(com.acp.main)
如何使用Monkey:
1、第一步,cmd 进入“ adb shell”,进入avd 的根目录后,“ls ”看到了一个data的目录,里面就是我们要安装程序的
2、第二步,找到所有安装应用程序的包,其中里面就有你要测试的包的名称
3、当然你如果熟悉了Monkey的话,直接“adb -d shell monkey -p your.package.name -v 6000”也是可以的。
命令:adb shell
#ls
ls
cd /data/data
ls
adb -d shell monkey -p your.package.name -v 6000
参考文章:http://www.cnblogs.com/renjie/archive/2011/05/22/2053183.html
http://blog.csdn.net/li_guotao/archive/2011/03/03/6219729.aspx
在这过程中,可能会出现adb 命令不能用的情况
解决问题如下:
很多初入Android开发的网友可能发现ANR的字样,到底Android ANR是什么呢? 其实ANR就是Application Not Responding的全称,当某个应用处于长期假死状态时Android系统会弹出一个窗口上面写道,XXX is not responding给出两个按钮一个为force close一个为wait。
可能触发ANR的情况
1. 长时间的I/O处理,比如读写大文件,网络访问时造成的阻塞。
2. 执行耗时的运算,Android默认为超过5000ms即5秒开始弹出ANR窗口,某些应用可能首次执行时没有缓存十分耗时,可以通过Splash播放闪屏Logo等方式来延缓加载
3. Service和appWidget中也要注意多线程的使用,除非它和Activity工作在不同的进程。
避免ANR的方法
1. 单独开工作者线程,通过独立的Thread或使用类似AsyncTask的方式来处理耗时的内容。
2. 耗时的操作尽量分段处理,使用类似状态机的方法,类似Symbian的活动对象将一个复杂的事情,分段执行。
3. UI线程中不要处理过多的内容,比如将一个5MB的文本,让TextView去setText,要知道这种UI操作,没有什么好方法去解决的,所以Android123提示,遇到UI中需要执行复杂的操作,可以参考上面2提到的分段处理方式。