前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android getevent,sendevent,input keyevent

Android getevent,sendevent,input keyevent

作者头像
DragonKingZhu
发布2020-03-24 16:01:30
1.8K0
发布2020-03-24 16:01:30
举报

前言

getevent和sendevent是Android系统自带的获取设备的收发事件和模拟设备事件进行自动话测试。而input keyevent也在自动话测试中有很大的作用,用于模拟常用按键等。接下来就一一是实践角度分析此三个工具的使用方法。

getevent

进入android手机,然后输入getevent --help就可以查看该工具使用方法。

代码语言:javascript
复制
test@123:/data # getevent --help                                    
getevent: invalid option --
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

简单说几个常见的参数。【-t】显示事件发生的时间,【-p】显示设备上支持的事件类型和编码,【-l】显示事件类型的信息以标签的形式,【-r】事件出现的频率。

下面执行例子说明,执行如下的命令,然后按下手机的音量上键和下键

代码语言:javascript
复制
getevent -t

执行结果如下:

代码语言:javascript
复制
test@123:/data # getevent -t                                      
could not get driver version for /dev/input/mice, Not a typewriter
add device 1: /dev/input/event0
  name:     "xxx-gpio-keys"
add device 2: /dev/input/event3
  name:     "..............."
add device 3: /dev/input/event2
  name:     "................."
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 4: /dev/input/event1
  name:     "adaptive_ts"
[    1488.476515] /dev/input/event0: 0001 0073 00000001
[    1488.476515] /dev/input/event0: 0000 0000 00000000
[    1488.631825] /dev/input/event0: 0001 0073 00000000
[    1488.631825] /dev/input/event0: 0000 0000 00000000
[    1489.424382] /dev/input/event0: 0001 0072 00000001
[    1489.424382] /dev/input/event0: 0000 0000 00000000
[    1489.548998] /dev/input/event0: 0001 0072 00000000
[    1489.548998] /dev/input/event0: 0000 0000 00000000

我们需要对上述的一串数字进行说明,如下图:

看上图就可以看的一目了然了,而这些事件的定义在kernel/include/linux/input.h中。

代码语言:javascript
复制
/**
 * struct input_value - input value representation
 * @type: type of value (EV_KEY, EV_ABS, etc)
 * @code: the value code
 * @value: the value
 */
struct input_value {
	__u16 type;
	__u16 code;
	__s32 value;
};

此结构体不就是上述设备名字后面的三列数据的定义。 而所谓的事件类型定义如下:

代码语言:javascript
复制
/*
 * Event types
 */

#define EV_SYN			0x00
#define EV_KEY			0x01
#define EV_REL			0x02
#define EV_ABS			0x03
#define EV_MSC			0x04
#define EV_SW			0x05
#define EV_LED			0x11
#define EV_SND			0x12
#define EV_REP			0x14
#define EV_FF			0x15
#define EV_PWR			0x16
#define EV_FF_STATUS		0x17
#define EV_MAX			0x1f
#define EV_CNT			(EV_MAX+1)

常见的事件类型有EV_SYN(同步事件),EV_KEY(按键事件),EV_ABS(绝对事件)。而每个事件下面有不同的code定义,就按键事件下就有很多code,不在此一一列举了。列去三个我们下面要用到的。

代码语言:javascript
复制
#define KEY_VOLUMEDOWN		114
#define KEY_VOLUMEUP		115
#define KEY_POWER		116	/* SC System Power Down */
#define BTN_TOUCH		0x14a

ok,这下我们就很快能解析上述数据的含义了。注意(每个事件完成后都会存在一个KEY_SYN同步事件,用于同步上报事件。所有的数据是十六机制显示)

当然了,如果你觉得上面识别还是很不方法,可以使用-l参数。

代码语言:javascript
复制
test@123:/data # getevent -tl                                     
could not get driver version for /dev/input/mice, Not a typewriter
add device 1: /dev/input/event0
  name:     "xxxx-gpio-keys"
add device 2: /dev/input/event3
  name:     "xxxxx"
add device 3: /dev/input/event2
  name:     "xxx"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 4: /dev/input/event1
  name:     "adaptive_ts"
[    3246.862919] /dev/input/event0: EV_KEY       KEY_VOLUMEUP         DOWN                
[    3246.862919] /dev/input/event0: EV_SYN       SYN_REPORT           00000000            
[    3247.058640] /dev/input/event0: EV_KEY       KEY_VOLUMEUP         UP                  
[    3247.058640] /dev/input/event0: EV_SYN       SYN_REPORT           00000000            
[    3266.495595] /dev/input/event0: EV_KEY       KEY_VOLUMEDOWN       DOWN                
[    3266.495595] /dev/input/event0: EV_SYN       SYN_REPORT           00000000            
[    3266.635165] /dev/input/event0: EV_KEY       KEY_VOLUMEDOWN       UP                  
[    3266.635165] /dev/input/event0: EV_SYN       SYN_REPORT           00000000  

从上就可以很方便的辨别是按键事件,分别为按下/抬起音量上键,按下/抬起音量下键。

接下来分析下绝对事件,一般为触摸屏事件。同样的办法执行getevent -t,然后按下触摸屏。

代码语言:javascript
复制
test@123:/data # getevent -t                                          
could not get driver version for /dev/input/mice, Not a typewriter
add device 1: /dev/input/event0
  name:     "xxx-gpio-keys"
add device 2: /dev/input/event3
  name:     "xxxx"
add device 3: /dev/input/event2
  name:     "xxxx"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 4: /dev/input/event1
  name:     "adaptive_ts"
[    3449.957951] /dev/input/event1: 0003 0039 00000040
[    3449.957951] /dev/input/event1: 0003 0035 00000166
[    3449.957951] /dev/input/event1: 0003 0036 000001c5
[    3449.957951] /dev/input/event1: 0001 014a 00000001
[    3449.957951] /dev/input/event1: 0000 0000 00000000
[    3449.995643] /dev/input/event1: 0003 0039 ffffffff
[    3449.995643] /dev/input/event1: 0001 014a 00000000
[    3449.995643] /dev/input/event1: 0000 0000 00000000

和上述一样,就不贴图分析数据了,直接说明数据的内容。

设备类型为/dev/input/event1,该input事件用作触摸屏事件。

0003: 代表事件类型为EV_ABS事件,0001为EV_KEY事件,0000为EV_SYN事件。

关于EV_ABS事件的code,需要贴出几个常见的code。

代码语言:javascript
复制
#define ABS_MT_ORIENTATION	0x34	/* Ellipse orientation */
#define ABS_MT_POSITION_X	0x35	/* Center X touch position */
#define ABS_MT_POSITION_Y	0x36	/* Center Y touch position */
#define ABS_MT_TOOL_TYPE	0x37	/* Type of touching device */
#define ABS_MT_BLOB_ID		0x38	/* Group a set of packets as a blob */
#define ABS_MT_TRACKING_ID	0x39	/* Unique ID of initiated contact */
#define ABS_MT_PRESSURE		0x3a	/* Pressure on contact area */

code=0x39代表一个唯一的ID。

code=0x35代表触摸器按下的x坐标。

code=0x36代表触摸屏按下的y坐标。

可以按到上述按下的触摸屏坐标是: (0x166,0x1c5)=十进制(358,453)。

执行getevent -p命令可以看到设备尺寸等信息。

代码语言:javascript
复制
add device 4: /dev/input/event1
  name:     "adaptive_ts"
  events:
    KEY (0001): 009e  00ac  014a  0244 
    ABS (0003): 0000  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                0001  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                002f  : value 0, min 0, max 9, fuzz 0, flat 0, resolution 0
                0035  : value 0, min 0, max 720, fuzz 0, flat 0, resolution 0
                0036  : value 0, min 0, max 1280, fuzz 0, flat 0, resolution 0
                0039  : value 0, min 0, max 65535, fuzz 0, flat 0, resolution 0
  input props:
    INPUT_PROP_DIRECT

比如0x35和0x36就对应的是该手机的尺寸的大小,大小是720*1280的。如果通过获得x,y坐标存在问题,可以通过如下公式转化:

代码语言:javascript
复制
x=(x-xmin)*480/(xmax-xmin) ;
y=(y-ymin)*800/(ymax-ymin);

sendevent

和getevent方法一样,通过sendevent --help就可以获得使用方法。

代码语言:javascript
复制
test@123:/data # sendevent --help                                   
use: sendevent device type code value

发送按下power按键

代码语言:javascript
复制
sendevent /dev/input/event0 0001 0074 00000001       
sendevent /dev/input/event0 0000 0000 00000000       
sendevent /dev/input/event0 0001 0074 00000000       
sendevent /dev/input/event0 0000 0000 00000000 

input keyevent

用法如下:

input keyevent <keycode>

关于keycode可以通过查看Monkey常用的键值表。

代码语言:javascript
复制
0 -->  "KEYCODE_UNKNOWN"
1 -->  "KEYCODE_MENU"
2 -->  "KEYCODE_SOFT_RIGHT"
3 -->  "KEYCODE_HOME"
4 -->  "KEYCODE_BACK"
5 -->  "KEYCODE_CALL" 

如果想使用命令拨打电话,直接使用: input keyevent 5即可。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • getevent
  • sendevent
  • input keyevent
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档