Android input 系统之一 :InputReader线程
touch事件处理流程:
底层触摸事件上报至framework层,事件未分发之前的数据读取与处理流程:
"InputReader 线程"
bool InputReaderThread::threadLoop() frameworks/native/services/inputflinger/InputReader.cpp
void InputReader::loopOnce()
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE); //从EventHub读取事件,其中EVENT_BUFFER_SIZE = 256
size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) frameworks/native/services/inputflinger/EventHub.cpp
scanDevicesLocked();//扫描设备,会把dev/input下所有可用的输入设备打开并储存到Device结构体中
int32_t readSize = read(device->fd, readBuffer, sizeof(struct input_event) * capacity); //从设备不断读取事件,放入到readBuffer
//将input_event信息, 封装成"RawEvent"
>>(event->when = nsecs_t(iev.time.tv_sec) * 1000000000LL + nsecs_t(iev.time.tv_usec) * 1000LL;
event->deviceId = deviceId;
event->type = iev.type;
event->code = iev.code;
event->value = iev.value;
event += 1;
capacity -= 1;)
return event - buffer; //返回所读取的事件个数
processEventsLocked(mEventBuffer, count);//事件处理
void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count)
>>>>>>> "if (type < EventHubInterface::FIRST_SYNTHETIC_EVENT) {"
processEventsForDeviceLocked(deviceId, rawEvent, batchSize);
void InputReader::processEventsForDeviceLocked(int32_t deviceId, const RawEvent* rawEvents, size_t count)
device->process(rawEvents, count);
void InputDevice::process(const RawEvent* rawEvents, size_t count)
mapper->process(rawEvent);//调用具体mapper来处理( 以MultiTouch为例 )
SwitchInputMapper::process(const RawEvent* rawEvent);
KeyboardInputMapper::process(const RawEvent* rawEvent);
CursorInputMapper::process(const RawEvent* rawEvent);
RotaryEncoderInputMapper::process(const RawEvent* rawEve