Android之input输入系统之ImputManagerService启动
概述
当用户触摸屏幕或者按键操作,首次触发的是硬件驱动,驱动收到事件后,将该相应事件写入到输入设备节点, 这便产生了最原生态的内核事件。接着,输入系统取出原生态的事件,经过层层封装后成为KeyEvent或者MotionEvent ;最后,交付给相应的目标窗口(Window)来消费该输入事件。可见,输入系统在整个过程起到承上启下的衔接作用。
Input模块的主要组成:
- Native层的InputReader负责从EventHub取出事件并处理,再交给InputDispatcher;
- Native层的InputDispatcher接收来自InputReader的输入事件,并记录WMS的窗口信息,用于派发事件到合适的窗口;
- Java层的InputManagerService跟WMS交互,WMS记录所有窗口信息,并同步更新到IMS,为InputDispatcher正确派发事件到ViewRootImpl提供保障;
InputManagerService启动
在SystemServer的main方法里面会调用startOtherServices。startOtherServices里面会启动InputManagerService。
1 | private void startOtherServices( { TimingsTraceAndSlog t) |
InputManagerService#start
1 | /** |
调用Native层的Init的初始化方法.上层传下来的MessageQueue。再进行强制类型转换会Native层的MessageQueue.同时实例化Native层的NativeInputManager对象。返回给上层。而在三
com_android_server_inputManagerService#nativeInit
1 | // ---------------------------------------------------------------------------- |
InputManager构造
1 | /** |
InputManager::crateInputDispatcher
1 | /** |
InputDispatcher构造函数
1 | InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& policy) |
InputReader构造函数
1 | // --- InputReader --- |
EventHub
1 | /** |
以上,就是NativeInputManager进行实例化的时候。创建的很多我们在输入数据采集的时候的很多重要的对象。至此。上层的InputManagerService调用nativeInit的方法至此分析。
com_android_server_inputManagerService#nativeStart
1 | /** |
InputManager::start
1 | status_t InputManager::start() { |
InputDispatcher::start
1 | status_t InputDispatcher::start() { |
InputReader::start
1 | /** |
InputManager的start方法的主要功能是启动两个线程:
- 启动线程“InputReader”
- 启动线程”InputDispatcher“
归纳总结
分层视角:
- Java层InputManagerService:采用android.display线程处理Message.
- JNI的NativeInputManager:采用android.display线程处理Message,以及创建EventHub。
- Native的InputManager:创建InputReaderThread和InputDispatcherThread两个线程
主要功能:
- IMS服务中的成员变量mPtr记录Native层的NativeInputManager对象;
- IMS对象的初始化过程的重点在于native初始化,分别创建了以下对象:
- NativeInputManager;
- EventHub, InputManager;
- InputReader,InputDispatcher;
- InputReaderThread,InputDispatcherThread
- IMS启动过程的主要功能是启动以下两个线程:
- InputReader:从EventHub取出事件并处理,再交给InputDispatcher
- InputDispatcher:接收来自InputReader的输入事件,并派发事件到合适的窗口。
从整个启动过程,可知有system_server进程中有3个线程跟Input输入系统息息相关,分别是android.display
, InputReader
,InputDispatcher
。
- InputDispatcher线程:属于Looper线程,会创建属于自己的Looper,循环分发消息;
- InputReader线程:通过getEvents()调用EventHub读取输入事件,循环读取消息;
- android.display线程:属于Looper线程,用于处理Java层的IMS.InputManagerHandler和JNI层的NativeInputManager中指定的MessageHandler消息;
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 麦溪·在路上!
评论
ValineDisqus