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)擊事件等等;
如下圖所示:

幾個(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 層大致流程如下流程圖所示:

小結(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 中;