Android6.0输入系统之InputManagerService构成分析

IMS分为Java层与Native层两部分,其中启动过程是从Java部分的初始化开始,进而完成Native部分的初始化。
/frameworks/base/services/java/com/android/server/SystemServer.java

private void startOtherServices() {
    ...
    Slog.i(TAG, "Input Manager");
    //新建IMS对象
    inputManager = new InputManagerService(context);
    ...
    //设置向WMS发起回调Callback对象
    inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
    //启动IMS
    inputManager.start();
    ...
}

IMS和WMS、AMS一样都是重要的系统服务,IMS在SystemServer.startOtherServices()中进行初始化,并调用 start 方法启动。
/frameworks/base/services/core/java/com/android/server/input/InputManagerService.java

public InputManagerService(Context context) {
    ...
    //每一个分为Java和Native两部分的对象在创建时都会有一个nativeInput函数
    mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
    ...
}

在InputManagerService 中,直接调用 nativeInit 在 native 中进行初始化。
/frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp

static jlong nativeInit(JNIEnv* env, jclass /* clazz */,
        jobject serviceObj, jobject contextObj, jobject messageQueueObj) {
    sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueObj);
    ...
    //新建一个NativeInputManager对象,此对象将是Native层与Java层IMS进行通信的桥梁
    NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
            messageQueue->getLooper());
    im->incStrong(0);
    //返回NativeInputManager对象的指针给Java层的IMS,IMS将其保存在mPtr成员变量中
    return reinterpret_cast<jlong>(im);
}
NativeInputManager::NativeInputManager(jobject contextObj,
        jobject serviceObj, const sp<Looper>& looper) :
        mLooper(looper), mInteractive(true) {
    ...
    //NativeInputManager创建了EventHub
    sp<EventHub> eventHub = new EventHub();
    //继续创建Native层的InputManager
    mInputManager = new InputManager(eventHub, this, this);
}

nativeInit()函数创建了一个类型为NativeInputManager的对象,它是Java层和Native层互相通信的桥梁。在NativeInputManager构造函数中,有两个重要的角色,分别是EventHub和InputManager。
/frameworks/native/services/inputflinger/InputManager.cpp

InputManager::InputManager(
        const sp<EventHubInterface>& eventHub,
        const sp<InputReaderPolicyInterface>& readerPolicy,
        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
    //创建InputDispatcher    
    mDispatcher = new InputDispatcher(dispatcherPolicy);
    //创建InputReader
    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
    //初始化
    initialize();
}
void InputManager::initialize() {
    //创建供InputReader运行的线程InputReaderThread
    mReaderThread = new InputReaderThread(mReader);
    //创建供InputDispatcher运行的线程InputDispatcherThread
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

至此,IMS的创建就完成了,在这个过程中,输入系统的重要参与者均完成创建。接下来继续分析《Android6.0输入系统之EventHub源码分析》

猜你喜欢

转载自blog.csdn.net/warticles/article/details/80975585