📚 Input系统 · 事件分发
🧩 源码深度剖析 · 30讲
01
Input系统整体架构:从触摸屏到应用层的完整链路,InputReader与InputDispatcher的角色分工。
02
EventHub源码分析:EventHub的初始化、打开设备节点、epoll机制监听输入事件。
03
InputReader线程循环:loopOnce()函数详解,从EventHub读取原始事件。
04
原始事件处理流程:RawEvent的获取与初步分类,设备类型判断。
05
InputMapper体系:各类Mapper的注册与选择,比如SingleTouchMapper、MultiTouchMapper。
06
单点触摸Mapper:SingleTouchMapper的process()函数,坐标转换与事件封装。
07
多点触摸Mapper:MultiTouchMapper的process()函数,处理ABS_MT_SLOT等协议。
08
键盘事件Mapper:KeyboardInputMapper的process()函数,键码映射与MetaState处理。
09
事件队列与缓存:InputReader将事件放入QueuedInputListener,批量处理机制。
10
InputDispatcher线程启动:Dispatcher的创建与线程循环,dispatchOnce()函数。
11
事件分发目标查找:findFocusedWindowTargets()与findTouchedWindowTargets()。
12
窗口注册与InputChannel:WindowManagerService如何注册窗口,InputChannel的创建与配对。
13
Connection与事件发送:InputDispatcher为每个窗口维护一个Connection,通过InputChannel发送事件。
14
事件超时与ANR机制:dispatchOnce()中的超时检测,ANR触发条件与日志分析。
15
拦截器Interceptor:InputFilter与InputMonitor的工作原理,事件窃听与修改。
16
按键事件分发流程:从InputDispatcher到ViewRootImpl,KeyEvent的完整旅程。
17
触摸事件分发流程:MotionEvent的封装,从InputDispatcher到ViewRootImpl。
18
ViewRootImpl事件接收:setView()中建立InputChannel,WindowInputEventReceiver的创建。
19
InputEventReceiver的JNI层:nativeInit()与nativeConsumeEvent(),与C++层的交互。
20
事件队列与批处理:InputEventReceiver的consumeBatchedInputEvents(),帧同步机制。
21
View的事件分发入口:ViewRootImpl的deliverInputEvent(),将事件交给DecorView。
22
Activity的事件分发:Activity.dispatchTouchEvent()与PhoneWindow的superDispatchTouchEvent()。
23
ViewGroup的事件分发:dispatchTouchEvent()源码,onInterceptTouchEvent()的调用时机。
24
View的事件处理:onTouchEvent()的默认实现,click与longclick的触发。
25
事件分发中的MotionEvent复用:obtain()与recycle(),避免频繁创建对象。
26
多点触控与手势识别:MotionEvent的指针池,ACTION_POINTER_DOWN与ACTION_POINTER_UP。
27
Input系统性能优化:批量读取、事件合并、VSYNC对齐,减少主线程负载。
28
常见问题与调试技巧:Input阻塞、事件丢失、多点触控异常,使用dumpsys input分析。
29
Input系统与SurfaceFlinger的交互:事件注入与屏幕坐标映射,DisplayInfo的作用。
30
实战:自定义Input设备驱动与事件注入,编写一个虚拟触摸屏驱动并验证事件分发。