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

原創(chuàng)內容呛每,轉載請注明出處揍愁,多謝配合。

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

牽涉到的模塊:

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

牽涉到的進程
system_server 與 應用進程闺金。
進程對應的主要工作線程
其中system_server中包含InputReaderThread和InputDispatcherThread逾滥。
應用進程相關的主要是 UIThread。

二败匹、初始化

在SystemServer的初始化過程中寨昙,IMS和WMS 被創(chuàng)建出來,并將WMS中的monitor傳給了IMS掀亩,作為回調舔哪。

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的構造方法中執(zhí)行了nativeInit,這是個native方法槽棍,屬于jni調用捉蚤,該方法中創(chuàng)建了一個NativeInputManager實例,并且和java層使用的是同一個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)建了一個Eventhub缆巧,同時將這個Eventhub傳給新建的Inputmanager,Eventhub就是將數(shù)據(jù)從硬件驅動上讀出來然后傳遞上來的通道豌拙。

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初始化時創(chuàng)建了兩個重要操作類: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方法初始化對應的兩個線程:InputReaderThreadInputDispatcherThread

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

InputManager的start方法按傅,讓兩個線程run起來捉超。

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

那么這個InputManager的start方法在哪調的呢?回看IMS的start方法

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

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

這里又是調的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并調用它的start方法唯绍。

所以根據(jù)以上的初始化過程總結整個層次關系:

從這個初始化過程來看:IMS的邏輯基本上都是通過jni實現(xiàn)在native層拼岳。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者况芒。
  • 序言:七十年代末裂问,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牛柒,更是在濱河造成了極大的恐慌堪簿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皮壁,死亡現(xiàn)場離奇詭異椭更,居然都是意外死亡,警方通過查閱死者的電腦和手機蛾魄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門虑瀑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湿滓,“玉大人,你說我怎么就攤上這事舌狗∵窗拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵痛侍,是天一觀的道長朝氓。 經(jīng)常有香客問我,道長主届,這世上最難降的妖魔是什么赵哲? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮君丁,結果婚禮上枫夺,老公的妹妹穿的比我還像新娘。我一直安慰自己绘闷,他們只是感情好橡庞,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著印蔗,像睡著了一般扒最。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喻鳄,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音确封,去河邊找鬼除呵。 笑死,一個胖子當著我的面吹牛爪喘,可吹牛的內容都是我干的颜曾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼秉剑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侦鹏?” 一聲冷哼從身側響起诡曙,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎略水,沒想到半個月后价卤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡渊涝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年慎璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了床嫌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡胸私,死狀恐怖厌处,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情岁疼,我是刑警寧澤阔涉,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站五续,受9級特大地震影響洒敏,放射性物質發(fā)生泄漏。R本人自食惡果不足惜疙驾,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一凶伙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧它碎,春花似錦函荣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挖息,卻和暖如春金拒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背套腹。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工绪抛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人电禀。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓幢码,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尖飞。 傳聞我的和親對象是個殘疾皇子症副,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容