getevent获取input上报事件

本文介绍了如何使用ADBShellGetEvent命令来获取Android设备上的输入事件。通过具体实例展示了指定设备和列出所有上报事件的方法,并详细解释了输出结果中各项参数的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.指定某个设备:adb shell getevent -v /dev/input/event0
eg:
D:\Program Files (x86)\PowerCmd>adb shell getevent -v /dev/input/event1

bus: 0018
vendor 0001
product 0001
version 0100
name: “proximity”
location: “proximity”
id: “”
version: 1.0.1
0003 0019 00000000
0000 0000 00000000
0003 0019 00000001
0000 0000 00000000

2.list上报事件:adb shell getevent -l

D:\Program Files (x86)\PowerCmd>adb shell getevent -l
add device 1: /dev/input/event6
name: “mtk-tpd-kpd”
add device 2: /dev/input/event5
name: “mtk-tpd”
add device 3: /dev/input/event4
name: “m_acc_input”
add device 4: /dev/input/event3
name: “m_alsps_input”
add device 5: /dev/input/event2
name: “hwmdata”
add device 6: /dev/input/event0
name: “ACCDET”
add device 7: /dev/input/event1
name: “mtk-kpd”
/dev/input/event5: EV_ABS ABS_MT_TRACKING_ID 00000000
/dev/input/event5: EV_KEY BTN_TOUCH DOWN
/dev/input/event5: EV_ABS ABS_MT_TOUCH_MAJOR 00000001
/dev/input/event5: EV_ABS ABS_MT_POSITION_X 000000e5
/dev/input/event5: EV_ABS ABS_MT_POSITION_Y 000002d7
/dev/input/event5: EV_SYN SYN_MT_REPORT 00000000
/dev/input/event5: EV_SYN SYN_REPORT 00000000
/dev/input/event5: EV_ABS ABS_MT_TRACKING_ID 00000000
/dev/input/event5: EV_ABS ABS_MT_TOUCH_MAJOR 00000001
/dev/input/event5: EV_ABS ABS_MT_POSITION_X 000000e5
/dev/input/event5: EV_ABS ABS_MT_POSITION_Y 000002d7
/dev/input/event5: EV_SYN SYN_MT_REPORT 00000000
/dev/input/event5: EV_SYN SYN_REPORT 00000000
/dev/input/event5: EV_ABS ABS_MT_TRACKING_ID 00000000

<think>嗯,用户想了解EventHub源码的详细分析,特别是Android输入子系统中的部分。首先,我需要回忆一下EventHub在Android系统中的作用。EventHub主要负责从输入设备读取事件,比如触摸屏、物理按键、传感器等。它是InputReader的核心组件,处理底层硬件事件上报。 接下来,我应该从源码结构入手。根据用户提供的引用内容,比如引用[3]提到硬件模块头文件在/hardware/libhardware/include/hardware目录下,这可能与EventHub相关的硬件抽象层有关。不过EventHub本身的代码可能在frameworks/native/services/inputflinger/目录里,比如EventHub.cpp和EventHub.h这两个文件。 然后,我需要分析EventHub的主要功能。比如,如何监控设备节点的变化,通过inotify和epoll机制来监听/dev/input目录下的设备添加或移除事件。这部分可能涉及到Linux的系统调用,用户可能对具体的实现细节感兴趣,比如如何初始化inotify,如何将设备节点的变更事件加入到epoll的监听队列中。 设备打开与读取部分,EventHub在检测到新设备后,会打开对应的设备节点,比如/dev/input/eventX。通过ioctl获取设备信息,比如设备名称、类型,并创建对应的InputDevice对象。这里可能需要解释EV_KEY事件的处理,以及如何通过epoll_wait等待事件发生,再调用read循环读取输入事件。 输入事件处理流程方面,EventHub将读取到的事件封装成RawEvent结构,传递给InputReader进行进一步处理。这里需要说明RawEvent包含的信息,比如设备ID、事件类型、代码、值等,以及如何将原始事件转化为Android框架中的KeyEvent或MotionEvent。 另外,用户可能对EventHub中的同步机制感兴趣,比如使用Mutex锁来保证多线程环境下的数据安全。还有异常处理,比如设备断开时的资源释放和状态更新。 关于引用部分,用户提供的引用[1]中的dispatchInputEvent可能与事件分发有关,但EventHub更多是处理底层的事件读取,而上层分发可能由其他模块处理。引用[2]的日志命令可能在调试EventHub相关问题时有用,比如通过docker查看容器日志,不过EventHub属于系统底层服务,可能直接查看系统日志而不是容器日志。 最后,用户可能需要了解EventHub在Android输入系统中的位置,如何与InputReader、InputDispatcher协作,以及它在系统启动时的初始化过程。这部分可能需要结合Android系统启动流程和输入子系统架构来讲解。 在回答时,要确保结构清晰,分模块讲解源码,结合关键函数和数据结构,同时注意用户提供的引用内容,适当引用但主要围绕EventHub本身。如果有不确定的部分,比如具体的函数实现细节,可以建议用户查阅源码或官方文档来获取更准确的信息。</think>### EventHub源码解析 EventHub是Android输入子系统的核心组件,负责监控输入设备并读取原始事件数据。以下从源码结构、设备监控机制、事件处理流程三个层面解析: #### 一、源码结构 主要位于`frameworks/native/services/inputflinger/EventHub.cpp`: ```cpp class EventHub : public android::EventHubInterface { public: explicit EventHub(void); virtual ~EventHub(); // 关键方法 void wake(); // 唤醒事件循环 bool getEvent(RawEvent* outEvent); // 获取原始事件 }; ``` 通过`/dev/input`访问输入设备节点,使用`inotify`监控设备变化[^3]。 #### 二、设备监控机制 1. **初始化阶段** ```cpp void EventHub::initialize() { mINotifyFd = inotify_init(); // 创建inotify实例 mEpollFd = epoll_create(EPOLL_SIZE_HINT); // 创建epoll实例 // 监控/dev/input目录变化 inotify_add_watch(mINotifyFd, "/dev/input", IN_CREATE | IN_DELETE); } ``` 通过`epoll_wait()`实现事件循环,同时监听: - 设备节点变更(通过inotify) - 输入事件(通过设备文件描述符) - 唤醒信号(通过管道) 2. **设备发现流程** ```cpp void EventHub::scanDevicesLocked() { // 遍历/dev/input目录 while ((de = readdir(dir))) { if (strncmp(de->d_name, "event", 5)) continue; openDeviceLocked(devname); // 打开设备节点 } } ``` #### 三、事件处理流程 1. **设备打开** ```cpp status_t EventHub::openDeviceLocked(const char* devicePath) { int fd = open(devicePath, O_RDWR | O_CLOEXEC); // 打开设备文件 ioctl(fd, EVIOCGNAME(sizeof(device->identifier.name)), device->identifier.name); // 创建InputDevice对象 device->inputDevice = new InputDevice(...); } ``` 2. **事件读取** ```cpp bool EventHub::getEvent(RawEvent* outEvent) { struct input_event readBuffer[EVENT_BUFFER_SIZE]; read(mFd, readBuffer, sizeof(readBuffer)); // 读取原始事件 // 转换为RawEvent结构 outEvent->deviceId = device->id; outEvent->type = EV_KEY; outEvent->code = readBuffer[i].code; outEvent->value = readBuffer[i].value; } ``` 3. **事件分发 处理后的`RawEvent`会传递给`InputReader`进行事件翻译,最终生成`KeyEvent`或`MotionEvent`通过`InputDispatcher`分发到应用层[^1]。 #### 四、关键设计 1. **同步机制** ```cpp Mutex mLock; // 保护设备列表和状态 ``` 2. **异常处理** ```cpp void EventHub::handleDeviceRemoval(int deviceId) { closeDeviceLocked(device); // 关闭设备 deleteDeviceLocked(device); // 更新设备列表 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值