1 Android Input系统框图
图1 Android Input系统框图
Android Input可以分为触摸屏事件,按键消息等。上层app的消息是通过WMS分发的,分发给当前的活动窗口。
2 Android Input主要模块
(1)WMS:管理窗口,收集和分发input事件
(2)InputManager:接收和分发输入事件
(3)EventHub:打开所有输入设备,对输入事件进行映射
(4)InputReader:InputReader收集到input事件并进行判断处理
(5)InputDispatcher:将事件分发到上层
注意:Hal层使用的最多的还是Unix高级编程的技术!
3 EventHub分析
(1)扫描并打开/dev/input下的输入设备
(2)监听/dev/input目录,若出现热插拔,对相应设备进行添加或删除
(3)根据配置文件和键值映射文件对设备进行配置和键值映射
(4)将所有设备添加到本地列表进行监听
(5)捕获输入事件,根据设备类型进行相应处理
4 InputReader分析
InputReader处理输入设备:
(1)获取设备输入类型:按键,手柄和触摸屏
(2)根据设备类型和prop做键值布局和映射
(3)将设备添加到InputReader中
(4)根据设备类型添加不同mapper
(5)InputReader做一次按键收集,EventHub获取一次底层键值,并对键值进行处理
(6)将收集到的键值发送给监听对象
InputReader类图如下:
图2 InputReader类图
InputMapper有4种具体实现的子类:
键盘:Keyboard
鼠标:Cursor
触摸屏:MultiTouch
手柄:Joystick
查看所有设备类型:
cat /proc/bus/input/devices
5 struct input_event
struct input_event {
struct timeval time;
int type;
int code
int value;
};
type:
标志 | 值 | 描述 |
EV_SYN | 0x00 | 设备支持所有的事件 |
EV_KEY | 0x01 | 键盘或按键 |
EV_REL | 0x02 | 鼠标 |
EV_ABS | 0x03 | 手写板 |
表1:type
type/code/value:
type | code | value |
EV_KEY | 表示键盘值或鼠标值 | 1表示按键按下, 0表示按键抬起 |
EV_REL | 表示操作的是x/y轴 | 表示移动的值和方向 |
EV_ABS | 表示绝对最标轴方向 | 表示绝对位置 |
表2:type/code/value
getevent分析:
system/core/toolbox/getevent.c
(1)监控/dev/input目录
(2)打开设备,并且轮询设备
(3)读取设备事件并打印
getevent指令可直接在设备里运行,移动鼠标会有相应打印。