目录
- InputManagerService是Android framework中核心service之一,Android framework层涉及的代码也是非常多
- IMS(InputManagerService)管理android系统中的所有输入,包括常见的触摸屏和键盘,还包括各种传感器的输入。
- IMS和其他的系统服务一样,都是在SystemServer中创建的
frameworks/native/services/inputflinger/
- InputDispatcher.cpp
- InputReader.cpp
- InputManager.cpp
- EventHub.cpp
- InputListener.cpp
frameworks/native/libs/input/
- InputTransport.cpp
- Input.cpp
- InputDevice.cpp
- Keyboard.cpp
- KeyCharacterMap.cpp
- IInputFlinger.cpp
frameworks/base/services/core/
- java/com/android/server/input/InputManagerService.java
- jni/com_android_server_input_InputManagerService.cpp

从简单的分类可以看做是两层:
- Java层,InputManagerService负责对外提供服务,给WindowManagerService提供输入信息的回调
- Native层,监控Linux上报的输入事件,把事件处理成Android的KeyCode,给想要处理的Window发送输入事件
前面介绍了Linux的输入子系统,可以看到应用层的输入子系统框架都是基于驱动抽象出来的文件系统设备节点的读写来处理的,虽然说起来比较简单,但是在整个复杂的Android操作系统中,把输入事件发送到UI层处理还是非常复杂的一个过程。
当用户按下按键或者触摸屏幕时,输入系统会取出驱动上报的时间,经过层层封装转换成Android层能识别的KeyEvent或者MotionEvent,最后交付给对应的目标窗口来消费输入事件。
输入模块的组成:
- Native层的InputReader负责从EventHub取出事件并处理,再交付给InputDispatcher线程
- Native的InputDispatcher线程接收到来自InputReader的输入事件,并记录WMS的窗口信息,用来派发到合适的窗口
- Java层的InputManagerService跟WMS交互,WMS记录窗口信息,同步更新到IMS,为InputDispatcher线程正确派发事件到ViewRootImpl提供保障
InputManagerService启动过程
InputManagerService作为system_server中的重要服务,继承与IInputManager.Stub,作为binder的服务端,client位于InputManager的内部通过IInputManagerStub.asInterface()获取binder的代理端,C/S两端通信协议是由IInputManager.aidl来定义。
IMS涉及到的重要的类: