学习笔记-说说 InputManagerService 相关内容
本博客在 https://wkmcyz.notion.site/InputManagerService-616004c0a3fa4324b952f7e8563a010f 可以获得更好的阅读体验。
学习笔记-说说 InputManagerService 相关内容
Android 的触摸事件,可以分为三部分。
第一部分是硬件部分,检测触摸事件,这一步需要传感器之类的组件来完成。这部分主要是硬件相关的知识。
第二部分是操作系统部分, 将触摸事件传递给应该接受它的目标应用。本篇后面会说的 InputManagerService 的相关内容就是解释这部分的流程的。
第三部分是控件级别(即各个 View 类)的处理,来消化该触摸事件。这是 Android 应用的 view 触摸事件处理,不在此讨论
InputManagerService 的简单介绍
InputManagerService 是 Android 的一个系统服务,运行在 system_server 进程中,和 WMS 一起配合维护着 Android 的输入事件的管理,也就是上面提到的 “操作系统处理” 的部分。
想象一下,这样一个传递触摸事件的管理者需要进行哪些操作。主要应该分为三步,第一是从硬件部分接收事件;第二是进行一些自己的处理;第三是将这部分事件传递给其对应的进程以及对应的控件。我们也主要对这三步进行说明。
第一步:从设备读取原始的输入事件
Android 设备在发生输入事件的时候,会将触摸事件写入一个文件,InputManagerService 依赖 epoll 机制从该文件读取触摸事件的信息,读取到的便是原始的输入事件。这就是最初 InputManagerService 的输入。
EventHubIMS 将原始输入事件转成 Android 系统的输入事件 :
- InputReader
- InputMapper
- mapper 包 , 其中包含了很多种类的 mapper,例如键盘输入事件的 mapper、鼠标输入事件的 mapper。
IMS 将输入事件分派给指定窗口 :
- InputDispatcher
- NativeInputManager
IMS 将输入事件传输给指定窗口 :
- InputChannel ,类似 Binder 用来做跨进程通信的类,基于 socket 实现。
- Connection , IMS 服务内部对 InputChannel 的封装,包括对该通道的待发布事件的缓存等。
- InputMessage,IMS 发送的事件的数据封装。
- InputPublisher,Connection 内部对 InputChannel 的封装。
窗口接收输入事件:
- InputEventReceiver,接受输入事件的入口,并且负责给 IMS 接受消息的确认。