framework 学习笔记18. input输入事件番外2(整体架构设计和Java层IMS的启动)

1. 介绍:
直入主题,对于安卓输入事件的描述可以理解为:
(1)硬件捕捉并反馈事件给驱动;
(2)通过监听(读取)驱动的变化来获取事件;
(3)在 Android 系统中,InputReader.cpp 通过 EventHub.cpp 监听读取事件,然后经 InputDispatcher.cpp 分发事件,最后交给ViewRootImpl(window监听) 进行处理;

设计可以分为三个部分:读取事件、分发事件、处理事件;

  • 读取事件
    (a)支持多种设备:例如触摸屏、键盘、鼠标等;
    (b)能随时使用:例如插入键盘后立即就可以使用;
    (c)支持多用途使用:例如 Android 系统在不同的语言系统下,相同的键位 "," 呈现的就是不同字符;
  • 分发事件
    (a)分辨不同的事件:例如分辨按键事件,触摸事件等等;
    (b)发送事件:找到当前应该响应该事件的app,然后把事件发送给该app;
  • 处理事件
    (a)应用程序收到事件后响应处理事件,例如点击事件等等;

如下图所示:

input输入事件2.1.png

几个关键类:
EventHub(事件)、InputReader(事件读取)、InputDispatcher(事件分发);另外 InputReaderThread 和 InputDispatcherThread 就是两条处理线程;

2. Java 层 InputManagerService的启动:
安卓系统服务的启动都是在 SystemServer 这个进程中,根据以下的调用关系,可以跟踪到 IMS 的启动代码:
main() -> SystemServer.run() -> startOtherServices()

inputManager = new InputManagerService(context); 
wm = WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore);

ServiceManager.addService(Context.WINDOW_SERVICE, wm);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
mActivityManagerService.setWindowManager(wm);

inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
inputManager.start(); 

注:涉及到 native 层大致流程如下流程图所示:

Input输入事件2.2.png

小结:
(1)SystemServer 中 new 了一个InputManagerService,然后执行了 IMS 的 start() 方法,此时对于 java 层来说,IMS 就已经成功启动了;
(2)在 java 层的 IMS.start() 方法中调用了 nativeInit() 方法,其对应的是 frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp 中的 nativeInit() 方法,在该方法中 new 了一个native层的 NativeInputManager 对象 im,并将该对象的指针返回并赋值给 java 层 IMS 的 mPtr;
(3)在 NativeInputManager 的构造函数中,又 new 了两个新的对象 InputManager 和 EventHub;
sp eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);

InputManager 是 c++ 层的进一步封装,在 InputManager 的构造函数中传入 eventHub 并且创建了 InputDispatcher、InputReader 以及两条处理线程 InputDispatcherThread 和 InputReaderThread,这样一来上面所说的输入事件的几个关键类都在 mInputManager 中;

你可能感兴趣的:(framework 学习笔记18. input输入事件番外2(整体架构设计和Java层IMS的启动))