Android输入系统之 InputReader 的创建与启动

今天趁着在公司摸鱼的时间,来更新一篇文章。

上一篇文章 InputManagerService的创建与启动 分析了 IMS 的创建与启动,这其中就伴随着 InputReader 的创建与启动,本文就着重分析这两点内容。

本文所涉及的文件路径如下

frameworks/native/services/inputflinger/InputManager.cpp
frameworks/native/services/inputflinger/reader/EventHub.cpp
frameworks/native/services/inputflinger/reader/InputReader.cpp
frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp
frameworks/native/services/inputflinger/InputThread.cpp

InputManagerService的创建与启动 可知,创建 InputReader 的代码如下

InputManager::InputManager(
        const sp<InputReaderPolicyInterface>& readerPolicy,
        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
        
    // ...
    
    mReader = createInputReader(readerPolicy, mClassifier);
}


sp<InputReaderInterface> createInputReader(const sp<InputReaderPolicyInterface>& policy,
                                           const sp<InputListenerInterface>& listener) {
    // InputReader从EventHub中读取数据
    // policy 实现类是 NativeInputManager
    // listener的实现类其实是 InputClassifier
    return new InputReader(std::make_unique<EventHub>(), policy, listener);
}
复制代码

创建 InputReader 需要三个参数。

第一个参数的类型是 EventHub。正如名字所示,它是输入事件的中心,InputReader 会从 EventHub 中读取事件。这个事件分两类,一个是输入设备的输入事件,另一个是 EventHub 合成事件,用于表明设备的挂载与卸载。

第二个参数的类型为 InputReaderPolicyInterface,由 InputManagerService的创建与启动 可知,它的实现类是 JNI 层的 NativeInputManager。

第三个参数的类型为 InputListenerInterface, 由 InputManagerService的创建与启动 可知,它的实现类是 InputClassifier。InputReader 会的加工后的事件发送给 InputClassifier,而 InputClassifier 会针对触摸事件进行分类,再发送到 InputDispatcher。

为止防止大家有所健忘,我把上一篇文章中,关于事件的流程图,再展示下

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享