android测试之getevent/sendevent
2013-10-31 11:51
489 查看
http://www.ddjava.com/blog/blog.html?blogId=612
关于在android平台上捕获事件的资料互联网上已经铺天盖地,但个人觉得可用性都不太大,大部仅
针对特定设备,而对于其他设备引导性不强,故整理处本文,望对初学者有个有力的帮助:
getevent 旨在获取android设备的事件信息,具体参考详细用法(本人亦初学者一枚,无法深入解释)
sendevent 则可以向设备发送模拟事件,其中包括touch和keypress
详细用法如下:
源码复制打印?
Usage:
getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
-t:
show time stamps
-n:
don't print newlines
-s:
print switch states for given
bits
-S:
print all switch states
-v:
verbosity mask (errs=1,
dev=2,
name=4,
info=8,
vers=16,
pos. events=32,
props=64)
-d:
show HID descriptor, if available
-p:
show possible events (errs, dev, name, pos. events)
-i:
show all device info and possible events
-l:
label event types and names in plain text
-q:
quiet (clear verbosity mask)
-c:
print given number of events then exit
-r:
print rate events are received
Usage:
sendevent <device> <type> <code> <value>
首先,adb shell进入android设备,运行getevent命令得到如下信息,为各类事件的驱动设备,每部
硬件可能都不一样,可以说无规律可循,个人觉得掠过吧
源码复制打印?
add
device 1:
/dev/input/event1
name: "pmic8xxx_pwrkey"
add
device 2:
/dev/input/event3
name: "apq8064-tabla-snd-card
Headset Jack"
add
device 3:
/dev/input/event2
name: "apq8064-tabla-snd-card
Button Jack"
add
device 4:
/dev/input/event5
name: "gpio-keys"
could
not get driver version for /dev/input/mice,
Not a typewriter
add
device 5:
/dev/input/event0
name: "atmel_mxt_ts"
add
device 6:
/dev/input/event4
name: "mhl_rcp"
在点击设备屏幕之后得到:
源码复制打印?
/dev/input/event0: 0003 0039 000002a5
/dev/input/event0: 0003 0030 00000004
/dev/input/event0: 0003 0035 0000017b
/dev/input/event0: 0003 0036 000001cf
/dev/input/event0: 0003 003a
0000001c
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0003 0039 ffffffff
/dev/input/event0: 0000 0000 00000000
很难辨认,加-l参数后得到 ( getevent -l )
源码复制打印?
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID 000002a6
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID ffffffff
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
格式为 device: type code value,即 设备、输入设备类型、按键扫描码、附加码,具体定义可从kernel/include/linux/input.h中获得,至于这个头文件,途径之一是从google官网源码中获取:
type: 输入设备类型,在手机系统中经常使用的键盘(keyboard)和小键盘(kaypad)属于按键设
备EV_KEY,轨迹球属于相对设备EV_REL,触摸屏属于绝对设备EV_ABS
code: 按键扫描码,区别于ASCII码和SDK中KeyEvent的键码
value: 附加码,1/0 down/up
第一行:可理解为一次touch的开始
第2行:可理解为点击开始
第3行:触摸点x坐标
第4行:触摸点y坐标
第5行:可理解为触摸点大小
第6行:事件同步(点击结束)
第7行:一次touch结束
第8行:事件同步(事件结束)
一次touch此8行是必须的,如果是longTouch呢,在touch的基础上,重复若干次第2~6行,即看起
来可能是这样子:
源码复制打印?
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID 000002a6
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
......
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID ffffffff
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
如果是drag呢,在longTouch的基础上,xy坐标从起点到终点是渐变的,其他可认为一样。
对于按键,HOME为例,一目了然:
源码复制打印?
/dev/input/event0: 0001 0066 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0066 00000000
/dev/input/event0: 0000 0000 00000000
/dev/input/event0:
EV_KEY KEY_HOME DOWN
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_KEY KEY_HOME UP
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
所以清楚了之后,使用sendevent进行事件模拟就很轻松了,关键是从input.h中获取按键对应的扫
描码,也许每个版本的系统中input.h的内容都稍有不同,这个很头疼。
值得注意的是使用getevent获取的数值都是16进制的,而sendevent使用的是10进制的,需要进行
转换。
如点击坐标: 120,254
源码复制打印?
sendevent
/dev/input/event1 0003 0057 00000000 <---事件开始
sendevent
/dev/input/event1 0003 0048 00000010 <---点击开始
sendevent
/dev/input/event1 0003 0058 00000070 <--- 触摸范围
sendevent
/dev/input/event1 0003 0053 00000120 <--- x坐标
sendevent
/dev/input/event1 0003 0054 00000254 <--- y坐标
sendevent
/dev/input/event1 0000 0000 00000000 <---点击结束(同步)
sendevent
/dev/input/event1 0003 0057 4294967295 <---事件结束
sendevent
/dev/input/event1 0000 0000 00000000 <---事件同步
翻译为:
type code value
EV_ABS ABS_MT_TRACKING_ID 00000000 <---事件开始
EV_ABS ABS_MT_TOUCH_MAJOR 00000010 <---点击开始
EV_ABS ABS_MT_PRESSURE 00000070 <--- 触摸范围
EV_ABS ABS_MT_POSITION_X 00000120 <--- x坐标
EV_ABS ABS_MT_POSITION_Y 00000254 <--- y坐标
EV_SYN SYN_REPORT 00000000 <---点击结束(同步)
EV_ABS ABS_MT_TRACKING_ID 4294967295 <---事件结束
EV_SYN SYN_REPORT 00000000 <---事件同步
对于longTouch,重复几次上面提到的步骤,而drag再弄个坐标渐变。
按键方面(MENU) DOWN:1 UP:0
源码复制打印?
sendevent
/dev/input/event0 0001 0102 0000000001
sendevent
/dev/input/event0 0000 0000 0000000000
sendevent
/dev/input/event0 0001 0102 0000000000
sendevent
/dev/input/event0 0000 0000 0000000000
EV_KEY
KEY_MENU DOWN
EV_SYN
SYN_REPORT 00000000
EV_KEY
KEY_MENU UP
EV_SYN
SYN_REPORT 00000000
此外还可以模拟可见字符按键。
到这里是否觉得getevent好用好理解,但sendevent却超级麻烦。没关系,如果真不想用sendevent
模拟事件的话,可以转向input命令。
个人觉得这个input命令是个重量级的东东,调用时间非常长,貌似低系统版本和高系统版本的input提
供的功能还不一样,但它毕竟好用啊,如下:
源码复制打印?
usage:
input ...
input text <string>
input keyevent <key code number or name>
input tap <x> <y>
input swipe <x1> <y1> <x2> <y2>
可见除了longTouch无法模拟之外,其他的都很简便了
输入文本: input text abcdefg
按键 : input keyevent KEYCODE_MENU
点击 : input tap 100 300
拖拽 : input swipe 100 600 500 600
关于在android平台上捕获事件的资料互联网上已经铺天盖地,但个人觉得可用性都不太大,大部仅
针对特定设备,而对于其他设备引导性不强,故整理处本文,望对初学者有个有力的帮助:
getevent 旨在获取android设备的事件信息,具体参考详细用法(本人亦初学者一枚,无法深入解释)
sendevent 则可以向设备发送模拟事件,其中包括touch和keypress
详细用法如下:
源码复制打印?
Usage:
getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]
-t:
show time stamps
-n:
don't print newlines
-s:
print switch states for given
bits
-S:
print all switch states
-v:
verbosity mask (errs=1,
dev=2,
name=4,
info=8,
vers=16,
pos. events=32,
props=64)
-d:
show HID descriptor, if available
-p:
show possible events (errs, dev, name, pos. events)
-i:
show all device info and possible events
-l:
label event types and names in plain text
-q:
quiet (clear verbosity mask)
-c:
print given number of events then exit
-r:
print rate events are received
Usage:
sendevent <device> <type> <code> <value>
首先,adb shell进入android设备,运行getevent命令得到如下信息,为各类事件的驱动设备,每部
硬件可能都不一样,可以说无规律可循,个人觉得掠过吧
源码复制打印?
add
device 1:
/dev/input/event1
name: "pmic8xxx_pwrkey"
add
device 2:
/dev/input/event3
name: "apq8064-tabla-snd-card
Headset Jack"
add
device 3:
/dev/input/event2
name: "apq8064-tabla-snd-card
Button Jack"
add
device 4:
/dev/input/event5
name: "gpio-keys"
could
not get driver version for /dev/input/mice,
Not a typewriter
add
device 5:
/dev/input/event0
name: "atmel_mxt_ts"
add
device 6:
/dev/input/event4
name: "mhl_rcp"
在点击设备屏幕之后得到:
源码复制打印?
/dev/input/event0: 0003 0039 000002a5
/dev/input/event0: 0003 0030 00000004
/dev/input/event0: 0003 0035 0000017b
/dev/input/event0: 0003 0036 000001cf
/dev/input/event0: 0003 003a
0000001c
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0003 0039 ffffffff
/dev/input/event0: 0000 0000 00000000
很难辨认,加-l参数后得到 ( getevent -l )
源码复制打印?
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID 000002a6
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID ffffffff
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
格式为 device: type code value,即 设备、输入设备类型、按键扫描码、附加码,具体定义可从kernel/include/linux/input.h中获得,至于这个头文件,途径之一是从google官网源码中获取:
type: 输入设备类型,在手机系统中经常使用的键盘(keyboard)和小键盘(kaypad)属于按键设
备EV_KEY,轨迹球属于相对设备EV_REL,触摸屏属于绝对设备EV_ABS
code: 按键扫描码,区别于ASCII码和SDK中KeyEvent的键码
value: 附加码,1/0 down/up
第一行:可理解为一次touch的开始
第2行:可理解为点击开始
第3行:触摸点x坐标
第4行:触摸点y坐标
第5行:可理解为触摸点大小
第6行:事件同步(点击结束)
第7行:一次touch结束
第8行:事件同步(事件结束)
一次touch此8行是必须的,如果是longTouch呢,在touch的基础上,重复若干次第2~6行,即看起
来可能是这样子:
源码复制打印?
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID 000002a6
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_ABS ABS_MT_TOUCH_MAJOR 00000004
/dev/input/event0:
EV_ABS ABS_MT_POSITION_X 0000017b
/dev/input/event0:
EV_ABS ABS_MT_POSITION_Y 000001cf
/dev/input/event0:
EV_ABS ABS_MT_PRESSURE 0000001c
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
......
/dev/input/event0:
EV_ABS ABS_MT_TRACKING_ID ffffffff
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
如果是drag呢,在longTouch的基础上,xy坐标从起点到终点是渐变的,其他可认为一样。
对于按键,HOME为例,一目了然:
源码复制打印?
/dev/input/event0: 0001 0066 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0066 00000000
/dev/input/event0: 0000 0000 00000000
/dev/input/event0:
EV_KEY KEY_HOME DOWN
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
/dev/input/event0:
EV_KEY KEY_HOME UP
/dev/input/event0:
EV_SYN SYN_REPORT 00000000
所以清楚了之后,使用sendevent进行事件模拟就很轻松了,关键是从input.h中获取按键对应的扫
描码,也许每个版本的系统中input.h的内容都稍有不同,这个很头疼。
值得注意的是使用getevent获取的数值都是16进制的,而sendevent使用的是10进制的,需要进行
转换。
如点击坐标: 120,254
源码复制打印?
sendevent
/dev/input/event1 0003 0057 00000000 <---事件开始
sendevent
/dev/input/event1 0003 0048 00000010 <---点击开始
sendevent
/dev/input/event1 0003 0058 00000070 <--- 触摸范围
sendevent
/dev/input/event1 0003 0053 00000120 <--- x坐标
sendevent
/dev/input/event1 0003 0054 00000254 <--- y坐标
sendevent
/dev/input/event1 0000 0000 00000000 <---点击结束(同步)
sendevent
/dev/input/event1 0003 0057 4294967295 <---事件结束
sendevent
/dev/input/event1 0000 0000 00000000 <---事件同步
翻译为:
type code value
EV_ABS ABS_MT_TRACKING_ID 00000000 <---事件开始
EV_ABS ABS_MT_TOUCH_MAJOR 00000010 <---点击开始
EV_ABS ABS_MT_PRESSURE 00000070 <--- 触摸范围
EV_ABS ABS_MT_POSITION_X 00000120 <--- x坐标
EV_ABS ABS_MT_POSITION_Y 00000254 <--- y坐标
EV_SYN SYN_REPORT 00000000 <---点击结束(同步)
EV_ABS ABS_MT_TRACKING_ID 4294967295 <---事件结束
EV_SYN SYN_REPORT 00000000 <---事件同步
对于longTouch,重复几次上面提到的步骤,而drag再弄个坐标渐变。
按键方面(MENU) DOWN:1 UP:0
源码复制打印?
sendevent
/dev/input/event0 0001 0102 0000000001
sendevent
/dev/input/event0 0000 0000 0000000000
sendevent
/dev/input/event0 0001 0102 0000000000
sendevent
/dev/input/event0 0000 0000 0000000000
EV_KEY
KEY_MENU DOWN
EV_SYN
SYN_REPORT 00000000
EV_KEY
KEY_MENU UP
EV_SYN
SYN_REPORT 00000000
此外还可以模拟可见字符按键。
到这里是否觉得getevent好用好理解,但sendevent却超级麻烦。没关系,如果真不想用sendevent
模拟事件的话,可以转向input命令。
个人觉得这个input命令是个重量级的东东,调用时间非常长,貌似低系统版本和高系统版本的input提
供的功能还不一样,但它毕竟好用啊,如下:
源码复制打印?
usage:
input ...
input text <string>
input keyevent <key code number or name>
input tap <x> <y>
input swipe <x1> <y1> <x2> <y2>
可见除了longTouch无法模拟之外,其他的都很简便了
输入文本: input text abcdefg
按键 : input keyevent KEYCODE_MENU
点击 : input tap 100 300
拖拽 : input swipe 100 600 500 600
相关文章推荐
- android测试之getevent/sendevent
- android测试之getevent/sendevent
- android测试之getevent/sendevent
- android测试之getevent/sendevent
- android测试之getevent/sendevent
- android测试之getevent/sendevent
- Android sendevent/getevent 用法
- Android sendevent/getevent 用法
- Android getevent / sendevent的用法
- android event事件录制回放 --1 getevent/sendevent 14-8-9
- Android sendevent/getevent 用法
- [android] 调试linux input子系统驱动的用户空间命令 getevent/sendevent
- Android getevent/sendevent的使用
- Android sendevent/getevent 用法
- Android sendevent/getevent 用法
- Android sendevent/getevent 用法
- Android sendevent/getevent 用法
- Android sendevent/getevent 用法
- [Android]getevent,sendevent,input命令的使用
- Android sendevent/getevent 用法