第一章 文章简介... 3
第二章 涉及类说明... 3
第三章 启动流程图... 4
第四章 详细代码分析... 5
本章主要介绍了在InputManagerService中药用到的两个很重要的linux中的机制。只有了解了该机制我们才能更好的理解InputManagerService。因为InputManagerService中全靠这两个机制来读取事件和在适当的时机唤醒读取线程。InputManagerService整体架构分为两层,一层是Java层,另一层是native层。为了方便文章中出现的IMS指的就是InputManagerService.
有人有没有疑问为什么要有Java层,逻辑全部写在native层不就好了吗?我这边给你两个思考的点:1、这个和android的架构相关,android的framework层大多数都是使用的Java编写的。如果输入全部接口放到native层,那么调用就会很繁琐。
2、为了统一接口,方便管理。
在android Q的InputManagerService的启动过程中主要设计这些类,其中有些C文件还对应了头文件.h我并未罗列。
frameworks\base\services\java\com\android\server\SystemServer.java
该类中主要启动InputManagerService
frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
该类中统一管理了native层的接口,比如通知ANR,事件注入、如图所示,后续将会详细说明
frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp
该类是Java层和native层的调用中间接口,重要的几个对象NativeInputMnager就被定义在这里面,该文件中实现了IMS中的那些接口
frameworks\native\services\inputflinger\InputManager.cpp
该文件中定义了InputDispatcher和InputReader对象的创建,以及启动和管理
frameworks\native\services\inputflinger\dispatcher\InputDispatcherFactory.cpp
用于创建InputDispatcher对象
frameworks\native\services\inputflinger\dispatcher\InputDispatcher.cpp
里面是事件分发的主要逻辑
frameworks\native\services\inputflinger\InputClassifier.cpp
该类里面维护了一个重要的对象就是InputDispatcher对象,他的主要目的是将InputReader中读取到事件放到InputDispatcher所维护的队列
frameworks\native\services\inputflinger\reader\InputReaderFactory.cpp
用于创建InputReader对象
frameworks\native\services\inputflinger\InputReaderBase.cpp
frameworks\native\services\inputflinger\dispatcher\InputDispatcherThread.cpp
事件分发线程
frameworks\native\services\inputflinger\reader\InputReader.cpp
事件读取的主要逻辑
在此处不对这些类进行详细的说明,在后续的文章中将会详细的讲解每个方法和作用。
这张时序图,描述了IMS的启动时序过程,完整的表达了整个IMS启动过程中所涉及的对象和一些方法调用。
InputManagerService的启动是在SystemServer加载的时候进行创建和启动的。先来认识一下IMS的定义
IMS其实并不是直接继承Service而是继承Stub,而Stub是继承自Ibinder的,也就是桌IMS其实是一种Binder机制,有兴趣的同学可以去详细看看这块,这篇文章中不进行详细讲解。
为了方便分析我将代码做了如下简化,如图所示:InputManagerService启动
这里接的是最开始那块,WMS的具体创建我这边就不讲接了,后续再WMS的分析中在进行详细的讲解。