• 压力测试 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 命令不能用的情况

    解决问题如下:

    首先这个问题有两种可能:     
         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提到的分段处理方式。

     
  • 相关阅读:
    单件模式 Singleton---Design Pattern 5
    Web请求中同步与异步的区别
    zepto和jquery的区别,zepto的不同使用8条小结
    zepto判断左右滑动
    移动web终端交互优化
    Flexbox
    设计移动web
    viewport
    Pixel移动开发像素知识
    获取元素的left值
  • 原文地址:https://www.cnblogs.com/royi123/p/3114157.html
Copyright © 2020-2023  润新知