总结一下,Android按键事件发布流程
//InputReader.cpp
void InputReader::loopOnce() {
...
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
if (count) {
processEventsLocked(mEventBuffer, count);
}
...
}
InputReader线程启动后,循环调用loopOnce,loopOnce调用mEventHub的getEvents函数,有事件返回底层事件数count,没有则休眠。
//InputReader.cpp
void InputReader::processEventsLocked(const RawEvent* rawEvents, size_t count) {
...
processEventsForDeviceLocked(deviceId, rawEvent, batchSize);
...
}
随后调动上述方法,把事件发送给指定设备。
//InputReader.cpp
void InputReader::processEventsForDeviceLocked(int32_t deviceId,
const RawEvent* rawEvents, size_t count) {
...
device->process(rawEvents, count);
...
}
设备处理该事件
//InputReader.cpp
void InputDevice::process(const RawEvent* rawEvents, size_t count) {
...
mapper->process(rawEvent);
...
}
每个设备可能有多种mapper,比如既有按键又有触摸板,把事件发给相应的mapper
//InputReader.cpp
void KeyboardInputMapper::process(const RawEvent* rawEvent) {
...
processKey(rawEvent->when, rawEvent->value != 0, keyCode, scanCode, flags);
...
}
键盘mapper处理事件
//InputReader.cpp
void KeyboardInputMapper::processKey(nsecs_t when, bool down, int32_t keyCode,
int32_t scanCode, uint32_t policyFlags) {
...
getListener()->notifyKey(&args);
...
}
调用InputDispatcher的notifyKey函数。
//InputDispatcher.cpp
void InputDispatcher::notifyKey(const NotifyKeyArgs* args) {
....
needWake = enqueueInboundEventLocked(newEntry);
if