android 系统下的一个工具,可以模拟多种按键和触屏操作
这两个命令的源码在 system/core/toolbox/下,sendevent.c 和 getevent.c
getevent 的用法:
getevent --help
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
日常使用的主要是不带参数
130|Note9:/ $ getevent
add device 1: /dev/input/event5
name: "sm6150-qrd-snd-card Button Jack"
add device 2: /dev/input/event4
name: "sm6150-qrd-snd-card Headset Jack"
add device 3: /dev/input/event2
name: "himax-touchscreen"
add device 4: /dev/input/event0
name: "qpnp_pon"
add device 5: /dev/input/event1
name: "sf-keys"
add device 6: /dev/input/event3
name: "gpio-keys"
这里可以看到,当前手机存在 6 个 devices
/dev/input/event3: 0001 0073 00000001
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0001 0073 00000000
/dev/input/event3: 0000 0000 00000000
从这里的信息可以看出:
1、getevent 指令得到的信息格式固定
2、getevent 得到的参数都是以 16 进制表示
那这个格式的信息分别代表的是什么?
输入 getevent -l 查看,同样操作显示如下:
//按下音量+键
/dev/input/event3: EV_KEY KEY_VOLUMEUP DOWN
/dev/input/event3: EV_SYN SYN_REPORT 00000000
//抬起音量+键
/dev/input/event3: EV_KEY KEY_VOLUMEUP UP
/dev/input/event3: EV_SYN SYN_REPORT 00000000
类似的,可以看一个触摸操作:
/dev/input/event2: 0001 014a 00000001
/dev/input/event2: 0003 0030 000000d2
/dev/input/event2: 0003 0039 00000000
/dev/input/event2: 0003 0035 0000042c
/dev/input/event2: 0003 0036 00000522
/dev/input/event2: 0003 0032 000000d2
/dev/input/event2: 0003 003a 000000d2
/dev/input/event2: 0000 0000 00000000
.......
/dev/input/event2: 0003 0039 ffffffff
/dev/input/event2: 0001 014a 00000000
/dev/input/event2: 0000 0000 00000000
//touch down
/dev/input/event2: EV_KEY BTN_TOUCH DOWN
/dev/input/event2: EV_ABS ABS_MT_TOUCH_MAJOR 000000e5
//这个ID在一直递增
/dev/input/event2: EV_ABS ABS_MT_TRACKING_ID 00000000
//XY坐标
/dev/input/event2: EV_ABS ABS_MT_POSITION_X 0000042d
/dev/input/event2: EV_ABS ABS_MT_POSITION_Y 00000637
//触摸面积
/dev/input/event2: EV_ABS ABS_MT_WIDTH_MAJOR 000000e5
/dev/input/event2: EV_ABS ABS_MT_PRESSURE 000000e5
//同步信号
/dev/input/event2: EV_SYN SYN_REPORT 00000000
......
//id停止递增
/dev/input/event2: EV_ABS ABS_MT_TRACKING_ID ffffffff
//touch up
/dev/input/event2: EV_KEY BTN_TOUCH UP
//最后一个同步信号
/dev/input/event2: EV_SYN SYN_REPORT 00000000
具体的 tpye,code,value 的定义可参看 kernel/include/linux/input.h,不做细致分析
sendevent --help
usage: sendevent DEVICE TYPE CODE VALUE
注意:这里的值都是10进制的
通过 sendevent 可以将指定的指令组发送给设备,对设备进行操作了
例如刚才的音量键操作可以这样:
sendevent /dev/input/event3 1 115 1
sendevent /dev/input/event3 0 0 0
sendevent /dev/input/event3 1 115 0
sendevent /dev/input/event3 0 0 0
注意这里的参数是 10 进制
前面内容介绍了 getevent 和 sendevent 的使用方法,那么可以怎么利用起来呢?
很容易想到通过 getevent 录制某个场景的操作,再通过 sendevent 发送给设备,就可以实现录制回放功能