Android Input分析

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指令可直接在设备里运行,移动鼠标会有相应打印。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值