Android6.0输入系统之EventHub源码分析

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

上篇文章《Android6.0输入系统之InputManagerService构成分析》 完成了IMS的创建,接着就沿着输入系统这条路继续往下走。
在EventHub的构造函数中,它通过INotify与Epoll机制建立起对设备点增删事件及可读状态的监听。INotify是Linux内核所提供的一种文件系统变化通知机制。它可以为应用程序监控文件系统的变化,如文件的新建、删除、读写等等。它有两个基本对象,inotify对象对应一个队列,应用程序可以向inotify对象添加多个监听,当被监听的事件发生时,可以通过read()函数从inotify对象中将事件信息读取出来;而watch对象则用来描述文件系统的变化事件的监听,它是一个二元组,包括监听目标和事件掩码两个元素,监听目标是文件系统的一个路径,可以是文件也可以是文件夹。Epoll可以使用一次等待监听多个描述符的可读/可写状态。
frameworks/native/services/inputflinger/EventHub.cpp

设备节点监听的建立
EventHub::EventHub(void) :
        mBuiltInKeyboardId(NO_BUILT_IN_KEYBOARD), mNextDeviceId(1), mControllerNumbers(),
        mOpeningDevices(0), mClosingDevices(0),
        mNeedToSendFinishedDeviceScan(false),
        mNeedToReopenDevices(false), mNeedToScanDevices(true),
        mPendingEventCount(0), mPendingEventIndex(0), mPendingINotify(false) {
    acquire_wake_lock(PARTIAL_WAKE_LOCK, WAKE_LOCK_ID);

    //1.首先使用epoll_create()函数创建一个epoll对象
    mEpollFd = epoll_create(EPOLL_SIZE_HINT);
    ...
    //2.创建一个inotify对象,用来监听设备节点的增删事件
    mINotifyFd = inotify_init();
    //将存储设备点的路径dev/input作为监听对象添加到inotify对象中
    int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);
    LOG_ALWAYS_FATAL_IF(result < 0, "Could not register INotify for %s.  errno=%d",
            DEVICE_PATH, errno);

    //3.将mINotifyFd作为epoll的一个监控对象
    struct epoll_event eventItem;
    memset(&eventItem, 0, sizeof(eventItem));
    eventItem.events = EPOLLIN;  //监听mINotifyFd可读
    eventItem.data.u32 = EPOLL_ID_INOTIFY;
    //将对mINotifyFd的监听注册到epoll对象中
    result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mINotifyFd, &eventItem);
    ...
}
getEvents()函数的工作方式、输入设备管理、原始输入事件的监听与读取
size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) {
    ALOG_ASSERT(bufferSize >= 1);

    AutoMutex _l(mLock);

    struct input_event readBuffer[bufferSize];

    /* event指针指向在buffer中下一个可用于存储事件的RawEvent结构体。每存储一个事件,event指针都会向后偏移一个元素 */
    RawEvent* event = buffer;
    //capacity记录了buffer中的剩余的元素数量
    size_t capacity = bufferSize;
    bool awoken = false;
    //循环getEvent()函数的主体
    for (;;) {
        ...
        //遍历mClosingDevices链表,为每一个已卸载的设备生成DEVICE_REMOVED事件
        while (mClosingDevices) {
            Device* device = mClosingDevices;
            ALOGV("Reporting device closed: id=%d, name=%s\n",
                 device->id, device->path.string());
            mClosingDevices = device->next;
            event->when = now; //设置产生事件的事件戳
            event->deviceId = device->id == mBuiltInKeyboardId ? BUILT_IN_KEYBOARD_ID : device->id;
          
Android 7系统输入(六)定制安卓系统输入模块 定制点位置核心代码作用① DOWN/UP 打印ALOGD(...)在源头过滤 MOVE,只打印按下和抬起② 窗口名打印知道事件发给了哪个窗口② 控件名打印知道事件最终被哪个控件消费③ 焦点变更去掉窗口切换时实时输出焦点信息三个定制点覆盖了输入系统从事件产生 → 目标定位 → 焦点管理的完整链路。这些改造不需要深入理解 Android 输入系统的全部细节——只需要知道在哪个文件的哪个函数里加一行日志,就能让原本"静默"的输入系统变得透明可见。 阅读详情

相关推荐

【QNX+Android虚拟化方案】48 - Android 侧用户层 输入系统获取 /dev/input/event0 节点数据 代码流程分析

【QNX+Android虚拟化方案】48 - Android 侧用户层 输入系统获取 /dev/input/event0 节点数据 代码流程分析

|~~~热爱生活、努力学习的小伙汁~~~| 1380

EventHub:事件驱动设计

活动中心 EventHub提供服务器端事件中心以及服务器和客户端库以与该中心进行通信。 集线器将所有事件广播到所有连接的客户端。 支持事件回调。 安装 % npm install EventHub -g % npm start EventHub -g 这将在端口5883上安装并启动EventHub 配置 港口 服务器侦听所有客户端必须使用的端口! EventHub的默认端口为5883。使用npm配置变量进行更改: % npm config set EventHub.port = 8888 将更改EventHub侦听的端口。 确保更新客户端以指向此端口。 您还可以使用集线器API来设置集线器的端口,如下所述(请确保在“启动”集线器之前先设置好Port!)。 集线器秘密 集线器具有“秘密”值-字符串。 希望收听单播事件(请参阅下面的“单播”部分)的客户端在连接到集线器时必须提供此字符串。

EventHub演示程序及源码

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

Android 输入系统(二)EventHub

接着上一篇的InputManagerService,这里主要介绍一下EventHubEventHub主要是访问/dev/input下端所有设备节点,并将输入事件、设备节点端增删返给InputReader。 EventHub初始化 由上一篇可知,EventHub对象是在NativeInputManager构造函数中创建的。先看一下EventHub构造函数中都做了些什么 EventHub:

奋斗的菜鸟ing 1万+

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

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

农场老马的专栏 2万+

Android输入系统源码分析

参考:《深入理解Android 卷III》  输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口。最初的输入事件为内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象。因此Android输入系统的主要工作是读取设备节点中的原始事件,将其加工封装,然后派发给一个特定的窗口以及窗口中的控件。这个过程由InputManage

韩朋的博客 1311

Android 输入系统EventHub

Android系统定制两年多了,受到别人启发,将自己的学习工作经历整理成博客,供以后重温,好了废话不多说,这段时间研究了下Android输入系统,深深的感叹Android系统的庞大。。。。。。 Android所有的input设备都会在/dev/input目录下生成对应的设备节点,一旦有任何输入事件产生,便会将事件写到这些节点下,同时对于外部输入设备(鼠标键盘等)的插拔还会引起这些节点

愿景的博客 7404

Android Input流程分析(二):EventHub

Android Input流程分析(二):EventHub   现在,InputReader线程已经开始运行

Invoker123的博客 2348

input子系统 Android6.0输入系统EventHub源码分析

上篇文章《Android6.0输入系统之InputManagerService构成分析》 完成了IMS的创建,接着就沿着输入系统这条路继续往下走。 在EventHub的构造函数中,它通过INotify与Epoll机制建立起对设备点增删事件及可读状态的监听。INotify是Linux内核所提供的一种文件系统变化通知机制。它可以为应用程序监控文件系统的变化,如文件的新建、删除、读写等等。它有两个基本...

sdkdlwk的博客 489

EventHub分析(二)

2, EventHub 一台移动设备中能产生输入消息的部件很多,比如键盘,触摸屏以及按键等等,EventHub主要是将这些设备产生的消息打包成一种格式,再发往上层进行处理. 首先看看EventHub的构造函数, EventHub::EventHub(void) : mBuiltInKeyboardId(NO_BUILT_IN_KEYBOARD), mNextDeviceId

Jack的博客 4022

Android 源码分析 - 输入 - 流程

设备加入 EventHub检测到设备加入(getEvents) if (eventItem.data.u32 == EPOLL_ID_INOTIFY) mPendingINotify = true【延迟到其他事件后处理】 if (mPendingINotify && mPendingEventIndex >= mPendingEventCount)【其他事件处理完了 】 mPendingINotify = false readNotifyLocked() rea..

luansxx的专栏 851

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

Android 输入系统(Input System)的工作原理,包括:输入设备的管理、输入事件的加工方式及派发流程。首先输入设备包括:触摸屏,键盘,鼠标和手柄等,其中触摸屏与键盘是 Android 最普遍也是最标准的输入设备。当用户操作输入设备时,Linux内核接收到相应的硬件中断,然后将中断加工成原始的输入事件数据并写入其对应的设备节点中,在用户空间可以通过输入系统内部的读取函数将原始事件数据读出,并进行一系列翻译加工成Android输入事件,然后在所有的窗口寻找合适的事件接收者,并派发给它来消费该事件

neuHenry 2121

【实习周记】Android getevent.c源码分析

【实习周记】Android getevent.c源码分析.概述 getevent和sendevent是Android系统下的两个工具 在cmd 命令行下输入adb shell进入Android设备的shell 输入getevent ,获取当前设备的事件 输入sendevent ,模拟设备产生事件 这两个命令的源码Android系统system/core/toolbox/目录下, 名字分别为g...

LeeDuoZuiShuai的博客 2950

android输入系统之内核到InputManagerService过程(源码

这是一个系列的文章,今天先分析内核到ims的过程,以后有时间分析ims到wms以及从wms到viewRoot的过程。

陈德山 1331

Android Linux Kernel的input子系统与framework层结构分析

andriod Linux Kernel input子系统 input_sync之后

蓝冰露的博客 721

android Input专题- Q/R/S 10/11/12 InputManager源码分析

1、SystemServer中InputManagerService创建与启动 base/services/java/com/android/server/SystemServer.java private void startOtherServices() { //省略部分 traceBeginAndSlog("StartInputManagerService"); inputManager = new InputManagerService

learnframework的博客 2896

Android系统源码分析-事件收集

前言 之前项目中涉及到对于Android事件的转发处理相关的需求,因此对于这部分的系统源码进行了分析,从写入设备文件到我们的应用层如何获取到事件,传递事件,消耗事件。整个传递机制源码进行了分析,以下为对于相关代码的梳理过程中的一些代码剖析记录。 针对事件的分析,这里以触摸屏事件为例,这也是我们最常用的一个事件处理,这里首先抛出我们应用层相...

weixin_34015860的博客 106
上一篇: Android6.0输入系统之InputManagerService构成分析
下一篇: 快速了解Android6.0系统触摸事件工作原理——InputManagerService
猫哥,你好
博客等级 码龄8年 59粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值