7-INPUT

INPUT

当用户触摸屏幕或者按键操作,首次触发的是硬件驱动,驱动收到事件后,将该相应事件写入到输入设备文件中(dev/input/)。接着,输入系统取出原生态的事件,经过层层封装后成为 KeyEvent 或者 MotionEvent ;最后,交付给相应的目标窗口 (Window) 来消费该输入事件。

在屏幕接收到触摸信息后,会把这个信息交给 InputServiceManager 去处理,最后通过 WindowManagerService 找到符合的 window。
并把触摸信息发送给 viewRootImpl, viewRootImpl 经过层层封和处理之后,产生一个 MotionEvent 事件分发给 view。

unknown_filename.8
unknown_filename.9
unknown_filename.10

  1. SystemServer 创建并启动 InputManagerService
  2. InputManagerService 在 native 层创建一个 NativeInputManager 对象
  3. NativeInputManager 内部创建一个 InputManager 对象
  4. InputManager 启动 InputReaderThread 和 InputDispatcherThread(2个线程)
  5. 在 InputReaderThread 线程中调用 EventHub 的 getEvents 获取设备节点中的输入事件。
  6. 并将输入事件封装为 NotifyKeyArgs 对象放入队列中。
  7. 之后再调用 flush,依次将事件传递给 InputDispatcher。
  8. InputDispatcher 在收到事件后,会重新封装为一个 KeyEntry 对象,并压力压入 mInboundQueue 队列中。
  9. 唤醒 InputDispatcherThread 线程。Wake
  10. 事件交给 wms, 最后给 ViewRootImp;

Input 模块的主要组成

  • IMS 的作用:读取设备节点(dev/input/)中的输入事件,并对数据进行二次甚至三次加工后分发给合适的 Window 进行处理

  • Native 层的 InputReader 负责从 EventHub 取出事件并处理,再交给 InputDispatcher;

  • Native 层的 InputDispatcher 接收来自 InputReader 的输入事件,并记录 WMS 的窗口信息,用于派发事件到合适的窗口;

  • 设备驱动层就会接受到原始事件最终将事件传递到用户空间的设备节点(dev/input/)中

  • Java 层的 InputManagerService 跟 WMS 交互,WMS 记录所有窗口信息,并同步更新到 IMS,为 InputDispatcher 正确派发事件到 ViewRootImpl 提供保障;

  • TYPE_KEY 按键事件,TYPE_MOTION 触摸事件

unknown_filename.6

Android Input系统(一)事件读取机制

在 SystemServer 的 run 方法中调用了 startOtherServices。

1
2
3
4
5
6
7
8
9
10
11
Private void startOtherServices () {
...
InputManager = new InputManagerService (context);//1
...
Wm = WindowManagerService.Main (context, inputManager,
                  MFactoryTestMode != FactoryTest. FACTORY_TEST_LOW_LEVEL,
                  !MFirstBoot, mOnlyCore, new PhoneWindowManager ());//2
...
InputManager.Start ();//3
}


7-INPUT
http://peiniwan.github.io/2024/04/c6d2b70a25e1.html
作者
六月的雨
发布于
2024年4月6日
许可协议