目录
一:概览
WindowManagerService 基本介绍
ActivityManagerService 基本介绍
二:AMS及其关联的WMS中主要组件的类图和对像图
一:android 9中AMS/WMS的类图和对像图
二:android 10中AMS/WMS的类图和对像图
三:android 11中AMS/WMS的类图和对像图
四:android 12中AMS/WMS的类图和对像图
五:android 13中AMS/WMS的类图和对像图
三:AMS 初始化流程
一:android 9 中AMS的初始化流程
1:非activity组件的创建和引用
2:activity相关的类的创建和引用
二:android 11 中AMS的初始化流程
1:非activity组件的创建和引用
2:activity相关的类的创建和引用
四:AMS 中StartActivity的关键流程
一:android 9 中AMS中StartActivity的关键流程
二:android 11 中AMS中StartActivity的关键流程
五:结语
一:概览
本文只是初窥,整体上只分析到第一层即可,不会在细节上做深入。深入的部分在后续分享中按细分模块单独分析。
AMS和WMS从早期android开始,就已经是android中最重要的组件。
WindowManagerService 基本介绍
WMS一直比较专一,一直在窗口功能上迭代。
下面这一段是csdn创作助手给的 WindowManagerService 基本介绍
WindowManagerService是Android系统中的一个系统服务,主要用于管理窗口相关的操作。它提供了以下功能:
-
窗口管理:WindowManagerService负责管理所有的窗口,包括应用程序窗口、系统窗口、悬浮窗口、菜单等等。它负责将这些窗口排列在屏幕上,并处理用户对窗口的操作,例如拖动、缩放、隐藏等等。
-
窗口状态跟踪:WindowManagerService跟踪所有窗口的状态,包括窗口是否可见、是否有焦点、是否可以交互等等。这些状态对于系统和应用程序的行为是非常重要的。
-
窗口事件分发:WindowManagerService负责接收用户的触摸事件,并将它们分发给对应的窗口处理。它还负责将系统事件(例如屏幕关闭、旋转)传递给窗口。
总之,WindowManagerService是Android系统中重要的一个系统服务,负责窗口管理和事件分发等一系列操作,对于系统和应用程序的正常运行都是非常重要的。
ActivityManagerService 基本介绍
AMS一开始就相对杂些,但大体上是在四大组件和进程,内存管理的范围内。到android 9的时候,AMS中activity部分已经占了一半左右的代码量,而到这个版本中,activity和window之间的关系也进一步加强,已经需要大量的接口来同步activity和window之间的状态。
下面这一段是csdn创作助手给的 ActivityManagerService 基本介绍
ActivityManagerService是Android系统中的一个核心组件,它是Android系统的进程管理器,负责管理系统中所有的应用程序进程和Activity生命周期,其中也包括一些系统级进程。
ActivityManagerService的主要功能包括:
-
管理应用程序进程:ActivityManagerService负责启动、停止和管理所有的应用程序进程。当启动一个新的应用程序时,ActivityManagerService会创建一个新的进程,并将该进程分配给该应用程序。当应用程序不再需要时,ActivityManagerService会停止该进程,并释放其占用的系统资源。
-
管理Activity生命周期:ActivityManagerService负责管理所有Activity的生命周期。当启动一个新的Activity时,ActivityManagerService会负责调用该Activity的onCreate()、onStart()、onResume()等生命周期方法。当一个Activity不再处于前台时,ActivityManagerService会调用该Activity的onPause()和onStop()等生命周期方法。
-
管理任务栈:ActivityManagerService负责管理应用程序的任务栈,即应用程序中所有Activity的堆栈。当启动一个新的Activity时,ActivityManagerService会将其加入任务栈中,并调整任务栈中Activity的顺序。当用户按下返回键时,ActivityManagerService会从任务栈中移除当前Activity,并回到上一个Activity。
-
监测系统状态:ActivityManagerService还负责监测系统状态,如电池状态、内存使用情况等,并根据系统状态做出相应的调整,以提高系统性能和用户体验。
总的来说,ActivityManagerService是Android系统中非常重要的一个服务,它在应用程序进程、Activity、任务栈等方面起着关键的作用,为Android系统的稳定性和性能提供了重要的支持。
由上面 csdn创作助手 可以简单了解到,ams、wms都是很大的模块,本文只从最表层的类继承关系,对像引用关系和最简单的启动流程这三部分入手,做一个基础的分享。
在下面的分析中,我将分会两部分的简单介绍 AMS/WMS
一:以activity和window相关联的activity组件为一条主线。
二:以AMS中非activity的其他组件为另一条主线。
下表展示了从android9及以前的AMS/WMS Activity相关核心成员的引入时间
AMS | 引入版本 | WMS | 引入版本 |
---|---|---|---|
ConfigurationContainer | android 9 | ||
WindowContainer | android 8 | ||
ActivityStackSupervisor | android 4.4 | RootWindowContainer | android 8 |
ActivityDisplay | android 9 | DisplayContent | android 4.2 |
ActivityStack | android 2.3.6 | TaskStack | android 4.4 |
TaskRecord | 至少 android 1.6 | Task | android 4.4 |
ActivityRecord | android 2.3.6 | AppWindowToken | android 4.0.3 |
WindowState | android 4.0.3 |
从上表可以看出,activity相关的类,在android 4.4以前有比较频繁的变化,从android 4.4到android8相对稳定了几个版本,从android 8开始,到android 11,activity又会经历一次大的变更。
下表展示了从android9及以前的AMS中非activity的其他组件核心成员引入时间
AMS 组件 | 引入版本 |
ProcessRecord | 至少 android 1.6 |
ActiveServices | android 4.2 |
ServiceRecord | 至少 android 1.6 |
BroadcastRecord | 至少 android 1.6 |
ContentProviderRecord | 至少 android 1.6 |
对比activity的表可以发现,这部分主要组件成员在非常早的版本中就已经存在,整体的演进活跃度是不如activity部分的。
二:AMS及其关联的WMS中主要组件的类图和对像图
一:android 9中AMS/WMS的类图和对像图
单独从activity的角度看,其类关系图如下
单独从window的角度上看,其类图关系如下
activity和window的对像图如下
非activity部分的对像图如下
二:android 10中AMS/WMS的类图和对像图
单独从activity的角度看,其类关系图如下
单独从window的角度上看,其类图关系如下
activity和window的对像图如下
非activity部分的对像图如下
三:android 11中AMS/WMS的类图和对像图
从android 11开始,Activity 和 window开始融合。从类图上看,就是把原本相对独立的Activity的类结构融合到了window的类结构中。
看android11 的对像图,这种融合就更明显了,从这个版本开始,实际的Activity和Window是同一组数据,ATMS和WMS都从RootWindowContainer去遍历自己的堆栈,从各自的角度去设置和读取数据。
非activity部分的对像图如下
四:android 12中AMS/WMS的类图和对像图
下图是android 12的Activity和window类结构,相比于android11,主要是重新定义了root的概念,让DisplayContent成为每个Display中的root节点。
从对像图上看,这种变化更明显,当然,在下面的类图中,我刻意省略了DisplayContent和TaskDisplayArea之间的DisplayArea层次树。这样方便简单的表现出Activity的对像关系。
非activity部分的对像图如下
五:android 13中AMS/WMS的类图和对像图
提示:目前我没有对应平台可以调试android 13的版本,所以下面的分析是完成基于代码的角度分析出来,并未使用目标机验证过,可能存在错漏的地方,欢迎指正。
android 13基本上和android12保持致,只新增了一个类。其他完全相同
在类结构没有大变的情况下,目前分析的对像图和android 12保持一致
非activity部分的对像图如下
三:AMS 初始化流程
在实际工作中,这几个版本中最典型的是android 9 和android 11,android 10虽然在目录结构上有很大的变化,但在流程上,可以参考android 9。
而android 11以后的版本,大体上可以参考android 11的流程。android 10和android 11在初始化和启动activity的流程上,都是有非常大的差别的。
一:android 9 中AMS的初始化流程
1:非activity组件的创建和引用
1: 创建 ActivityManagerService,在类的构造中准备好mProcessNames,mActiveUids等数据结构,在ams的构造方法中创建 BroadcastQueue,ActiveServices,ProviderMap,完成最基本的初始化
2:在setSystemProcess 方法中把ams注册为系统服务,同时创建system_server进程的 ProcessRecord,
3:在 installSystemProviders 方法中处理系统 contentProvider的数据
4:在systemReady 方法中会先处理上一次未关闭的java进程,再通过lambda表示回到SystemServer 去启动systemui。处理完lambda表达式后再回来,先启动长驻进程(persist进程),再启动home进程。
5:最后在开机动画结束后,发出开机完成的广播
2:activity相关的类的创建和引用
1:在ActivityManagerService 的构造 ActivityStackSupervisor,并在ActivityManagerService 中直接引用。
2:在setWindowManager 方法中从DisplayManagerService 那边获取当前设备的display列表,再遍历display列表创建 ActivityDisplay,并把ActivityDisplay 的实例存放到 ActivityStackSupervisor 的 mActivityDisplays。
3:在 ActivityDisplay 的构造方法里,最终还会去创建 DisplayContent ,并在 DisplayContent的构造方法中直接把自己添加到 RootWindowContainer 的 mChildren 中。
二:android 11 中AMS的初始化流程
1:非activity组件的创建和引用
1: 创建 ActivityManagerService,在类的构造中准备好mProcessList,mActiveUids等数据结构,在ams的构造方法中依次创建 BroadcastQueue,ActiveServices,ProviderMap,完成最基本的初始化
2:在setSystemProcess 方法中把ams注册为系统服务,同时创建system_server进程的 ProcessRecord,从android 10开始,ProcessRecord不再由ams直接管理,需通过ProcessList来间接管理,所以这一步需通过 ProcessList 的 newProcessRecordLocked 方法完成。
3:在 installSystemProviders 方法中处理系统 contentProvider的数据
4:在systemReady 方法中会先处理上一次未关闭的java进程,再通过lambda表示回到SystemServer 去启动systemui。处理完lambda表达式后再回来,先启动长驻进程(persist进程),再启动home进程。
5:最后在开机动画结束后,发出开机完成的广播
2:activity相关的类的创建和引用
1:在ActivityTaskManagerService 的initialize方法里里创建 ActivityStackSupervisor,并在ActivityTaskManagerService 中直接引用。
2:在setWindowManager 方法中从DisplayManagerService 那边获取当前设备的display列表,再遍历display列表创建 ActivityDisplay,并把ActivityDisplay 的实例存放到 ActivityStackSupervisor 的 mActivityDisplays。
3:在 ActivityDisplay 的构造方法里,最终还会去创建 DisplayContent ,再通过addChild把DisplayContent 添加到 RootWindowContainer 的 mChildren 中。
四:AMS 中StartActivity的关键流程
一:android 9 中AMS中StartActivity的关键流程
activity创建的关键流程,在数据结构中最关键的就是 ActivityRecord,TaskRecord,ActivityStack 和与之对应的AppWindowToken,Task,TaskStack的创建和引用添加
1:创建 ActivityRecord
2:创建 ActivityStack,并在构造方法中再创建 TaskStack,把 TaskStack 添加到 DisplayContent 的 TaskStackContainers 的 mChildren 中去,最后再把 ActivityStack 添加到 ActivityDisplay的 mStacks
3:创建 TaskRecord,并把TaskRecord 添加到 ActivityStack 的mTaskHistory中去。
4:通过 TaskRecord 的 createWindowContainer 创建Task,并把Task添加到 TaskStack 的 mChildren中去。
5:添加 ActivityRecord 到 TaskRecord 的 mActivities 中去。
6:创建 AppWindowToken 并把 AppWindowToken 添加到 Task 的 mChildren中去。
前面几步中,至少需要创建六个核心类,流程一环又一环,从ams到wms来回好几次,才能完成activity创建的第一步。在目前的android中,android9的activity启动流程,应该是最长最复杂的。
二:android 11 中AMS中StartActivity的关键流程
android11因为数据结构的改变,创建activity的整体流程大大的简化了
1:创建ActivityRecord
2: 创建 ActivityStack 并添加到 TaskDisplayArea 的 mChildren中去
3:添加 ActivityRecord 到 ActivityStack 的 mChildren中去
只需以上三步,创建两个核心类,activity启动的第一步中的主要数据就完成了。
五:结语
从这几年android9-13几个版本中AMS/WMS的演进,整体上是在增加了大量新feature的情况下,又尽可能的在降低代码复杂度。
当然,如果从更早的版本看,activity和window在各自演进多年后,在android9上达到了分进演进的极限,从android 10开始,走上了融合演进的方向。到android12时基本完成融合。后续新的演进会往什么方向走,等android 14出来后再分析。
以上为个人所学,多有错误遗漏,请读者多多指正。