monkey脚本编写
1.monkey API详解
1.轨迹球事件
DispatchTrackball(long downTime,long eventTime,int action,float x,float y,float pressure,float size,int metaState,float xPrecision,float yPrecision,int device,int edgeFlags)
记住action,x,y三个参数即可! action 0为按下(KeyDown) 1代表弹起(KeyUp)
DispatchTrackball(5109520,5109520,0,1150,330,0,0,0,0,0,0,0)
DispatchTrackball(5109520,5109520,1,1150,330,0,0,0,0,0,0,0)
-------------------------------------------------------------------------------------
long downtime,键最初呗按下的事件
long eventTime,事件发生的时间
int action,动作:ACTION_DOWN=0, ACTION_UP=1,ACTION_MULTIPLE=2
int code,键值,参见附录
int repeat,重复次数
int metaState,当前按下的meta键的标识
int device,时间发生的设备ID
int scancode,上报点的信息
2.输入字符串事件
DispatchString(String text) ex:Dispatch(abcd)表示输入字符串abcd
3.点击事件
DispatchPointer(long downTime,long eventTime,int action,float x,float y,float pressure,float size,int metaState,float xPrecision,float yPrecision,int device,int edgeFlags)
4.启动应用
LauncherActivity(String pkg_name,String c1_name) ex:LauncherActivity(com.android.browser,com.android.browser.BrowserActivity) 这样就可以启动浏览器(BrowserActivity)这个应用了
5.等待事件
UserWait(long sleeptime) ex:UserWait(3000) 单位为ms
6.按下键值
DispatchPress(int keyCode)
7.长按键值
LongPress(int keyCode)
8.发送键值
DispatchKey(long downTime,long eventTime,int action,float x,float y,float pressure,float size,int metaState,float xPrecision,float yPrecision,int device,int edgeFlags)
9.开关软键盘
DispatchFlip(boolean keyboardOpen)
2.monkey脚本编写
1.了解下Monkey脚本编写规范
/**
* monkey event queue,It takes a script to produce events sample script format:
*
* <pre>
* type = raw events
* count = 10
* speed = 1.0
* start data >>
* captureDispatchPointer(5109520,5109520,0,230,75429,458,1814..........)
* captureDispatchKey(5113146,5113146,0,20,0,0,0,0)
* captureDispatchFlip(true)
* ...
* </pre>
* /
--------------------------------------
* type = raw events 指明脚本类型,一般不用更改
* count = 10 脚本执行次数,但是发现改成任何值都只执行1次,monkey命令可以指定执行次数,所以这里也不用更改
* speed = 1.0 命令执行速度,这里改动无影响,速率也可通过monkey命令行指定
* start data >> 相当于一个入口,说明脚本从下面开始执行
2.编写一个简单脚本
1)打开BU盾本应用
2)在文本框1中输入数字111,在文本框2中输入字母aaa
3)点击提交
# start Script
type = user
count = 10
speed = 1.0
start data>>
*********************
1.如何查看包名?
adb shell is data/data 发现budgen包名为“com.xuben.hellobugben”
2.如何查看应用名?
logcat | busybox grep START(确切的说是应用主界面名)
adb shell logcat | busybox grep START
*********************
LaunchActivity(com.xuben.hellobugben,com.xuben.hellobugben.ChangeActivity) #启动Bugben应用
captureDispatchPointer(10,10,0,327,231,1,1,-1,1,1,0,0) #选中文本框
captureDispatchPointer(10,10,1,327,231,1,1,-1,1,1,0,0) #选中文本框
$adb shell 后通过getevent命令进行:该坐标需要进行进制转换和分辨率调整
captureDispatchString(111) #确定输入内容:确定文本框1内容
captureDispatchPress(66) #确定输入内容:发送Enter键使输入内容从软键盘到文本框中 KEYCODE_ ENTER= 66
captureDispatchPointer(10,10,0,327,375,1,1,-1,1,1,0,0) #选中文本框
captureDispatchPointer(10,10,1,327,375,1,1,-1,1,1,0,0) #选中文本框
captureDispatchString(aaa) #确定输入内容:确定文本框1内容
captureDispatchPress(66) #确定输入内容:发送Enter键使输入内容从软键盘到文本框中 KEYCODE_ ENTER= 66
UserWait(500) #等待500毫秒captureDispatchPointer(10,10,0,555,999,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,555,999,1,1,-1,1,1,0,0)
************************************************完整脚本**********************************************************
# start script
type = user
count = 10
speed = 1.0
start data >>
LaunchActivity(com.xuben.hellobugben,com.xuben.hellobugben.ChangeActivity)
UserWait(5000)
captureDispatchPointer(10,10,0,327,231,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,0,327,231,1,1,-1,1,1,0,0)
captureDispatchString(111)
captureDispatchPress(66)
captureDispatchPointer(10,10,0,327,375,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,0,327,375,1,1,-1,1,1,0,0)
captureDispatchString(aaa)
captureDispatchPress(66)
captureDispatchPointer(10,10,0,500,600,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,500,600,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,0,327,744,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,327,744,1,1,-1,1,1,0,0)
UserWait(500)
captureDispatchPointer(10,10,0,555,999,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,555,999,1,1,-1,1,1,0,0)
以上代码另存为 input_bugben文件(monkey对文件格式无要求,可随意存储为像 .txt.文档)
adb push input_bugben /mnt/sdcard/
然后运行:::: adb shell monkey -v -f /mnt/sdcard/input_bugben 10 #运行该脚本10遍
3.坐标获取与转换(getevent&input keyevent)
1.getevent
$ adb shell getevent
device name type code value
/dev/input/event1: 0003 0030 000000c8
/dev/input/event1: 0003 0032 00000005
/dev/input/event1: 0003 0035 00000169
/dev/input/event1: 0003 0036 0000046c
/dev/input/event1: 0000 0000 00000000
........
type/code/value 源码:kernel/include/linux/input.h
# define ev_syn(同步时间) 0x00 表示一组完整事件已经完成
# define ev_key(Keyboard) 0x00
# define ev_rel(相对坐标) 0x00
# define ev_abs(绝对坐标) 0x00
--------------
/*
*Synchronization events.
*/
# define SYN_REPORT 0
# define SYN_CONFIG 1
# define SYN_MT_REPORT 2
--------------
0030:主接触面的长轴 0032:接触工具的长轴 0035:椭圆中心绝对坐标X 0036:椭圆中心绝对坐标Y
0035 0036 对应的是 169 46c: 该坐标点为Value为16进制的坐标值,10进制为(361,1132)该如何转换坐标呢?
$ adb shell getevent -p 找到当前设备,getevent显示 device name 为 /dev/input/enent1 对应的设备号:add device 4
code 0035/0036 X坐标 min为0 max为640 Y坐标 min为0 max位200 通过Android VNC Server源码 可反向退出如下计算公式
X = (x-xmin) * (getevent 十进制值 * 设备分辨率宽度) / ([0035max]-[0035min])
Y = (y-ymin) * (getevent 十进制值 * 设备分辨率高度) / ([0035max]-[0035min])
2.input keyevent
了解常用键值表,根据表格输入即可
$ adb shell input keyevent [key value]
$ adb shell input keyevent 82 查到menu的键值为82