Android 自带了 getevent 和 sendevent,
分别用于获取设备报送的事件和模拟产生事件,前者用于辅助设备驱动的验证,后者用于模拟事件进行上层应用的验证。
关于event设备的获取,在 /proc/bus/input/devices 下面:
$ adb shell cat /proc/bus/input/devices
0 getevent和sendevent用法:
$ adb shell getevent -hUsage: 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
$ adb shell sendevent -h
use: sendevent device type code value
1、模拟发送一个Power键:
$ export KEYCODE_POWER=26$ input keyevent ${KEYCODE_HOME}
或者:
先获取gpio-keys event的设备接口:
$ adb shell cat /proc/bus/input/devices | grep -A 5 gpio-keys | grep event
H: Handlers=event5
# Press power button(Don't release)
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 1
$ adb shell sendevent /dev/input/event5 0 0 0
# Release power button
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 0
$ adb shell sendevent /dev/input/event5 0 0 0
2、模拟获取Power键的事件
先执行$ adb shell getevent /dev/input/event5
然后按下power键并观察输出:
按下时:
0001 0074 00000001
0000 0000 00000000
弹起来时:
0001 0074 00000000
0000 0000 00000000
可以看到更好跟我们上面模拟的一样,注,上面那些值是十六进制的,如果想要 更加直观地分析获取的上报事件可以参考 在 Android 通过 get_event 获得 input 设备 上报event
getevent/sendevent源码
这两个命令的源码在system/core/toolbox/下,sendevent.c getevent.c
getevent
使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息,如下:
add device 1: /dev/input/event1
name: "mxc_ts"
add device 2: /dev/input/event0
name: "mxckpd"
表明系统有两个event设备,分别对应着input设备touchscreen,keyboard
Android可以使用sendevent来模拟触屏,键盘以及其他类型的event事件,
sendevent /dev/input/eventX type code value
/dev/input/eventX 对应一个event设备,可以通过getevent获得可用的event设备
type, code, value的定义可参看kernel/include/linux/input.h
type如下定义