framework 學(xué)習(xí)筆記18. input輸入事件番外2(整體架構(gòu)設(shè)計(jì)和Java層IMS的啟動(dòng))

1. 介紹:
直入主題,對(duì)于安卓輸入事件的描述可以理解為:
(1)硬件捕捉并反饋事件給驅(qū)動(dòng);
(2)通過(guò)監(jiān)聽(tīng)(讀取)驅(qū)動(dòng)的變化來(lái)獲取事件;
(3)在 Android 系統(tǒng)中,InputReader.cpp 通過(guò) EventHub.cpp 監(jiān)聽(tīng)讀取事件,然后經(jīng) InputDispatcher.cpp 分發(fā)事件,最后交給ViewRootImpl(window監(jiān)聽(tīng)) 進(jìn)行處理;

設(shè)計(jì)可以分為三個(gè)部分:讀取事件、分發(fā)事件、處理事件;

  • 讀取事件
    (a)支持多種設(shè)備:例如觸摸屏、鍵盤(pán)、鼠標(biāo)等;
    (b)能隨時(shí)使用:例如插入鍵盤(pán)后立即就可以使用;
    (c)支持多用途使用:例如 Android 系統(tǒng)在不同的語(yǔ)言系統(tǒng)下,相同的鍵位 "," 呈現(xiàn)的就是不同字符;
  • 分發(fā)事件
    (a)分辨不同的事件:例如分辨按鍵事件,觸摸事件等等;
    (b)發(fā)送事件:找到當(dāng)前應(yīng)該響應(yīng)該事件的app,然后把事件發(fā)送給該app;
  • 處理事件
    (a)應(yīng)用程序收到事件后響應(yīng)處理事件,例如點(diǎn)擊事件等等;

如下圖所示:

input輸入事件2.1.png

幾個(gè)關(guān)鍵類(lèi):
EventHub(事件)、InputReader(事件讀取)、InputDispatcher(事件分發(fā));另外 InputReaderThread 和 InputDispatcherThread 就是兩條處理線(xiàn)程;

2. Java 層 InputManagerService的啟動(dòng):
安卓系統(tǒng)服務(wù)的啟動(dòng)都是在 SystemServer 這個(gè)進(jìn)程中,根據(jù)以下的調(diào)用關(guān)系,可以跟蹤到 IMS 的啟動(dòng)代碼:
main() -> SystemServer.run() -> startOtherServices()

inputManager = new InputManagerService(context); 
wm = WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore);

ServiceManager.addService(Context.WINDOW_SERVICE, wm);
ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
mActivityManagerService.setWindowManager(wm);

inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
inputManager.start(); 

注:涉及到 native 層大致流程如下流程圖所示:

Input輸入事件2.2.png

小結(jié):
(1)SystemServer 中 new 了一個(gè)InputManagerService,然后執(zhí)行了 IMS 的 start() 方法,此時(shí)對(duì)于 java 層來(lái)說(shuō),IMS 就已經(jīng)成功啟動(dòng)了;
(2)在 java 層的 IMS.start() 方法中調(diào)用了 nativeInit() 方法,其對(duì)應(yīng)的是 frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp 中的 nativeInit() 方法,在該方法中 new 了一個(gè)native層的 NativeInputManager 對(duì)象 im,并將該對(duì)象的指針?lè)祷夭①x值給 java 層 IMS 的 mPtr;
(3)在 NativeInputManager 的構(gòu)造函數(shù)中,又 new 了兩個(gè)新的對(duì)象 InputManager 和 EventHub;
sp<EventHub> eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);

InputManager 是 c++ 層的進(jìn)一步封裝,在 InputManager 的構(gòu)造函數(shù)中傳入 eventHub 并且創(chuàng)建了 InputDispatcher、InputReader 以及兩條處理線(xiàn)程 InputDispatcherThread 和 InputReaderThread,這樣一來(lái)上面所說(shuō)的輸入事件的幾個(gè)關(guān)鍵類(lèi)都在 mInputManager 中;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容