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

本文介绍了Android 6.0中的InputManagerService(IMS),它分为Java层和Native层。启动从Java层的初始化开始,然后进入Native层。在SystemServer的startOtherServices()中初始化InputManagerService,接着调用nativeInit()。在C++的InputManagerService.cpp中,创建了NativeInputManager,作为Java和Native层交互的关键。NativeInputManager构造函数中涉及EventHub和InputManager,这两个组件是输入系统的重要部分。
摘要由CSDN通过智能技术生成

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源码分析》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值