
1. 硬件层到Linux内核
- 设备节点 :触摸事件由内核驱动捕获,写入
/dev/input/eventX
。 - 关键结构体 :
input_event
(包含时间戳、类型、代码、值)。
2. Native层处理(system_server进程)
2.1 EventHub
-
路径 :
frameworks/native/services/inputflinger/EventHub.cpp
-
职责 :通过
epoll
监听设备节点,读取原始事件。 -
关键函数 :
CPP
size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize);
2.2 InputReader
-
路径 :
frameworks/native/services/inputflinger/InputReader.cpp
-
职责 :将原始事件转换为
KeyEvent
/MotionEvent
。 -
线程模型 :
InputReaderThread
循环调用loopOnce()
。 -
关键类 :
InputDevice
:设备抽象。TouchInputMapper
:处理触摸事件映射。
CPP
void InputReader::loopOnce();
2.3 InputDispatcher
-
路径 :
frameworks/native/services/inputflinger/InputDispatcher.cpp
-
职责 :事件分发策略管理,通过
InputChannel
发送事件到应用。 -
关键函数 :
CPP
void InputDispatcher::dispatchOnce(); // 主分发循环 status_t InputDispatcher::dispatchMotion(...); // 处理MotionEvent分发
-
数据传递 :
InputEvent
封装为InputMessage
,通过共享内存或Socket传递。
2.4 InputChannel与跨进程通信
- IPC机制 :基于Socket或共享内存(
ashmem
)。 - 关键类 :
InputChannel
:封装通信通道(服务端/客户端各一个Socket)。InputWindowHandle
:关联窗口焦点信息。
- 注册流程 :应用通过
ViewRootImpl.addToDisplay()
注册窗口时,通过WindowManagerService
创建InputChannel
。
3. 应用进程处理(App进程)
3.1 NativeInputEventReceiver
-
路径 :
frameworks/base/core/jni/android_view_InputEventReceiver.cpp
-
职责 :通过
Looper
监听InputChannel
,接收事件。 -
关键函数 :
CPP
status_t NativeInputEventReceiver::consumeEvents(...); // JNI层事件接收
3.2 ViewRootImpl.WindowInputEventReceiver
-
路径 :
frameworks/base/core/java/android/view/ViewRootImpl.java
-
职责:将事件传递给Java层。
-
关键代码 :
JAVA
final class WindowInputEventReceiver extends InputEventReceiver { @Override public void onInputEvent(InputEvent event) { enqueueInputEvent(event, this, 0, true); } }
4. Java层事件分发
4.1 ViewRootImpl分发入口
-
关键函数 :
JAVA
void deliverInputEvent(InputEvent event) { // 调用DecorView的dispatchInputEvent mView.dispatchPointerEvent(event); }
4.2 Activity/View树分发
-
流程 :
- Activity :
dispatchTouchEvent()
→Window.superDispatchTouchEvent()
。 - DecorView :
dispatchTouchEvent()
→Activity.dispatchTouchEvent()
。 - ViewGroup :
onInterceptTouchEvent()
→dispatchTouchEventToChildren()
。 - View :
onTouchEvent()
处理事件。
- Activity :
-
关键方法 :
JAVA
// ViewGroup public boolean dispatchTouchEvent(MotionEvent ev); public boolean onInterceptTouchEvent(MotionEvent ev); // View public boolean onTouchEvent(MotionEvent event);
4.3 MotionEvent对象复用
- 优化机制 :通过
MotionEvent.obtain()
复用对象,减少GC压力。
5. 关键数据结构
- InputEvent:基类,包含设备ID、事件时间。
- MotionEvent :存储触摸坐标、动作(
ACTION_DOWN
/ACTION_MOVE
等)。 - InputMessage:跨进程传输的二进制结构,包含事件类型、窗口令牌等。
6. 超时与ANR机制
- InputDispatcher :等待应用
finishInputEvent()
确认处理,超时(默认5秒)触发ANR。 - 监控逻辑 :在
InputDispatcher::dispatchEntryLocked()
中设置超时检查。