• Android Monkey 脚本编写与检查内存泄露


    一、Monkey脚本编写

    1.Monkey脚本格式
    • 脚本优势:

    简单快捷,不需要接触任何工具,只需要一个记事本文件

    • 脚本缺点:

    实现坐标、按键等基本操作的相应步骤,顺序脚本无逻辑性


    • 脚本源码:
      developmentcmdsmonkeysrccomandroidcommandsmonkeyMonkeySourceScrip.java
    #头文件、控制monkey发送消息的参数
    type=raw events
    count=10
    speed=1.0
    #以下为monkey命令
    start data >>
    DispatchPress (KEYCODE_HOME)
    DispatchPress (KEYCODE_MENU)
    2.Monkey脚本API

    1)常用API

    API

    说明

    LaunchActivity(Pkg_name,cl_name) 启动应用的Activity
    Tap(x,y,tapDuration) 模拟一次手指单击事件
    DispatchPress(KeyCodeName) 按键

    RotateScreen(ratationDegree,peresist)
    旋转屏幕
    ratationDegree:四个参数0123分别代表0,90,180,270
    peresist:两个参数^0,0旋转后固定和旋转后不固定
    DispatchFlip(true/false) 打开或关闭软键盘
    LongPress() 长按两秒
    PressAndHold(x,t,pressDuration) 模拟长按事件
    DispatchString(input) 输入字符串
    Drag(sStart,yStart,xEnd,yEnd.stepCount) 用于模拟一个拖拽操作
    PinchZoom(pt1xStart,pt1yStart,pt1xEnd,pt1yEnd,pt2xStart,pt2yStart,pt2xEnd,pt2yEnd,stepCount) 模拟缩放手势
    UserWait(sleepTime) 让脚本中断一段时间
    DeviceWakeUp() 唤醒屏幕

    2)其他API

    API

    说明

    PowerLog(power_log_type,test_case_status) 模拟电池电量信息
    WriteLog() 将电池信息写入SD卡
    RunCmd() 运行shell命令
    DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags) 向指定位置发送单个手势
    action:0是按下,1是弹起
    DispatchKey(downTime,eventTime,action,code,repeat,metaStatue,device,scancode) 发送按键消息
    LaunchInstrumentation(test_name,runner_name) 运行一个instrumentation测试用例
    DispatchTrackball 模拟发送轨迹球事件
    ProfileWait 等待5秒
    StartCaptureFramerate() 获取帧率
    EndCaptureAppFramerate(input) 结束获取帧率
    startCaptureAppFramerate(app) 获取指定应用帧率
    EndCaptureAppFramerate(app,input) 结束获取帧率
    3.Monkey脚本实例
    • 打开浏览器,输入www.baidu.com,测试10次
    #头文件、控制monkey发送消息的参数
    type=raw events
    count=10
    speed=1.0
    #一下为脚本正文
    start data >>
    #1.打开浏览器
    LaunchActivity(com.android.browser,com.android.browser.BrowserActivity)
    ProfileWait()
    #2.清空网址
    Tap(223,146)
    ProfileWait()
    DispatchPress(112)
    ProfileWait()
    #3.输入网址
    DispatchString(www.baidu.com)
    ProfileWait()
    #4.确认,载入网址
    DispatchPress(KEYCODE_ENTER)
    ProfileWait()
    #5.完成退出浏览器
    DispatchPress(KEYCODE_HOME)
    ProfileWait()
    #6.脚本完成后将.txt文件push到手机中,然后使用命令"adb shell monkey -f path/name.txt --throttle 500 -v -v 1"命令调试运行,其中path指的是文件存放路径,name指的文件名

    二、Monkey服务器

    1)使用命令”adb shell monkey –port 1080”打开手机端口
    2)使用命令”adb forward tcp:1080 tcp:1080”把PC和手机端口进行连接诶
    3)使用命令”telnet localhost 1080” 创建通讯

    • #注意事项:
    adb shell monkey --port 1080 
    
    adb forward tcp:1080 tcp:1080 //需要重新打开一个cmd窗口 
    
    telnet localhost 1080 //windows默认没有打开telnet,控制面板--程序和功能--打开或关闭windows功能--telnet相关的都勾选好然后重启电脑
    1.monkey服务器命令
    • 命令源码:


    developmentcmdsmonkeysrccomandroidcommandsmonkeyMonkeySourceNetwork.java


    1)常用API

    命令

    命令格式

    说明

    flip flip open、filp closed 打开或关闭键盘
    touch touch [down|up|move] [x] [y] 模拟手指按下边界的操作
    trackball trackball [dx] [dy] 发送一个轨迹球操作事件
    key Key [down|up] [keycode] 发送一个按键事件
    sleep sleep [暂停时间] 服务器暂停一点时间
    type type [String] 向当前应用发送一个字符串
    wake wake 唤醒设备
    tap tap [x] [y] 发送一个单击坐标的命令
    press press [keycode] 发送一个按键
    deferreturn deferrenturn [event] [timepue] [command] 执行一个命令在指定延时之内等待一个event事件

    2)查询API

    命令

    命令格式

    说明

    listvar listvar 列出可查看的系统变量
    getvar getvar [variable name] 获取一个系统变量的值
    listviews listviews 列出待测应用里的所有视图的ID
    getrootview getrootview 获取待测试应用的最上层控件的ID
    getviewswithtext getviewswithtext [text] 返回所有包含指定文本的控件ID
    queryview queryview viewed [id] [command]
    queryview accessibilityids [id1] [id2] [command]
    根据指定ID来查询控件
    2.monkey服务器实例
    //点击坐标500,500
    tap 500 500                            
    //按菜单键 
    press KEYCODE_MENU        
    //在输入框输入10086 
    type 10086                              
    //列出可查看的系统变量
    listvar                                     
    //获取build.product的值
    getvar build.product

    三、Monkey检查内存泄漏

    1.分析内存泄漏工具与命令

    1)HPROF文件:HPROF可以监控CPU使用率,堆分配统计
    2)MAT工具:下载地址(http:www.eclipse.org/mat/)
    3)生成HPROF文件命令:”adb shell am dumpheap <进程名> <保存路径>”
    4)查看应用内存命令:”adb shell dumpsys meminfo <进程名>”
    5)转换为MAT可读文件指令:”hprof-conv <原HPROF文件路径> <转换后的HPROF文件路径>”

    2.基本操作步骤

    1)运行Monkey或者固定自动化用例
    2)监控内存值,如果出现过大等递增异常则保存HPROF文件
    3)对保存的HPROF文件进行转化为MAT可读文件
    4)使用MAT打开文件,对多个文件进行对比分析

    3.实例
    • Android旋转屏幕产生内存泄漏

    1)输入网址”http:www.eclipse.org/mat/”在页面的links下面点击download,然后在新页面中选择适合自己的系统进行下载,下载好后解压即可
    2)准备一个.bat后缀名的脚本,用来实时查看内存,脚本代码如下:

    set process=com.android.browser             #需要测试的进程名
    @adb shell dumpsys meminfo %process% | findstr "Pss"        
    :m
    @adb shell dumpsys meminfo %process% | findstr "TOTAL"  
    @ping -n 5 127.1>nul
    @goto m

    3)在cmd窗口中使用monkey命令”adb shell monkey -p com.android.browser –pct-rotation 100 –throttle 2000 -v 20 ”
    4)打开前面准备的.bat文件监控应用内存情况
    5)monkey跑完后使用命令”adb shell am dumpheap com.android.browser /data/local/tmp/test.hprof”将结果保存
    6)将保存好的.hprof文件pull到本地PC上”adb pull /data/local/tmp/test.hprof F: est”
    7)在F: est路径下shift+鼠标右键打开cmd窗口输入命令”hprof-conv test.hprof test1.hprof”
    8)使用下载好的mat.exe打开转换后的test1.hprof文件进行查看分析(数据库中使用命令”Select * from instanceof android.app.Activity来查看对象,对象越多内存泄漏越严重)

  • 相关阅读:
    战略就是做出各种选择和不断权衡取舍;战略就是要刻意与众不同
    获取基目录,它由程序集冲突解决程序用来探测程序集
    Entity Framework的原理及使用方式
    NHibernate使用之详细图解
    最重要的不是你认识多少个人,而是你认识多少种人
    强关系利于执行,弱关系利于创新
    判断它是不是你的社群成员,你要看它对你的态度
    粉丝不在于多,在于够残
    没有请不起的人才,只有付不起的诚意
    所有有可能被互联网取代的组织一定会被取代--颠覆式创新研习社
  • 原文地址:https://www.cnblogs.com/JianXu/p/5164011.html
Copyright © 2020-2023  润新知