您的位置:首页 > 移动开发 > Android开发

android测试之getevent/sendevent

2014-03-12 20:27 453 查看
http://source.android.com/devices/tech/input/index.html

关于在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: 00030039 000002a5

/dev/input/event0: 0003003000000004

/dev/input/event0: 00030035 0000017b

/dev/input/event0: 00030036 000001cf

/dev/input/event0: 0003 003a
0000001c

/dev/input/event0: 0000000000000000

/dev/input/event0: 00030039 ffffffff

/dev/input/event0: 0000000000000000

很难辨认,加-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: 0001006600000001

/dev/input/event0: 0000000000000000

/dev/input/event0: 0001006600000000

/dev/input/event0: 0000000000000000

/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 0003005700000000
<---事件开始

sendevent /dev/input/event1 0003004800000010
<---点击开始

sendevent /dev/input/event1 0003005800000070
<--- 触摸范围

sendevent /dev/input/event1 0003005300000120
<--- x坐标

sendevent /dev/input/event1 0003005400000254
<--- y坐标

sendevent /dev/input/event1 0000000000000000
<---点击结束(同步)

sendevent /dev/input/event1 000300574294967295
<---事件结束

sendevent /dev/input/event1 0000000000000000
<---事件同步

翻译为:

type code value

EV_ABS ABS_MT_TRACKING_ID 00000000 <---事件开始

EV_ABS ABS_MT_TOUCH_MAJOR00000010 <---点击开始

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 000101020000000001

sendevent /dev/input/event0 000000000000000000

sendevent /dev/input/event0 000101020000000000

sendevent /dev/input/event0 000000000000000000

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

①对于文本输入,以下字符需要加 \ 进行转义:

` ' " ~ # & ( ) | \ ; < >

②对于longTouch,使用input如何模拟?

③最后,在android中不管使用sendevent或者input,如何能模拟输入非ASCII字符呢,比如中文?

这是个难题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: