Android 输入系统解析 (1)
2012-07-03 17:45
344 查看
有两种思路来解析Android Input 子系统的代码(注一),一是从应用的事件获取开始,自上而下的解析Input相关代码的功能及调用关系(从
注二 的内容可知,输入事件是通过View类中的事件监听接口获取的);二是从内核驱动开始,自下而上找出调用关系;本文采用第二种思路。
1. 内核输入驱动
内核输入驱动包括两个类别协同工作的驱动,即输入设备驱动和输入事件驱动,设备驱动负责与输入的硬件设备进行通讯,而事件驱动提供供用户空间应用访问的接口(即 /dev/input/xxx 设备节点)。因为输入驱动已提供了标准化的事件接口,新写一个事件驱动相对来说较为简单,大致步骤为:
a). 初始化时调用标准函数input_allocate_device分配一个input_dev结构体并设置要产生的事件及事件码
b). 调用input_register_device来注册一个输入事件驱动
c). 调用input_report_xxx(rel/abs…)和input_sync来上报事件。
2. EventHub
应用程序获得输入事件的方法为打开输入设备节点并调用poll来查询和read来读取输入事件。在Android中,读取输入事件在 frameworks/base/services/input/EventHub.cpp中实现。EventHub类中有两个关键成员函数: openDeviceLocked和getEvents,它们的作用分别为打开设备节点和读取输入事件。
openDeviceLocked实现的具体功能为:
打开设备节点
获得设备名
检查设备是否在不支持设备之列
获得设备版本号和标识符
获得设备唯一的ID
为使用poll函数,将文件描述符设为非阻塞类型
获得设备类别(输入设备类别在EventHub.h中定义,具体如下)
INPUT_DEVICE_CLASS_KEYBOARD 键盘
INPUT_DEVICE_CLASS_ALPHAKEY 数字键盘
INPUT_DEVICE_CLASS_TOUCH 触摸屏(单点或多点)
INPUT_DEVICE_CLASS_CURSOR 光标(如轨迹球或鼠标)
INPUT_DEVICE_CLASS_TOUCH_MT 多点触摸屏
INPUT_DEVICE_CLASS_DPAD 方向键
INPUT_DEVICE_CLASS_GAMEPAD 游戏手柄
INPUT_DEVICE_CLASS_SWITCH 开关键
INPUT_DEVICE_CLASS_JOYSTICK 操纵杆
INPUT_DEVICE_CLASS_EXTERNAL 外部设备
getEvents调用read函数来读取输入设备上报的事件并直接将事件信息填充进RawEvent结构体数组缓冲区(即传入参数buffer)中。
?
注一: 本文所使用Android代码的版本为: 4.0.3
注二: http://developer.android.com/guide/topics/ui/ui-events.html
注二 的内容可知,输入事件是通过View类中的事件监听接口获取的);二是从内核驱动开始,自下而上找出调用关系;本文采用第二种思路。
1. 内核输入驱动
内核输入驱动包括两个类别协同工作的驱动,即输入设备驱动和输入事件驱动,设备驱动负责与输入的硬件设备进行通讯,而事件驱动提供供用户空间应用访问的接口(即 /dev/input/xxx 设备节点)。因为输入驱动已提供了标准化的事件接口,新写一个事件驱动相对来说较为简单,大致步骤为:
a). 初始化时调用标准函数input_allocate_device分配一个input_dev结构体并设置要产生的事件及事件码
b). 调用input_register_device来注册一个输入事件驱动
c). 调用input_report_xxx(rel/abs…)和input_sync来上报事件。
2. EventHub
应用程序获得输入事件的方法为打开输入设备节点并调用poll来查询和read来读取输入事件。在Android中,读取输入事件在 frameworks/base/services/input/EventHub.cpp中实现。EventHub类中有两个关键成员函数: openDeviceLocked和getEvents,它们的作用分别为打开设备节点和读取输入事件。
openDeviceLocked实现的具体功能为:
打开设备节点
获得设备名
检查设备是否在不支持设备之列
获得设备版本号和标识符
获得设备唯一的ID
为使用poll函数,将文件描述符设为非阻塞类型
获得设备类别(输入设备类别在EventHub.h中定义,具体如下)
INPUT_DEVICE_CLASS_KEYBOARD 键盘
INPUT_DEVICE_CLASS_ALPHAKEY 数字键盘
INPUT_DEVICE_CLASS_TOUCH 触摸屏(单点或多点)
INPUT_DEVICE_CLASS_CURSOR 光标(如轨迹球或鼠标)
INPUT_DEVICE_CLASS_TOUCH_MT 多点触摸屏
INPUT_DEVICE_CLASS_DPAD 方向键
INPUT_DEVICE_CLASS_GAMEPAD 游戏手柄
INPUT_DEVICE_CLASS_SWITCH 开关键
INPUT_DEVICE_CLASS_JOYSTICK 操纵杆
INPUT_DEVICE_CLASS_EXTERNAL 外部设备
getEvents调用read函数来读取输入设备上报的事件并直接将事件信息填充进RawEvent结构体数组缓冲区(即传入参数buffer)中。
?
注二: http://developer.android.com/guide/topics/ui/ui-events.html
相关文章推荐
- Android 输入事件系统之 EventHub 和 Input Lib(事件解析库)
- Android 输入系统解析 (2)
- Android核心服务解析篇(三)——Android系统的启动
- 全面的Android文件目录解析和获取方法(包含对6.0系统的说明)
- Android输入法之输入系统
- Android触摸屏输入系统
- Android中JSON数据解析:系统自带JSONObject以及第三方GSON的实现
- Android核心分析之(14)Android GWES之输入系统
- 关于android系统对AndroidManifest文件的解析机制
- Android 输入系统(一)InputManagerService
- ANDROID输入系统
- Android 4.0 事件输入(Event Input)系统
- Android输入系统笔记
- 让android webView使用系统默认浏览器内核直接解析,不弹出选择浏览器选项
- 关于android系统Binder机制解析
- Android View系统解析(上)
- Android View系统解析(下)
- Android系统文件夹结构解析(五)--/system/lib
- Android输入系统简介
- Android系统--输入系统(十七)Dispatcher线程_分发dispatch