跳转至

Input概述

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

评论