Android输入事件传递流程系统源码级解析


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树分发
  • 流程 :

    1. Activity :dispatchTouchEvent() → Window.superDispatchTouchEvent()。
    2. DecorView :dispatchTouchEvent() → Activity.dispatchTouchEvent()。
    3. ViewGroup :onInterceptTouchEvent() → dispatchTouchEventToChildren()。
    4. View :onTouchEvent()处理事件。
  • 关键方法 :

    复制代码

    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()中设置超时检查。
相关推荐
好的佩奇4 小时前
蓝牙之通信架构
android·flutter·蓝牙
FlightYe4 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
诸神黄昏EX5 小时前
Android fw BatteryService
android
alexhilton5 小时前
提升 Android Compose 页面的流畅度
android·kotlin·android jetpack
撩得Android一次心动7 小时前
Android中Gradle网络下载超时、更改存放位置(解决方案)
android·gradle
HQL_seven8 小时前
【Activity】Android Activity详解
android
AI2中文网8 小时前
安卓 15/16 手机软键盘遮挡输入框、布局顶不上去?已解决:重新编译即可
android·智能手机
字节暗面8 小时前
Android APP 加固横评记录:爱加密、梆梆、网易易盾与腾讯 ACE
android·逆向工程·加固
落魄Android在线炒饭9 小时前
Android 实战问题反推 OpenGL 概念(上)
android·opengl
booboosui9 小时前
DeepSeek 的 Worker 调得动 GitHub,调不动微信:三类 Worker 的实现差别
android