自动化工具 [Android 测试技术] getevent 和 sendevent 介绍和应用

半墙月影 · 2019年12月10日 · 1961 次阅读

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 发送给设备,就可以实现录制回放功能

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册