Input概述
Input文章列表¶
...
简介¶
Android最常见的输入设备是触摸屏,然而除了触摸屏,安卓还支持其他输入设备如鼠标、游戏手柄、键盘等。 当输入设备可用时,Linux内核会在/dev/input/下创建对应的名为event0~n或其他名称的设备节点。而当输入设备不可用时,则会将对应的节点删除。 在用户空间可以通过ioctl的方式从这些设备节点中获取其对应的输入设备的类型、厂商、描述等信息。
当用户操作输入设备时,Linux内核接收到相应的硬件中断,然后将中断加工成原始的输入事件数据并写入其对应的设备节点中,在用户空间可以通过read()函数将事件数据读出。Android输入系统的工作原理概括来说,就是监控/dev/input/下的所有设备节点,当某个节点有数据可读时,将数据读出并进行一系列的翻译加工,然后在所有的窗口中寻找合适的事件接收者,并派发给它。
主要模块¶
-
InputManagerService 位于 frameworks/base/services/core/java/com/android/server/input/ 目录,主要是通过 jni 跟 inputflinger 交互;还有就是跟 wms 交互。
-
JNI 位于 frameworks/base/services/core/jni/ 目录,如 com_android_server_input_InputManagerService.cpp
-
WMS-PhoneWindowManager 位于 frameworks/base/services/core/java/com/android/server/policy/ 目录。DispatcherPolicy 对事件的拦截主要就是在 PhoneWindowManager 做的策略。
-
InputReader 位于 frameworks/native/services/inputflinger/reader/ 目录。它运行于一个独立的线程中,负责管理输入设备的列表与配置,以及进行输入事件的加工处理。
-
InputDispatcher 位于 frameworks/native/services/inputflinger/dispatcher/ 目录。它也运行于一个独立的线程中。InputDispatcher中保管了来自WMS的所有窗口的信息,其收到来自InputReader的输入事件后,会在其保管的窗口中寻找合适的窗口,并将事件派发给此窗口。
相关动态库¶
-
libinputreader.so frameworks/native/services/inputflinger/reader/
-
libinputflinger.so frameworks/native/services/inputflinger/ frameworks/native/services/inputflinger/dispatcher/
修改 frameworks/native/services/inputflinger/dispatcher/ 目录是会编译到 libinputflinger.so,而不是 libinputdispatcher.so
-
libinputservice.so frameworks/base/libs/input/
-
libinput.so frameworks/native/libs/input/
架构¶
Android input 事件的整体传递流程如图。
设备节点 -> EventHub -> InputReader -> InputDispatcher -> APP