input之我见03——InputMangerService(Android4.4)

input之我见03——InputMangerService(Android4.4)

继续上一讲,从InputManagerService讲起,自上而下分析。
Android中管理Input的两个主要相关角色, 一是WindowManagerService, 一是跟View相关的ViewRootImpl. 基本原理方向从2.3到目前的4.2都一样,在  Android app一启动之后, ViewRootImpl 就会先跟 WindowManagerService 建立inputChannel, 一旦 WindowManagerService 有收到 event 就会经由 inputChannel 通知 ViewRootImpl 去共享内存中抓取 event. 虽然方向一样, 但是里面的架构有改,目前最新的版本是android 4.2, 所以以下的输入事件处理程序是以4.2来说明, 以后的版本一定会再更改.到时候在研究
0,和input相关的几个目录(4.4为例)
frameworks/base/core/java/android/hardware/input     -> class InputManager //api
IInputDevicesChangedListener.aidl  IInputManager.aidl  InputManager.java  KeyboardLayout.aidl  KeyboardLayout.java
Class Overview
Provides information about input devices and available key layouts.
Get an instance of this class by calling Context.getSystemService() with the argument INPUT_SERVICE.
frameworks/base/services/java/com/android/server/input     -> InputMangerService 服务。system/framework/services.jar  
          (InputApplicationHandle.java  InputManagerService.java  InputWindowHandle.java  PersistentDataStore.java)

framework/base/services/input/      -> /system/lib/libinputserver.so
frameworks/native/libs/input          ->/system/lib/libinput.so     //character map
frameworks/base/cmds/input/         -> /system/bin/input     //input command
1,InputMangerService是怎么产生的?
base/services/java/com/android/server/SystemServer.java
 329             Slog.i(TAG, “Input Manager”);                                                                                                                
330             inputManager = new InputManagerService(context, wmHandler);
InputManagerService的代码位于
frameworks/base/services/java/com/android/server/input/InputManagerService.java
2,
一开机的时候, SystemServer 会启动 InputManagerService, 这时 InputManagerService 又会去启动两个Thread,InputReaderThread,InputDispatcherThread和一个 EventHubInterface 
{
如何来生成两个Thread?
InputManagerSerivice.java中的构造函数
InputManagerService()
->
nativeInit()
->
com_android_server_input_InputManagerService.cpp
nativeInit()
->
new NativeInputManager()
->
new InputManager()
->
framework/native/service/inputflinger(androidL)
InputManager::InputManager(
        const sp<EventHubInterface>& eventHub,
        const sp<InputReaderPolicyInterface>& readerPolicy,
        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
    mDispatcher = new InputDispatcher(dispatcherPolicy);
    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
initialize();
}
=>
void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}
—-
以InputReaderThread为例
InputReader.cpp
InputReaderThread::InputReaderThread(const sp<InputReaderInterface>& reader) :
        Thread(/*canCallJava*/ true), mReader(reader) {
}

InputReaderThread::~InputReaderThread() {
}

bool InputReaderThread::threadLoop() {
    mReader->loopOnce();//这里的mReader就是InputReader的实例
    return true;
}

->
void InputReader::loopOnce() {
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);//EventHubInterface,getEvents就是读driver的/dev目录
}
其中,这个线程有一个非常重要的函数getEvents,就是这个线程主要的工作
getEvents(){
for(; 😉
{
readNotifyLocked()
}
}
会不停的读系统输入设备的状态。

}

因此输入事件处理流程跟此三位角色有关系.InputReaderThreadEventHubInterface抓取新的inputevent, 然后在依各个的eventtype 进入各个的 event mapper,  各个的 event mapper 处理输入事件完之后,InputReaderThread 将new input 放进 Queue 中. 之后 InputDispatcherThread再从Queue中取出Input Event 放入共享内存中. 此时再通知 View 去共享内存抓取 new Input Event, 取完之后再通知InputDispatcherThread是否可以再放新的InputEvent到共享内存中, 
这段话这样解释。
Comments are closed.
TOP