一、Android的Input子系统启动过程
1.init进程通过Zygote启动SystemServer
2.SystemServer通过WM启动InputManager的两个线程
二、事件分发整体说明
1.InputReaderThread线程调用InputDispatcher分发给InputDispatcherThread线程消息队列mInboundQueue。
2.InputDispatcherThread线程从消息队列mInboundQueue中取出事件分发给当前激活窗口对应C++层消息队列outboundQueue,InputDispatcherThread从当前激活窗口对应C++层的消息队列outboundQueue中取出事件并拷贝至共享内存mSharedMessage。
3.ViewRoot注册进NativeInputQueue的回调函数handleReceiveCallback从共享内存mSharedMessage中取出事件并调用ViewRoot的handleKey/Motion()函数分发进ViewRoot的JAVA层消息队列(见:《Android系统学习》第十章:Android消息处理、消息循环和消息队列)、经过消息循环和处理后分发给mView(PhoneWindow)、间接分发给App的Activity(见《Android系统学习》第十一章:Android应用程序Activity组件分析)。
注意:App中有类继承了Activity类并重新实现了响应函数。
以上1、2中,由于C++层Looper本身就有睡眠/唤醒管道机制、所以是异步处理机制!
以上3中、由于使用了JAVA层looper、handle和messagequeue,所以、也都是异步处理机制!
4.补充
对于上述步骤2和3的说明:Android4.1之后已经不用共享内存了,换之是socket传输:
2中:InputDispatcherThread从当前激活窗口的消息队列outboundQueue中取出事件通过C++层InputChannel的socket发送;
3中:ViewRoot注册进NativeInputEventReceiver的回调函数handleEvent通过C++层InputChannel的socket接收,并分发给ViewRoot的JAVA层消息队列。
并且Android4.1不像之前Android版本会去创建睡眠/唤醒管道和共享内存,换之只是一对socket描述符、完成唤醒/睡眠和数据传输任务。
三、相关链接
1.详解事件分发
Android之Input子系统事件分发流程
Android之Input子系统与输入法
2.游戏手柄
Linux JoyStick设备驱动
Android Input之JoyStick
3.驱动部分
《Android系统学习》第一章:Input子系统驱动部分
Linux内核学习实践之红外驱动分析
Linux IR遥控器不灵敏调试
Linux内核学习实践之GPIO面板按键
《Linux总线、设备与驱动》USBHID设备驱动
《Linux内核编程》第七章:USB CORE与USB键鼠驱动
4.项目问题
Android之Input子系统配置更新导致的Activity重启
Android之Input子系统按键repeat
获取输入设备的vid和pid
Android系统对于Touch设备配置
Android的dialog控制焦点导致其后Activity不响应