由浅入深学习android input系统 - input系统的启动

Posted 许佳佳233

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由浅入深学习android input系统 - input系统的启动相关的知识,希望对你有一定的参考价值。

android input系列文章
由浅入深学习android input系统(一) - input事件如何传递到View
由浅入深学习android input系统(二) - input事件如何传递到app进程( InputDispatcher )
由浅入深学习android input系统(三) - InputChannel解析
由浅入深学习android input系统(四) - input事件采集(InputReader)
由浅入深学习android input系统(五) - input系统的启动

概述

前文已经讲过了input系统对事件的抓取以及传递,此文将探索下input系统的启动。

前文:由浅入深学习android input系统(四) - input事件采集(InputReader)

input系统的初始化

调用的任务栈如下:

  • SystemServer.main()
  • SystemServer.run()
  • InputManagerService构造函数
  • InputManagerService.nativeInit()
  • com_android_server_input_InputManagerService.nativeInit()
  • NativeInputManager构造函数
  • InputManager构造函数

InputManager构造函数中初始化了两部分:

  1. 初始化InputReader与InputDispatcher
  2. 初始化InputReaderThread与 InputDispatcherThread
InputManager::InputManager(
        const sp<InputReaderInterface>& reader,
        const sp<InputDispatcherInterface>& dispatcher) :
        mReader(reader),
        mDispatcher(dispatcher) {
    initialize();
}
void InputManager::initialize() {
    mReaderThread = new InputReaderThread(mReader);
    mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

input系统的启动

调用的任务栈如下:

  • SystemServer.main()
  • SystemServer.run()
  • InputManagerService.start()
  • InputManagerService.nativeStart()
  • com_android_server_input_InputManagerService.nativeStart()
  • InputManager.stat()

InputManager的start()方法中分别启动了InputReaderThread与InputDispatcherThread。

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

InputReaderThread

要点如下:

  • 运行了run()方法后,最终会执行到threadLoop()方法,这个方法只有在执行requestExit()后才会停止循环
  • threadloop()中执行了InputReader.loopOnce()方法,开始接收硬件的事件。

对InputReader.loopOnce()的内容由兴趣的读者可以看下前面的文章:


InputReaderThread::InputReaderThread(const sp<InputReaderInterface>& reader) :
        Thread(/*canCallJava*/ true), mReader(reader) {
}

InputReaderThread::~InputReaderThread() {
}

bool InputReaderThread::threadLoop() {
    mReader->loopOnce();
    return true;
}

InputDispatcherThread

要点如下:

  • 运行了run()方法后,最终会执行到threadLoop()方法,这个方法只有在执行requestExit()后才会停止循环
  • threadloop()中执行了InputDispatcher.dispatchOnce()方法,开始分发从InputReader那边接收的事件。

对InputDispatcher.dispatchOnce()的内容由兴趣的读者可以看下前面的文章:

InputDispatcherThread::InputDispatcherThread(const sp<InputDispatcherInterface>& dispatcher) :
        Thread(/*canCallJava*/ true), mDispatcher(dispatcher) {
}

InputDispatcherThread::~InputDispatcherThread() {
}

bool InputDispatcherThread::threadLoop() {
    mDispatcher->dispatchOnce();
    return true;
}

以上是关于由浅入深学习android input系统 - input系统的启动的主要内容,如果未能解决你的问题,请参考以下文章

由浅入深学习android input系统 - input系统的启动

由浅入深学习android input系统 - input事件采集(InputReader)

由浅入深学习android input系统 - input事件采集(InputReader)

由浅入深学习android input系统 - input事件如何传递到View

由浅入深学习android input系统 - input事件如何传递到View

由浅入深学习android input系统 - InputChannel解析