getevent&sendevent 是android系統下的一個工具,可以 模擬 多種按鍵和觸屏操作,產生的是raw event,raw event經過event hub處理產生最終的gesture事件。
這兩個命令的源碼在system/core/toolbox/下,sendevent.c getevent.c
關於event設備的獲取,在 /proc/bus/input/devices 下面:
$ adb shell cat /proc/bus/input/devices
=========================
一、getevent
獲取getevent 的使用方法 : getevent -h
getevent 監控當前的事件, 鼠標事件, 按鍵事件, 拖動滑動 以及其他類型的event事件;
使用getevent 獲得/dev/input/eventX設備 匯報的事件,這個命令會輸出所有event設備的 基本信息,如下:
shell@pc7625:/ $ getevent
add device 1: /dev/input/event6
name: "accel"
add device 2: /dev/input/event5
name: "goodix_ts"
add device 3: /dev/input/event0
name: "Power Button"
add device 4: /dev/input/event1
name: "Video Bus"
add device 5: /dev/input/event4
name: "baytrailaudio Intel MID Audio Jack"
add device 6: /dev/input/event2
name: "gpio-lesskey"
add device 7: /dev/input/event3
name: "dollar_cove_power_button"
表明系統有 7個event設備 ;
--------------------------------------------------------------------------------
在我的android設備里,event2 代表 音量加減按鍵;
shell@pc7625:/ $ getevent /dev/input/event2 &
點擊 音量減按鍵 :
按鍵 按下的log :
0001 0072 00000001
0000 0000 00000000
按鍵 彈起的log :
0001 0072 00000000
0000 0000 00000000
其中/dev/input/event2 是device的名字 ;
0001 是type;
0072 是鍵碼;
最后一個根據type不同而不同;
比如上面的 00000001 就是按下 音量鍵的keydown,00000000 是松開 音量鍵的keyup;
具體的type,code,value的定義 可以在源碼/frameworks/base/core/java/android/view/KeyEvent.java中找到;
=============================
二、sendevent:
命令格式 : sendevent [device] [type] [code] [value]
需要注意的是在 getevent 中code顯示的是十六進制, 而sendevent 中需要用 十進制
1、模擬發送一個 音量加鍵:
按下 正真的 音量加 按鍵:
/dev/input/event3: 0001 0073 00000001
/dev/input/event3: 0000 0000 00000000
松開 正真的 音量加 按鍵:
/dev/input/event3: 0001 0073 00000000
/dev/input/event3: 0000 0000 00000000
------------- 模擬 按鍵 ------------
發送 按下 音量加 :
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 1 115 1
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 0 0 0
發送 松開 音量加 :
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 1 115 0
shell@anzhen4_mrd7:/ # sendevent /dev/input/event3 0 0 0
-----------------------------------------------------------------------------------
type, code, value的定義可參看kernel/include/linux/input.h
type如下定義:
- /*
- * 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_KEY, EV_REL, EV_ABS, EV_SYN
分別對應keyboard, 相對坐標, 絕對坐標, 同步事件
EV_SYN則表示一組完整事件已經完成,需要處理,EV_SYN的code定義事件分發的類型
EV_SYN對應的code如下:
- /*
- * Synchronization events.
- */
- #define SYN_REPORT 0
- #define SYN_CONFIG 1
- #define SYN_MT_REPORT 2
EV_KEY的code比較多,這里就不列出來了,可參照input.h
EV_REL對應的code:
- /*
- * Relative axes
- */
- #define REL_X 0x00
- #define REL_Y 0x01
- #define REL_Z 0x02
- #define REL_RX 0x03
- #define REL_RY 0x04
- #define REL_RZ 0x05
- #define REL_HWHEEL 0x06
- #define REL_DIAL 0x07
- #define REL_WHEEL 0x08
- #define REL_MISC 0x09
- #define REL_MAX 0x0f
- #define REL_CNT (REL_MAX+1)
EV_ABS對應的code:
- /*
- * Absolute axes
- */
- #define ABS_X 0x00
- #define ABS_Y 0x01
- #define ABS_Z 0x02
- #define ABS_RX 0x03
- #define ABS_RY 0x04
- #define ABS_RZ 0x05
- #define ABS_THROTTLE 0x06
- #define ABS_RUDDER 0x07
- #define ABS_WHEEL 0x08
- #define ABS_GAS 0x09
- #define ABS_BRAKE 0x0a
- #define ABS_HAT0X 0x10
- #define ABS_HAT0Y 0x11
- #define ABS_HAT1X 0x12
- #define ABS_HAT1Y 0x13
- #define ABS_HAT2X 0x14
- #define ABS_HAT2Y 0x15
- #define ABS_HAT3X 0x16
- #define ABS_HAT3Y 0x17
- #define ABS_PRESSURE 0x18
- #define ABS_DISTANCE 0x19
- #define ABS_TILT_X 0x1a
- #define ABS_TILT_Y 0x1b
- #define ABS_TOOL_WIDTH 0x1c
- #define ABS_VOLUME 0x20
- #define ABS_MISC 0x28
- ###
- #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
- #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
- #define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
- #define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
- #define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
- #define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
- #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse 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 */
- ###
- #define ABS_MAX 0x3f
- #define ABS_CNT (ABS_MAX+1)
=====================================================================================
三、input keyevent
如果想模擬按鍵,send event用起來比較繁瑣,可以用input keyevent代替
下面是input keyevent幾個比較常用的用法:
input keyevent 3 // Home
input keyevent 4 // Back
input keyevent 19 //Up
input keyevent 20 //Down
input keyevent 21 //Left
input keyevent 22 //Right
input keyevent 23 //Select/Ok
input keyevent 24 //Volume+
input keyevent 25 // Volume-
input keyevent 82 // Menu 菜單
更多的按鍵事件keycode可參考:http://www.cnblogs.com/mgzc-1508873480/p/7826967.html
用senevent 模擬觸屏事件
sendevent /dev/input/event1 0003 0000 0000015e // ABS x 坐標
sendevent /dev/input/event1: 0003 0001 000000df // ABS y 坐標
sendevent /dev/input/event1: 0001 014a 00000001 // BTN touch事件 值為1
sendevent /dev/input/event1: 0003 0018 00000000 // ABS pressure事件
sendevent /dev/input/event1: 0001 014a 00000000 // BTN touch事件 值為0
sendevent /dev/input/event1: 0000 0000 00000000 // sync事件
