一张图带你掌握androidQ的InputManagerService启动

第一章         文章简介... 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,事件注入、如图所示,后续将会详细说明

一张图带你掌握androidQ的InputManagerService启动_第1张图片

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启动过程中所涉及的对象和一些方法调用。

 一张图带你掌握androidQ的InputManagerService启动_第2张图片

 

  • 详细代码分析

InputManagerService的启动是在SystemServer加载的时候进行创建和启动的。先来认识一下IMS的定义

一张图带你掌握androidQ的InputManagerService启动_第3张图片

IMS其实并不是直接继承Service而是继承Stub,而Stub是继承自Ibinder的,也就是桌IMS其实是一种Binder机制,有兴趣的同学可以去详细看看这块,这篇文章中不进行详细讲解。

为了方便分析我将代码做了如下简化,如图所示:InputManagerService启动

一张图带你掌握androidQ的InputManagerService启动_第4张图片

 

一张图带你掌握androidQ的InputManagerService启动_第5张图片

 

一张图带你掌握androidQ的InputManagerService启动_第6张图片

一张图带你掌握androidQ的InputManagerService启动_第7张图片

一张图带你掌握androidQ的InputManagerService启动_第8张图片

 

 

一张图带你掌握androidQ的InputManagerService启动_第9张图片

一张图带你掌握androidQ的InputManagerService启动_第10张图片

这里接的是最开始那块,WMS的具体创建我这边就不讲接了,后续再WMS的分析中在进行详细的讲解。

一张图带你掌握androidQ的InputManagerService启动_第11张图片

你可能感兴趣的:(Android,Q源码解析)