请支持原创~~
基于版本:Android R
源码
frameworks/native/servcies/inputflinger/
产生:
- libinputflinger.so
- libinputflinger_base.so
- libinputreader.so
frameworks/native/libs/input/
产生:
- libinput.so
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
概述
在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的。
在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerService,WindowManagerService在启动的时候就会通过系统输入管理器InputManager来总负责监控键盘消息。这些键盘消息一般都是分发给当前激活的Activity窗口来处理的,因此,当前激活的Activity窗口在创建的时候,会到WindowManagerService中去注册一个接收键盘消息的通道,表明它要处理键盘消息,而当InputManager监控到有键盘消息时,就会分给给它处理。当当前激活的Activity窗口不再处于激活状态时,它也会到WindowManagerService中去反注册之前的键盘消息接收通道,这样,InputManager就不会再把键盘消息分发给它来处理。
框架
框架有三条主线,分别是黄色、蓝色、红色:
- 黄色为创建主线,从SystemServer 开始启动input service,并创建native 实例,最终创建dispatcher thread、reader thread;
- 蓝色为运行主线,SystemServer 会调用 IMS.start(),用以启动native 下的dispatcher thread 和reader thread;
- 红色为event主线,InputReaderThread 负责通过EventHub 监听event,EventHub通过epoll 机制监听驱动收到的input 消息,并通过getEvent 接口返回给InputReaderThread,进而notify 给InputDispatcher,将event 存入InputDispatcher 的mInboundQueue 后,InputDispatcher 会唤醒dispatcher thread,最终真正分发到各个App;
模块组成:
- Java 层InputManagerService 跟WMS 交互,WMS 记录所有窗口信息,并同步更新到 IMS, 为InputDispatcher 正确派发event 到ViewRootImpl 提供保障;
- JNI 层 NativeInputManager 是Java 与 native 交互的重要转接点,这里是 inputflinger 创建起点,也是InputManager 实例创建、存放点;
- native 层 InputManager 是inputflinger 的server 端,用以注册和反注册 InputChannel,也是InputReader 和InputDispatcher 启动的起点;
- native 层InputReader 负责从EventHub 取出事件并处理,再交给InputDispatcher;
- native 层InputDispatcher 接收来自InputReader 的输入事件,并记录 WMS 的窗口信息,用于派发事件到合适的窗口;
当然这些空口说也没什么效果,还是需要结合source code 来分析,但是这个过程比较长,所以,将其细分为:
Android input 原理分析(一) _ input 启动
Android input 原理分析(二) _ EventHub
Android input 原理分析(三) _ scanCode与keyCode映射
Android input 原理分析(四) _ input 分发
Andorid input 原理分析(五) _ input 命令