压力测试 Monkey 应用程序无响应ANR Application No Response(转)

时间:2024-02-25 20:26:25

压力测试 第一次接触这个概念,客户端做压力测试,没听说过。其实是有的,典型:疯狂的点击屏幕。今天试验了一把,原理:用脚本疯狂去模拟点击事件,如何去模拟点击事件呢,就是好比一个人,随便去点,不一定非得就去点击有反应的控件。

看看打印的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 命令不能用的情况

解决问题如下:

 

首先这个问题有两种可能:     
     1.就是没有配置环境变量, 这个只需要将android安装:例如C:/Program File/android-sdk-windows/tools加入到 系统变量Path中,需要注意的是Path中会配置的有其他的路径,需要在android的路径前加;然后将上面的路径粘贴上去就OK了。
   2.就是配置了环境变量在cmd中输入adb还是出现“adb不是内部或外部命令”这样的问题,那么轻接着往下看: 在我刚学习android的时候在网上找了许多配置android环境变量的方法、也根据他们的说法配置好android的环境变量、然后输入adb、别 人就可以显示好多信息,可是我的偏偏出错了,可是我明明是按照网上说的方式去做的,而且大多说法都一样,我就找错啊,找了半天找不到啊,实在是找不到,不 就是配置一个环境变量吗,有什么好配置的呀,后来看文件夹,发现在/platform-tools下面有adb.exe,而在tools文件夹下面没有, 原来是这样的。android2.2和android 2.3是不一样的 ,android2.3 adb.exe是放在android-sdk-windows/platform-tools目录下面的,而2.2是放在tools目录下面的,所以我吧 path的路径指到platform-tools下面,然后输入adb,成功!!!
   希望大家注意android版本更改后文件夹路劲会产生变化,但是只要做相应的改变,相信没什么大问题的。O_o
参考:http://blog.sina.com.cn/s/blog_60ed47f00100qxb3.html
注意事项:要测试某个软件,先把模拟器开启来,软件开不开都无所谓。软件,要是装在手机上,显示权限不允许
--------------------------------------------------------------------------------------------------------------------------------------
应用程序无响应ANR Application No Response
也是第一次听说这个概念,其实没什么新奇的,目的:一个反应灵敏的程序,用多线程。

很多初入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提到的分段处理方式。