wilon.github.io icon indicating copy to clipboard operation
wilon.github.io copied to clipboard

Android adb getevent/sendevent 详解

Open wilon opened this issue 3 years ago • 0 comments

准备 adb events

  • 下载 adb ,配置执行命令行
  • 安卓手机打开调试,电脑连上数据线
  • 执行adb shell,进入shell即为成功

类型 events

执行getevent

add device 1: /dev/input/event5
  name:     "uinput-fpc"
add device 2: /dev/input/event4
  name:     "sdm660-snd-card-skush Button Jack"
add device 3: /dev/input/event3
  name:     "sdm660-snd-card-skush Headset Jack"
add device 4: /dev/input/event0
  name:     "qpnp_pon"
could not get driver version for /dev/input/mice, Not a typewriter
add device 5: /dev/input/event2
  name:     "gpio-keys"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 6: /dev/input/event1
  name:     "synaptics_dsx"
/dev/input/event0    # 按键事件0
/dev/input/event2    # 按键事件2
/dev/input/event1    # 屏幕事件

例:电源键音量- 是 event0,音量+event2

参数变量 events

event 执行有三个变量:${事件} ${事件码} ${事件码参数}

参考:https://blog.csdn.net/muyimo/article/details/48733661

a. ${事件} 常量

#define EV_SYN			0x00
#define EV_KEY			0x01
#define EV_REL			0x02
#define EV_ABS			0x03

c. ${事件码} 常量

EV_SYN

#define SYN_REPORT          0  
#define SYN_CONFIG          1  
#define SYN_MT_REPORT   2  

EV_KEY 太多...略

EV_ABS 手跟屏幕的接触面类似椭圆,所以有以下参数

#define ABS_MT_TOUCH_MAJOR  0x30    /* 48 触摸椭圆的长轴 */
#define ABS_MT_TOUCH_MINOR  0x31    /* 49 触摸椭圆的短轴(如果为圆形则省略) */
#define ABS_MT_WIDTH_MAJOR  0x32    /* 50 近似触摸椭圆的主轴 */
#define ABS_MT_WIDTH_MINOR  0x33    /* 51 近似触摸椭圆的短轴(如果为圆形则省略) */
#define ABS_MT_ORIENTATION  0x34    /* 52 触摸椭圆的斜度 */
#define ABS_MT_POSITION_X   0x35    /* 53 触摸椭圆的中心X */
#define ABS_MT_POSITION_Y   0x36    /* 54 触摸椭圆的中心Y */
#define ABS_MT_TOOL_TYPE    0x37    /* 55 触摸设备的类型 */
#define ABS_MT_BLOB_ID      0x38    /* 56 将包分组为blob ?。。 */
#define ABS_MT_TRACKING_ID  0x39    /* 57 初始触摸的唯一ID */
#define ABS_MT_PRESSURE     0x3a    /* 58 触摸区域压力 */

b. ${事件码参数} 常量

根据 ${事件码} 来定义

记录 getevent

getevent${事件} ${事件码} ${事件码参数},三个变量是16进制,例:

/dev/input/event1: 0001 014a 00000000
/dev/input/event1: 0000 0000 00000000
/dev/input/event0: 0001 0074 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0074 00000000
/dev/input/event0: 0000 0000 00000000
/dev/input/event2: 0001 0072 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 0072 00000000
/dev/input/event2: 0000 0000 00000000

发送 sendevent

event 执行:${事件} ${事件码} ${事件码参数},三个变量是10进制

例1:点击电源键

sendevent /dev/input/event0 1 116 1    # 按下电源键
sendevent /dev/input/event0 0 0 0        # 按下电源键done
sendevent /dev/input/event0 1 116 0    # 弹起电源键
sendevent /dev/input/event0 0 0 0        # 弹起电源键done

解析:event0 1 116 1,${键事件} EV_KEY,${键事件码} 116,${键事件码参数} 1按下,0弹起。 必须有done,否则就成了长按。

例2:滑动屏幕,画一个 L

// 开始
sendevent /dev/input/event1 3 57 30654      # 事件EV_ABS,初始接触的唯一ID,自增
sendevent /dev/input/event1 1 330 1         # 事件EV_KEY,按下屏幕

// L 起点
sendevent /dev/input/event1 3 53 260        # 事件EV_ABS,触摸椭圆的中心X
sendevent /dev/input/event1 3 54 856        # 事件EV_ABS,触摸椭圆的中心Y
sendevent /dev/input/event1 3 48 4          # 事件EV_ABS,触摸椭圆的长轴
sendevent /dev/input/event1 3 49 3          # 事件EV_ABS,触摸椭圆的短轴
sendevent /dev/input/event1 0 0 0           # done

// L 转折点
sendevent /dev/input/event1 3 53 260        # 事件EV_ABS,触摸椭圆的中心X
sendevent /dev/input/event1 3 54 1432        # 事件EV_ABS,触摸椭圆的中心Y
sendevent /dev/input/event1 3 48 5          # 事件EV_ABS,触摸椭圆的长轴
sendevent /dev/input/event1 3 49 3          # 事件EV_ABS,触摸椭圆的短轴
sendevent /dev/input/event1 0 0 0           # done

// L 终点
sendevent /dev/input/event1 3 53 536        # 事件EV_ABS,触摸椭圆的中心X
sendevent /dev/input/event1 3 54 1432        # 事件EV_ABS,触摸椭圆的中心Y
sendevent /dev/input/event1 3 48 5          # 事件EV_ABS,触摸椭圆的长轴
sendevent /dev/input/event1 3 49 3          # 事件EV_ABS,触摸椭圆的短轴
sendevent /dev/input/event1 0 0 0           # done

// 结束
sendevent /dev/input/event1 3 57 4294967295 # 事件EV_ABS,初始接触的唯一ID end
sendevent /dev/input/event1 1 330 0         # 事件EV_KEY,离开屏幕
sendevent /dev/input/event1 0 0 0           # done

wilon avatar Jul 03 '20 07:07 wilon