Android getevent,sendevent,input keyevent
前言
getevent和sendevent是Android系统自带的获取设备的收发事件和模拟设备事件进行自动话测试。而input keyevent也在自动话测试中有很大的作用,用于模拟常用按键等。接下来就一一是实践角度分析此三个工具的使用方法。
getevent
进入android手机,然后输入getevent --help就可以查看该工具使用方法。
- test@123:/data # getevent --help
- getevent: invalid option --
- 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
下面执行例子说明,执行如下的命令,然后按下手机的音量上键和下键
- getevent -t
- test@123:/data # getevent -t
- could not get driver version for /dev/input/mice, Not a typewriter
- add device 1: /dev/input/event0
- name: "xxx-gpio-keys"
- add device 2: /dev/input/event3
- name: "..............."
- add device 3: /dev/input/event2
- name: "................."
- could not get driver version for /dev/input/mouse0, Not a typewriter
- add device 4: /dev/input/event1
- name: "adaptive_ts"
- [ 1488.476515] /dev/input/event0: 0001 0073 00000001
- [ 1488.476515] /dev/input/event0: 0000 0000 00000000
- [ 1488.631825] /dev/input/event0: 0001 0073 00000000
- [ 1488.631825] /dev/input/event0: 0000 0000 00000000
- [ 1489.424382] /dev/input/event0: 0001 0072 00000001
- [ 1489.424382] /dev/input/event0: 0000 0000 00000000
- [ 1489.548998] /dev/input/event0: 0001 0072 00000000
- [ 1489.548998] /dev/input/event0: 0000 0000 00000000
看上图就可以看的一目了然了,而这些事件的定义在kernel/include/linux/input.h中。
- /**
- * struct input_value - input value representation
- * @type: type of value (EV_KEY, EV_ABS, etc)
- * @code: the value code
- * @value: the value
- */
- struct input_value {
- __u16 type;
- __u16 code;
- __s32 value;
- };
- /*
- * Event types
- */
- #define EV_SYN 0x00
- #define EV_KEY 0x01
- #define EV_REL 0x02
- #define EV_ABS 0x03
- #define EV_MSC 0x04
- #define EV_SW 0x05
- #define EV_LED 0x11
- #define EV_SND 0x12
- #define EV_REP 0x14
- #define EV_FF 0x15
- #define EV_PWR 0x16
- #define EV_FF_STATUS 0x17
- #define EV_MAX 0x1f
- #define EV_CNT (EV_MAX+1)
- #define KEY_VOLUMEDOWN<span style="white-space:pre;"> </span>114
- #define KEY_VOLUMEUP<span style="white-space:pre;"> </span>115
- #define KEY_POWER<span style="white-space:pre;"> </span>116<span style="white-space:pre;"> </span>/* SC System Power Down */
- #define BTN_TOUCH<span style="white-space:pre;"> </span>0x14a
ok,这下我们就很快能解析上述数据的含义了。注意(每个事件完成后都会存在一个KEY_SYN同步事件,用于同步上报事件。所有的数据是十六机制显示)
当然了,如果你觉得上面识别还是很不方法,可以使用-l参数。
- test@123:/data # getevent -tl
- could not get driver version for /dev/input/mice, Not a typewriter
- add device 1: /dev/input/event0
- name: "xxxx-gpio-keys"
- add device 2: /dev/input/event3
- name: "xxxxx"
- add device 3: /dev/input/event2
- name: "xxx"
- could not get driver version for /dev/input/mouse0, Not a typewriter
- add device 4: /dev/input/event1
- name: "adaptive_ts"
- [ 3246.862919] /dev/input/event0: EV_KEY KEY_VOLUMEUP DOWN
- [ 3246.862919] /dev/input/event0: EV_SYN SYN_REPORT 00000000
- [ 3247.058640] /dev/input/event0: EV_KEY KEY_VOLUMEUP UP
- [ 3247.058640] /dev/input/event0: EV_SYN SYN_REPORT 00000000
- [ 3266.495595] /dev/input/event0: EV_KEY KEY_VOLUMEDOWN DOWN
- [ 3266.495595] /dev/input/event0: EV_SYN SYN_REPORT 00000000
- [ 3266.635165] /dev/input/event0: EV_KEY KEY_VOLUMEDOWN UP
- [ 3266.635165] /dev/input/event0: EV_SYN SYN_REPORT 00000000
接下来分析下绝对事件,一般为触摸屏事件。同样的办法执行getevent -t,然后按下触摸屏。
- test@123:/data # getevent -t
- could not get driver version for /dev/input/mice, Not a typewriter
- add device 1: /dev/input/event0
- name: "xxx-gpio-keys"
- add device 2: /dev/input/event3
- name: "xxxx"
- add device 3: /dev/input/event2
- name: "xxxx"
- could not get driver version for /dev/input/mouse0, Not a typewriter
- add device 4: /dev/input/event1
- name: "adaptive_ts"
- [ 3449.957951] /dev/input/event1: 0003 0039 00000040
- [ 3449.957951] /dev/input/event1: 0003 0035 00000166
- [ 3449.957951] /dev/input/event1: 0003 0036 000001c5
- [ 3449.957951] /dev/input/event1: 0001 014a 00000001
- [ 3449.957951] /dev/input/event1: 0000 0000 00000000
- [ 3449.995643] /dev/input/event1: 0003 0039 ffffffff
- [ 3449.995643] /dev/input/event1: 0001 014a 00000000
- [ 3449.995643] /dev/input/event1: 0000 0000 00000000
设备类型为/dev/input/event1,该input事件用作触摸屏事件。
0003: 代表事件类型为EV_ABS事件,0001为EV_KEY事件,0000为EV_SYN事件。
关于EV_ABS事件的code,需要贴出几个常见的code。
- #define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
- #define ABS_MT_POSITION_X 0x35 /* Center X touch position */
- #define ABS_MT_POSITION_Y 0x36 /* Center Y touch position */
- #define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
- #define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
- #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
- #define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
code=0x35代表触摸器按下的x坐标。
code=0x36代表触摸屏按下的y坐标。
可以按到上述按下的触摸屏坐标是: (0x166,0x1c5)=十进制(358,453)。
执行getevent -p命令可以看到设备尺寸等信息。
- add device 4: /dev/input/event1
- name: "adaptive_ts"
- events:
- KEY (0001): 009e 00ac 014a 0244
- ABS (0003): 0000 : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
- 0001 : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
- 002f : value 0, min 0, max 9, fuzz 0, flat 0, resolution 0
- 0035 : value 0, min 0, max 720, fuzz 0, flat 0, resolution 0
- 0036 : value 0, min 0, max 1280, fuzz 0, flat 0, resolution 0
- 0039 : value 0, min 0, max 65535, fuzz 0, flat 0, resolution 0
- input props:
- INPUT_PROP_DIRECT
- x=(x-xmin)*480/(xmax-xmin) ;
- y=(y-ymin)*800/(ymax-ymin);
sendevent
和getevent方法一样,通过sendevent --help就可以获得使用方法。
- test@123:/data # sendevent --help
- use: sendevent device type code value
发送按下power按键
- sendevent /dev/input/event0 0001 0074 00000001
- sendevent /dev/input/event0 0000 0000 00000000
- sendevent /dev/input/event0 0001 0074 00000000
- sendevent /dev/input/event0 0000 0000 00000000
input keyevent
用法如下:
input keyevent <keycode>
关于keycode可以通过查看Monkey常用的键值表。
- 0 --> "KEYCODE_UNKNOWN"
- 1 --> "KEYCODE_MENU"
- 2 --> "KEYCODE_SOFT_RIGHT"
- 3 --> "KEYCODE_HOME"
- 4 --> "KEYCODE_BACK"
- 5 --> "KEYCODE_CALL"