getevent&sendevent 是android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。
=== getevent ===
getevent 监控当前的事件,鼠标事件,按键事件,拖动滑动等
dd device 1: /dev/input/event0
name: "qwerty2"
/dev/input/event0: 0001 001e 00000001
/dev/input/event0: 0001 001e 00000000
其中/dev/input/event0是device的名字 0001是type, 001e是键码, 最后一个根据type不同而不同
比如上面的倒数第二条就是按下a键的keydown,最后一个是按下a的keyup
具体的type,code,value的定义可以在源码/frameworks/base/core/java/android/view/KeyEvent.java中找到
=== sendevent ===
命令格式2:adb shell sendevent [device] [type] [code] [value]
发送时间,格式和上面的一样,需要注意的是在get中code显示的是十六进制,而send中需要用十进制,例如
# sendevent /dev/input/event0 1 5 1
这个命令就是发送数字4的keydown消息,所以在屏幕上就会一直打印出很多个4(因为没有发送keyup)
如: adb shell sendevent /dev/input/event0 1 229 1 代表按下按下menu键
adb shell sendevent /dev/input/event0 1 229 0 代表按下松开menu键
说明:上述的命令需组合使用
另外所知道的命令如下:
Key Name CODE
MENU 229
HOME 102
BACK (back button) 158
CALL (call button) 231
END (end call button) 107
2. 发送鼠标事件(Touch):
命令格式:adb shell sendevent [device] [type] [code] [value]
情况1:在某坐标点上touch
如在屏幕的x坐标为40,y坐标为210的点上touch一下,命令如下
adb shell sendevent /dev/input/event0 3 0 40
adb shell sendevent /dev/input/event0 3 1 210
adb shell sendevent /dev/input/event0 1 330 1 //touch
adb shell sendevent /dev/input/event0 0 0 0 //it must have
adb shell sendevent /dev/input/event0 1 330 0 //untouch
adb shell sendevent /dev/input/event0 0 0 0 //it must have
注:以上六组命令必须配合使用,缺一不可
情况2:模拟滑动轨迹(可下载并采用aPaint软件进行试验)
如下例是在aPaint软件上画出一条开始于(100,200),止于(108,200)的水平直线
adb shell sendevent /dev/input/event0 3 0 100 //start from point (100,200)
adb shell sendevent /dev/input/event0 3 1 200
adb shell sendevent /dev/input/event0 1 330 1 //touch
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 3 0 101 //step to point (101,200)
adb shell sendevent /dev/input/event0 0 0 0
…………………… //must list each step, here just skip
adb shell sendevent /dev/input/event0 3 0 108 //end point(108,200)
adb shell sendevent /dev/input/event0 0 0 0
adb shell sendevent /dev/input/event0 1 330 0 //untouch
adb shell sendevent /dev/input/event0 0 0 0
参考:
http://topic.csdn.net/u/20100326/17/1f0fc5a1-3bd2-4294-aa35-1bcb73357aa3.html
http://www.51testing.com/html/65/n-215865-2.html
From: http://blog.csdn.net/lichaoandy/article/details/6565893
//*****************************************************************************************************
getevent 旨在获取android设备的事件信息,具体参考详细用法
sendevent 则可以向设备发送模拟事件,其中包括touch和keypress
详细用法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
Usage
:
sendevent
<
device
>
<
type
>
<
code
>
<
value
>
|
首先,adb shell进入android设备,运行getevent命令得到如下信息,为各类事件的驱动设备,每部
硬件可能都不一样,可以说无规律可循,个人觉得掠过吧
1
2
3
4
5
6
7
8
9
10
11
12
13
|
add
device
1
:
/
dev
/
input
/
event1
name
:
"pmic8xxx_pwrkey"
add
device
2
:
/
dev
/
input
/
event3
name
:
"apq8064-tabla-snd-card Headset Jack"
add
device
3
:
/
dev
/
input
/
event2
name
:
"apq8064-tabla-snd-card Button Jack"
add
device
4
:
/
dev
/
input
/
event5
name
:
"gpio-keys"
could
not
get
driver
version
for
/
dev
/
input
/
mice
,
Not
a
typewriter
add
device
5
:
/
dev
/
input
/
event0
name
:
"atmel_mxt_ts"
add
device
6
:
/
dev
/
input
/
event4
name
:
"mhl_rcp"
|
在点击设备屏幕之后得到:
1
2
3
4
5
6
7
8
|
/
dev
/
input
/
event0
:
0003
0039
000002a5
/
dev
/
input
/
event0
:
0003
0030
00000004
/
dev
/
input
/
event0
:
0003
0035
0000017b
/
dev
/
input
/
event0
:
0003
0036
000001cf
/
dev
/
input
/
event0
:
0003
003a
0000001c
/
dev
/
input
/
event0
:
0000
0000
00000000
/
dev
/
input
/
event0
:
0003
0039
ffffffff
/
dev
/
input
/
event0
:
0000
0000
00000000
|
很难辨认,加-l参数后得到 ( getevent -l )
1
2
3
4
5
6
7
8
|
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TRACKING
_ID
000002a6
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TOUCH
_MAJOR
00000004
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_X
0000017b
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_Y
000001cf
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT
_PRESSURE
0000001c
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TRACKING_ID
ffffffff
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
|
格式为 device: type code value,即 设备、输入设备类型、按键扫描码、附加码,具体定义可从kernel/include/linux/input.h中获得,至于这个头文件,途径之一是从google官网源码中获取:
type: 输入设备类型,在手机系统中经常使用的键盘(keyboard)和小键盘(kaypad)属于按键设
备EV_KEY,轨迹球属于相对设备EV_REL,触摸屏属于绝对设备EV_ABS
code: 按键扫描码,区别于ASCII码和SDK中KeyEvent的键码
value: 附加码,1/0 down/up
第一行:可理解为一次touch的开始
第2行:可理解为点击开始
第3行:触摸点x坐标
第4行:触摸点y坐标
第5行:可理解为触摸点大小
第6行:事件同步(点击结束)
第7行:一次touch结束
第8行:事件同步(事件结束)
一次touch此8行是必须的,如果是longTouch呢,在touch的基础上,重复若干次第2~6行,即看起
来可能是这样子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TRACKING
_ID
000002a6
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TOUCH
_MAJOR
00000004
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_X
0000017b
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_Y
000001cf
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT
_PRESSURE
0000001c
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TOUCH
_MAJOR
00000004
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_X
0000017b
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_Y
000001cf
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT
_PRESSURE
0000001c
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TOUCH
_MAJOR
00000004
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_X
0000017b
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_POSITION
_Y
000001cf
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT
_PRESSURE
0000001c
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
.
.
.
.
.
.
/
dev
/
input
/
event0
:
EV_ABS
ABS_MT_TRACKING_ID
ffffffff
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
|
如果是drag呢,在longTouch的基础上,xy坐标从起点到终点是渐变的,其他可认为一样。
对于按键,HOME为例,一目了然:
1
2
3
4
5
6
7
8
9
|
/
dev
/
input
/
event0
:
0001
0066
00000001
/
dev
/
input
/
event0
:
0000
0000
00000000
/
dev
/
input
/
event0
:
0001
0066
00000000
/
dev
/
input
/
event0
:
0000
0000
00000000
/
dev
/
input
/
event0
:
EV_KEY
KEY_HOME
DOWN
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
/
dev
/
input
/
event0
:
EV_KEY
KEY_HOME
UP
/
dev
/
input
/
event0
:
EV_SYN
SYN
_REPORT
00000000
|
所以清楚了之后,使用sendevent进行事件模拟就很轻松了,关键是从input.h中获取按键对应的扫
描码,也许每个版本的系统中input.h的内容都稍有不同,这个很头疼。
值得注意的是使用getevent获取的数值都是16进制的,而sendevent使用的是10进制的,需要进行
转换。
如点击坐标: 120,254
1
2
3
4
5
6
7
8
|
sendevent
/
dev
/
input
/
event1
0003
0057
00000000
<
--
-事件开始
sendevent
/
dev
/
input
/
event1
0003
0048
00000010
<
--
-点击开始
sendevent
/
dev
/
input
/
event1
0003
0058
00000070
<
--
-
触摸范围
sendevent
/
dev
/
input
/
event1
0003
0053
00000120
<
--
-
x坐标
sendevent
/
dev
/
input
/
event1
0003
0054
00000254
<
--
-
y坐标
sendevent
/
dev
/
input
/
event1
0000
0000
00000000
<
--
-点击结束
(同步
)
sendevent
/
dev
/
input
/
event1
0003
0057
4294967295
<
--
-事件结束
sendevent
/
dev
/
input
/
event1
0000
0000
00000000
<
--
-事件同步
|
翻译为:
type code value
EV_ABS ABS_MT_TRACKING_ID 00000000 <—事件开始
EV_ABS ABS_MT_TOUCH_MAJOR 00000010 <—点击开始
EV_ABS ABS_MT_PRESSURE 00000070 <— 触摸范围
EV_ABS ABS_MT_POSITION_X 00000120 <— x坐标
EV_ABS ABS_MT_POSITION_Y 00000254 <— y坐标
EV_SYN SYN_REPORT 00000000 <—点击结束(同步)
EV_ABS ABS_MT_TRACKING_ID 4294967295 <—事件结束
EV_SYN SYN_REPORT 00000000 <—事件同步
对于longTouch,重复几次上面提到的步骤,而drag再弄个坐标渐变。
按键方面(MENU) DOWN:1 UP:0
1
2
3
4
5
6
7
8
9
|
sendevent
/
dev
/
input
/
event0
0001
0102
0000000001
sendevent
/
dev
/
input
/
event0
0000
0000
0000000000
sendevent
/
dev
/
input
/
event0
0001
0102
0000000000
sendevent
/
dev
/
input
/
event0
0000
0000
0000000000
EV_KEY
KEY_MENU
DOWN
EV_SYN
SYN
_REPORT
00000000
EV_KEY
KEY_MENU
UP
EV_SYN
SYN
_REPORT
00000000
|
此外还可以模拟可见字符按键。
到这里是否觉得getevent好用好理解,但sendevent却超级麻烦。没关系,如果真不想用sendevent
模拟事件的话,可以转向input命令。
个人觉得这个input命令是个重量级的东东,调用时间非常长,貌似低系统版本和高系统版本的input提
供的功能还不一样,但它毕竟好用啊,如下:
1
2
3
4
5
|
usage
:
input
.
.
.
input
text
<
string
>
input
keyevent
<
key
code
number
or
name
>
input
tap
<
x
>
<
y
>
input
swipe
<
x1
>
<
y1
>
<
x2
>
<
y2
>
|
可见除了longTouch无法模拟之外,其他的都很简便了
输入文本: input text abcdefg
按键 : input keyevent KEYCODE_MENU
点击 : input tap 100 300
拖拽 : input swipe 100 600 500 600
①对于文本输入,以下字符需要加 进行转义:
` ‘ ” ~ # & ( ) | ; < >
②对于longTouch,使用input如何模拟?
③最后,在android中不管使用sendevent或者input,如何能模拟输入非ASCII字符呢,比如中文?
这是个难题
此种方法可以实现在PC上对android设备事件的监听,但缺点是要连着电脑。如果无所谓脸部连着电脑,就可以到此为止了。
JAVA实现:
android中有个Process process = Runtime.getRuntime().exec()方法可以直接调用linux内核
如获取root权限
process = Runtime.getRuntime().exec(“su”);
就会弹出请求root权限的对话框。
正在尝试通过此方法直接调用getevent和sendevent
获取su、监听dev/input/event*·····
From: http://www.yxkfw.com/?p=1893