getevent 和 sendevent

android 系统下的一个工具,可以模拟多种按键和触屏操作

这两个命令的源码在 system/core/toolbox/下,sendevent.c 和 getevent.c

getevent

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 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 进制

基于 adb 指令实现录制回放

前面内容介绍了 getevent 和 sendevent 的使用方法,那么可以怎么利用起来呢?

很容易想到通过 getevent 录制某个场景的操作,再通过 sendevent 发送给设备,就可以实现录制回放功能

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐