AOSP源码分析:Android Input事件的产生、读取和分发

本文深入分析了Android系统的Input事件处理流程,从InputReader如何读取事件,到InputDispatcher如何分发事件,包括按键事件的处理、设备信息更新、事件队列的管理和ANR的相关机制。通过对AOSP源码的解读,揭示了Input事件在系统中的完整路径。

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

大家好,今天为大家推荐来自MIUI的Cheeeelok同学的AOSP源码分析系列文章,本文依然从源码的角度带大家理解Android Input事件的产生、读取和分发。还没有看过作者上一篇文章 Android Input子系统:Input进程的创建,监听线程的启动 的同学,现在补上同样不迟,好了,话不多说,直接进入正文。


在上一篇博文中学习了Android Input系统事件监听模块,我们了解到InputManagerService启动后会启动InputReader开始监听来自EventHub的事件。今天就沿着前文的思路,看看EventHub将事件交给InputReader后会发生什么。

本文的内容可以由下图概括:

Input事件的读取者InputReader

在上一篇博文中已经讲到,对于InputRead,它在监听过程中会做以下事情:

  1. 启动后循环执行mReader->loopOnce()

  2. loopOnce()中会调用mEventHub->getEvents读取事件

  3. 读到了事件就会调用processEventsLocked处理事件

  4. 处理完成后调用getInputDevicesLocked获取输入设备信息

  5. 调用mPolicy->notifyInputDevicesChanged函数利用InputManagerService的代理通过Handler发送MSG_DELIVER_INPUT_DEVICES_CHANGED消息,通知输入设备发生了变化

  6. 最后调用mQueuedListener->flush(),将事件队列中的所有事件交给在InputReader中注册过的InputDispatcher


bool InputReaderThread::threadLoop() {
    mReader->loopOnce();    
   return true; }

void InputReader::loopOnce() {    ……    size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);    { // acquire lock        AutoMutex _l(mLock);        mReaderIsAliveCondition.broadcast();        
       if (count) {            processEventsLocked(mEventBuffer, count);        }    ……  if (oldGeneration != mGeneration) {            inputDevicesChanged = true;            getInputDevicesLocked(inputDevices);        }    } // release lock    // Send out a message that the describes the changed input devices.    if (inputDevicesChanged) {        mPolicy->notifyInputDevicesChanged(inputDevices);    }    ……    mQueuedListener->flush(); }

接下来我们就学习它具体的处理流程吧。

processEventsLocked对Input事件进行处理、归类

在processEventsLocked函数中,它主要做了以下事情:

  1. 循环获取RawEvent

  2. 如果RawEvent->type小于FIRST_SYNTHETIC_EVENT,说明这是个来自kernel的Input事件,则调用processEventsForDeviceLocked函数处理

  3. 否则此时的RawEvent->type就代表着Input设备的增、删、扫描事件,则调用对应的设备处理函数进行处理

void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count) {    
  for (const RawEvent* rawEvent = rawEvents; count;) {        int32_t type = rawEvent->type;        size_t batchSize = 1;        
       if (type < EventHubInterface::FIRST_SYNTHETIC_EVENT) {            ……            processEventsForDeviceLocked(deviceId, rawEvent, batchSize);        } else {            
           switch (rawEvent->type) {            
               case EventHubInterface::DEVICE_ADDED:                     addDeviceLocked(rawEvent->when, rawEvent->deviceId);                
                    break;            
               case EventHubInterface::DEVICE_REMOVED:                     removeDeviceLocked(rawEvent->when, rawEvent->deviceId);                
                    break;            
               case EventHubInterface::FINISHED_DEVICE_SCAN:                     handleConfigurationChangedLocked(rawEvent->when);                
                    break;            
               default:                     ALOG_ASSERT(false); // can't happen                     break;            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值