`
sharp2wing
  • 浏览: 271368 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Android输入事件流程中的EventHub分析及源码演示

阅读更多
Android2.3的输入事件流程与以前版本有了较大的不同,这里做一下详细的分析,最后我把自己分析时用的演示代码放在了这里:

http://code.google.com/p/flying-on-android/

下面的分析都是基于这些源码的,大家可以下载下来一边看源码一边看文档。源码里只要关注FlyingEvent这个类就可以了。如果只想看一下演示结果,可以直接把包里的flying放到机器的/system/bin目录执行,打开logcat后就可以看到演示输出。运行程序时,机器屏幕会有异象产生,很正常,因为这个程序原本是用于显示SurfaceFlinger的,这次为了演示EventHub稍微改了一下。大家只要关注 FlyingEvent.cpp这个文件就好了。

大家也可以用源码自己编译出演示程序,只要把解压后的flying文件夹放到/frameworks/base/cmds/目录下,然后切换到flying目录下使用mm编译。



先大致介绍一下整个流程,再做重点分析。输入事件流程一共涉及到下面这几个文件:

/frameworks/base/services/java/com/android/server/WindowManagerService.java

/frameworks/base/services/java/com/android/server/InputManager.java

/frameworks/base/services/jni/com_android_server_InputManager.cpp

/frameworks/base/libs/ui/InputReader.cpp

/frameworks/base/libs/ui/InputDispatcher.cpp

/frameworks/base/libs/ui/EventHub.cpp

其中,WindowManagerService.java和InputManager.java主要向Android为窗口系统提供服务,EventHub.cpp主要用来读取设备文件中的RawEvent,而InputReader.cpp和InputDispatcher.cpp算是它们之间的对接层。



它们的关系是:WindowManagerService通过InputManager提供的接口开启一个线程驱动InputReader不断地从 /dev/input/目录下面的设备文件读取事件,然后通过InputDispatcher分发给连接到WindowManagerService服务的客户端。

InputReader从设备文件中读取的是RawEvent,在交给InputDispatcher进行分发之前,它需要先把RawEvent进行转化分类,拆分成KeyEvent、MotionEvent、TrackEvent各种类型等。这篇文章主要关注的就是这个RawEvent的拆分过程,所以我们的重点在EventHub.cpp中。并且,为了简单化分析过程,在这里我的分析只关注触摸屏事件。看它是如何从RawEvent被拆分成应用层用户事件MotionEvent的。



看下面的分析之前,最好先去上面提到的地址把源码下载下来,参照里面的FlyingEvent.cpp。



整个过程大致分成这么几步:

一、初始化。

先new一个EventHub的实例:mEventHub(new EventHub),

接下来,开启一个线程通过mEventHub不停地从设备文件中读取RawEvent并处理:

while (1) {

    RawEvent event;

    mEventHub->getEvent(&event);

    process(event);

}

EventHub在初始化的时候做一些事情,

1、搜索当前的输入设备每搜索到一个就会产生一个类型为DEVICE_ADDED的事件,当读取这种RawEvent时,InputReader会把搜索到的这个设备记录下来。

2、如果搜索到了键盘时,就会加载键盘布局文件。加载完成后产生一个类型为FINISHED_DEVICE_SCAN的事件。这样,后边从驱动读取用户按键时,就会去加载的键盘布局文件中寻找映射的键值封装成KeyEvent返回给用户。



二、EventHub初始化完毕后,就开始等待用户输入。线程一直阻塞在mEventHub->getEvent(&event),直到有用户事件产生才会返回。

当有一个事件产生时,传递给process进行处理。



三、事件拆分

FlyingEvent.process里面主要调用了FlyingEvent.consume方法来处理用户事件。这里只分析touch事件。touch事件可以分为三种:down,move,up。

down类型的touch事件需要四个RawEvent来完成,第一个是X坐标(ABS_X),第二个是Y坐标(ABS_Y),第三个代表方向(ABS_PRESSURE)(0的时候是up,1的时候是down,所以这里应该是1),第四个是结束标志(SYN_REPORT)。

move类型的touch事件需要三个RawEvent来完成,第一个是X坐标,第二个是Y坐标,第三个是结束标志。

up类型的touch事件需要两个RawEvent来完成,第一个代表方向(0的时候是up,1的时候是down,所以这里应该是0),第四个是结束标志。

可能你已经注意到了up事件是没有坐标信息的,它的坐标信息与down(没有move时)或最后一个move(down和up之间有move事件产生)事件的坐标相同。



从FlyingEvent.consume方法中,每一个事件最终都会生成一个TouchEvent,然后调用printTouchEvent进行打印,最后把它存储到eventBuffer中。





参考文章

李先静的“Android输入事件流程“,不过使用的Android版本比较老了。

http://blog.csdn.net/absurd/archive/2009/05/17/4195363.aspx

(摘自:http://blog.csdn.net/a345017062/article/details/6417929)
分享到:
评论

相关推荐

    EventHub演示程序及源码

    这个资源里面的源码及可执行文件是用于这里这篇文档的: http://blog.csdn.net/a345017062/archive/2011/05/13/6417929.aspx 文档中对Android EventHub是基于这里面的源码和可执行程序的。

    Android 输入事件流程

    在Android中,`EventHub`扮演着输入事件管理的核心角色。它负责与底层硬件通信,接收来自输入设备的原始数据,并将这些数据转换为应用层可以理解的事件。`EventHub`通过扫描`/dev/input`目录下的设备文件,建立与...

    Android 事件驱动流程

    在Android系统中,事件驱动流程是其用户界面交互的核心机制,特别是对于输入事件的处理,如触摸屏操作、按键点击等。Android输入事件处理流程主要涉及Boot过程、系统服务启动、窗口管理服务(WindowManagerService)...

    Android 按键消息流程源码分析

    ### Android按键消息流程源码分析 #### 一、概述 在Android系统中,键盘按键事件的管理和处理是一项关键任务。整个流程涉及多个层次,从硬件层的Linux内核驱动到应用层的应用程序,其间还包括了Android框架层。...

    Android 4.0 事件输入(Event Input)系统

    EventHub 是 Android 4.0 中的事件输入系统的核心模块,它管理所有系统中可以识别的输入设备的输入事件,并产生相应的输入事件给系统。EventHub 通过 getEvents 函数,给系统提供一个输入事件流。它也支持查询输入...

    android4.0 input touch分析

    android4.0下的输入触摸流程分析文档,主要分为两个部分:android Framework 层和 Linux 内核层。下面将从头到尾详细分析输入触摸流程。 android Framework 层 在android Framework 层,输入触摸流程主要涉及到四...

    Android编程输入事件流程详解

    在Android中,事件通常按照层次结构自上而下传递,从顶级父视图到子视图。每个视图都有机会处理事件,直到某个视图消费它(通过调用`event.accept()`或`event.setHandled(true)`)。 如果事件没有被任何视图消费,...

    Android本地注入事件

    4. **EventHub**与**InputReader**:这是Linux内核中处理输入事件的部分,EventHub负责从/dev/input/event*读取事件,InputReader解析事件并传递给Android框架。 5. **AccessibilityService**:这是实现事件注入的...

    android4.0按键处理

    在分析输入事件的处理流程时,不仅需要关注framework层的代码,还需要了解Linux内核中如何处理输入事件。在Android 4.0中,多点触摸驱动已经成熟,但在系统层面上进行校准程序的编写则相对复杂,需要考虑到系统UI...

    android 事件的处理(2)

    在Android的输入框架中,事件首先由EventHub捕获,然后传递到InputReader进行处理。当事件被获取到后,InputReader会调用`processEventsLocked`方法来进一步处理这些事件。这个方法会根据事件类型进行区分,主要处理...

    PyPI 官网下载 | azure-mgmt-eventhub-3.1.0.zip

    《Python Azure管理事件中心库详解——azure-mgmt-eventhub 3.1.0》 在IT行业中,云计算已经成为不可或缺的一部分,而微软的Azure云服务更是众多企业和开发者的选择。Python作为广泛应用的编程语言,自然也在Azure...

    ANDROID框架解析[参考].pdf

    Android操作系统是基于Linux内核的开源移动操作系统,广泛应用于智能手机和平板电脑等设备。...通过阅读和分析源码,开发者可以掌握Android输入系统的工作原理,并根据具体的应用场景进行相应的定制和优化。

    EventHub:事件驱动设计

    活动中心EventHub提供服务器端事件中心以及服务器和客户端库以与该中心进行通信。 集线器将所有事件广播到所有连接的客户端。 支持事件回调。安装% npm install EventHub -g% npm start EventHub -g这将在端口5883上...

    Firefox OS输入系统分析1

    - Android处理流程:输入事件首先由驱动层上报至内核,然后通过EventHub.cpp进行设备扫描和类型识别。InputReader.cpp读取原始数据,InputDispatcher.cpp负责数据的分发。最后,JNI机制在Android_view_KeyEvent.cpp...

    azure-eventhub-java:关于如何使用 Java 向 Microsoft Azure EventHub 提交内容的演示项目

    azure-eventhub-java 关于如何使用 Java 将内容提交到 Microsoft Azure 服务总线/EventHub 的演示项目。 先决条件 尝试执行或编译示例时需要安装 。 编译示例 mvn clean compile 运行示例 mvn exec:java

    android 5.1 禁用usb 鼠标和键盘

    使用系统是android5.1 根据客户需求修改的 禁用usb鼠标和键盘!客户的需求是在设置选项里面添加两个选项可以分别禁用usb鼠标 和 键盘 已经修改完成亲测!有完整的步骤和代码! 根据代码小修改一下就可以变成 随时...

    Android Linux内核的input子系统

    Android中的EventHub负责从/dev/input/设备节点获取Linux输入事件,转化为Android的KeyCode。Input Manager Service则进一步将这些KeyCode发送到合适的窗口,确保输入事件被正确处理。 在Linux内核中,input子系统...

Global site tag (gtag.js) - Google Analytics