Android Input(一)-相關(guān)模塊初始化

原創(chuàng)內(nèi)容,轉(zhuǎn)載請(qǐng)注明出處,多謝配合。

一、Android輸入系統(tǒng)介紹

牽涉到的模塊:

  • InputReader: 負(fù)責(zé)從硬件獲取輸入,轉(zhuǎn)換成事件(Event), 并傳給Input Dispatcher.
  • InputDispatcher: 將InputReader傳送過(guò)來(lái)的Events分發(fā)給合適的窗口,并監(jiān)控ANR。
  • InputManagerService: 負(fù)責(zé)InputReader 和 InputDispatcher的創(chuàng)建,并提供Policy 用于Events的預(yù)處理。
  • WindowManagerService:管理InputManager 與 View(Window) 以及 ActivityManager 之間的通信。
  • View and Activity:接收按鍵并處理。
  • ActivityManagerService:ANR 處理。

牽涉到的進(jìn)程
system_server 與 應(yīng)用進(jìn)程。
進(jìn)程對(duì)應(yīng)的主要工作線程
其中system_server中包含InputReaderThread和InputDispatcherThread。
應(yīng)用進(jìn)程相關(guān)的主要是 UIThread。

二、初始化

在SystemServer的初始化過(guò)程中,IMS和WMS 被創(chuàng)建出來(lái),并將WMS中的monitor傳給了IMS,作為回調(diào)。

frameworks/base/services/java/com/android/server/SystemServer.java

private void startOtherServices() {
   WindowManagerService wm = null;
   InputManagerService inputManager = null;
   …
   inputManager = new InputManagerService(context);
   ...
   wm = WindowManagerService.main(context, inputManager,
             mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
             !mFirstBoot, mOnlyCore, new PhoneWindowManager());
   ServiceManager.addService(Context.WINDOW_SERVICE, wm);
   ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
   …
   inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
   inputManager.start();
   ...
}

IMS的構(gòu)造方法中執(zhí)行了nativeInit,這是個(gè)native方法,屬于jni調(diào)用,該方法中創(chuàng)建了一個(gè)NativeInputManager實(shí)例,并且和java層使用的是同一個(gè)looper。

frameworks/base/services/core/java/com/android/server/input/InputManagerService.java

public InputManagerService(Context context) {
    this.mContext = context;
   this.mHandler = new InputManagerHandler(DisplayThread.get().getLooper());
    ...
   mPtr = nativeInit(this, mContext, mHandler.getLooper().getQueue());
    ...
}

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);
    if (messageQueue == NULL) {
        jniThrowRuntimeException(env, "MessageQueue is not initialized.");
        return 0;
    }
    NativeInputManager* im = new NativeInputManager(contextObj, serviceObj,
            messageQueue->getLooper());
    im->incStrong(0);
    return reinterpret_cast<jlong>(im);
}

在NativeInputManager的初始化中創(chuàng)建了一個(gè)Eventhub,同時(shí)將這個(gè)Eventhub傳給新建的Inputmanager,Eventhub就是將數(shù)據(jù)從硬件驅(qū)動(dòng)上讀出來(lái)然后傳遞上來(lái)的通道。

frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp

NativeInputManager::NativeInputManager(jobject contextObj,
        jobject serviceObj, const sp<Looper>& looper) :
        mLooper(looper), mInteractive(true) {
    ...
    sp<EventHub> eventHub = new EventHub();
    mInputManager = new InputManager(eventHub, this, this);
}

InputManager初始化時(shí)創(chuàng)建了兩個(gè)重要操作類:InputReaderInputDispatcher。

frameworks/native/services/inputflinger/InputManager.cpp

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();
}

initialize方法初始化對(duì)應(yīng)的兩個(gè)線程:InputReaderThreadInputDispatcherThread。

void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

InputManager的start方法,讓兩個(gè)線程run起來(lái)。

frameworks/native/services/inputflinger/InputManager.cpp

status_t InputManager::start() {
    status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
    if (result) {
        ALOGE("Could not start InputDispatcher thread due to error %d.", result);
        return result;
    }
    result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
    if (result) {
        ALOGE("Could not start InputReader thread due to error %d.", result);
        mDispatcherThread->requestExit();
        return result;
    }
    return OK;
}

那么這個(gè)InputManager的start方法在哪調(diào)的呢?回看IMS的start方法

frameworks/base/services/core/java/com/android/server/input/InputManagerService.java

public void start() {
    Slog.i(TAG, "Starting input manager");
   nativeStart(mPtr);
 ...
}

這里又是調(diào)的native方法: nativeStart(mPtr)

frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp

static void nativeStart(JNIEnv* env, jclass /* clazz */, jlong ptr) {
    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);
    status_t result = im->getInputManager()->start();
    if (result) {
        jniThrowRuntimeException(env, "Input manager could not be started.");
    }
}

這里獲取InputManager并調(diào)用它的start方法。

所以根據(jù)以上的初始化過(guò)程總結(jié)整個(gè)層次關(guān)系:

從這個(gè)初始化過(guò)程來(lái)看:IMS的邏輯基本上都是通過(guò)jni實(shí)現(xiàn)在native層。

下一篇文章:
Android Input(二)-輸入子系統(tǒng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

推薦閱讀更多精彩內(nèi)容

  • InputManagerService(IMS) Linux內(nèi)核,接受輸入設(shè)備的中斷,并將原始事件的數(shù)據(jù)寫(xiě)入設(shè)備節(jié)...
    傀儡世界閱讀 4,078評(píng)論 1 2
  • 關(guān)聯(lián)系列解析WMS系列View體系系列 前言 很多同學(xué)可能會(huì)認(rèn)為輸入系統(tǒng)是不是和View的事件分發(fā)有些關(guān)聯(lián),確實(shí)是...
    劉望舒閱讀 2,639評(píng)論 2 17
  • http://www.lxweimin.com/p/2bff4ecd86c9本篇博客主要是過(guò)一下Android I...
    wbo4958閱讀 7,896評(píng)論 4 20
  • 序言 最近在看Android觸摸屏事件相關(guān)的源碼,為了對(duì)整個(gè)事件體系的了解,所以對(duì)事件相關(guān),從事件的產(chǎn)生,寫(xiě)入設(shè)備...
    Jensen95閱讀 735評(píng)論 0 3
  • 以后我打算換一種寫(xiě)法,前面的文章很多都是大段大段代碼往上扔,別說(shuō)大家了,我想回過(guò)頭來(lái)看的時(shí)候都覺(jué)得惡心,所以我以后...
    我叫王菜鳥(niǎo)閱讀 622評(píng)論 0 0