android9-android13 AMS演进初窥

目录

一:概览

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系统中的一个系统服务,主要用于管理窗口相关的操作。它提供了以下功能:

  1. 窗口管理:WindowManagerService负责管理所有的窗口,包括应用程序窗口、系统窗口、悬浮窗口、菜单等等。它负责将这些窗口排列在屏幕上,并处理用户对窗口的操作,例如拖动、缩放、隐藏等等。

  2. 窗口状态跟踪:WindowManagerService跟踪所有窗口的状态,包括窗口是否可见、是否有焦点、是否可以交互等等。这些状态对于系统和应用程序的行为是非常重要的。

  3. 窗口事件分发:WindowManagerService负责接收用户的触摸事件,并将它们分发给对应的窗口处理。它还负责将系统事件(例如屏幕关闭、旋转)传递给窗口。

总之,WindowManagerService是Android系统中重要的一个系统服务,负责窗口管理和事件分发等一系列操作,对于系统和应用程序的正常运行都是非常重要的。

ActivityManagerService 基本介绍

        AMS一开始就相对杂些,但大体上是在四大组件和进程,内存管理的范围内。到android 9的时候,AMS中activity部分已经占了一半左右的代码量,而到这个版本中,activity和window之间的关系也进一步加强,已经需要大量的接口来同步activity和window之间的状态。

下面这一段是csdn创作助手给的 ActivityManagerService 基本介绍

ActivityManagerService是Android系统中的一个核心组件,它是Android系统的进程管理器,负责管理系统中所有的应用程序进程和Activity生命周期,其中也包括一些系统级进程。

ActivityManagerService的主要功能包括:

  1. 管理应用程序进程:ActivityManagerService负责启动、停止和管理所有的应用程序进程。当启动一个新的应用程序时,ActivityManagerService会创建一个新的进程,并将该进程分配给该应用程序。当应用程序不再需要时,ActivityManagerService会停止该进程,并释放其占用的系统资源。

  2. 管理Activity生命周期:ActivityManagerService负责管理所有Activity的生命周期。当启动一个新的Activity时,ActivityManagerService会负责调用该Activity的onCreate()、onStart()、onResume()等生命周期方法。当一个Activity不再处于前台时,ActivityManagerService会调用该Activity的onPause()和onStop()等生命周期方法。

  3. 管理任务栈:ActivityManagerService负责管理应用程序的任务栈,即应用程序中所有Activity的堆栈。当启动一个新的Activity时,ActivityManagerService会将其加入任务栈中,并调整任务栈中Activity的顺序。当用户按下返回键时,ActivityManagerService会从任务栈中移除当前Activity,并回到上一个Activity。

  4. 监测系统状态:ActivityManagerService还负责监测系统状态,如电池状态、内存使用情况等,并根据系统状态做出相应的调整,以提高系统性能和用户体验。

总的来说,ActivityManagerService是Android系统中非常重要的一个服务,它在应用程序进程、Activity、任务栈等方面起着关键的作用,为Android系统的稳定性和性能提供了重要的支持。

        由上面 csdn创作助手 可以简单了解到,ams、wms都是很大的模块,本文只从最表层的类继承关系,对像引用关系和最简单的启动流程这三部分入手,做一个基础的分享。

        在下面的分析中,我将分会两部分的简单介绍 AMS/WMS

        一:以activity和window相关联的activity组件为一条主线。

        二:以AMS中非activity的其他组件为另一条主线。

       下表展示了从android9及以前的AMS/WMS Activity相关核心成员的引入时间

AMS/WMS 核心成员引入版本
AMS引入版本WMS引入版本
ConfigurationContainerandroid 9
WindowContainerandroid 8
ActivityStackSupervisorandroid 4.4RootWindowContainerandroid 8
ActivityDisplayandroid 9DisplayContentandroid 4.2
ActivityStackandroid 2.3.6TaskStackandroid 4.4
TaskRecord至少 android 1.6Taskandroid 4.4
ActivityRecordandroid 2.3.6AppWindowTokenandroid 4.0.3
WindowStateandroid 4.0.3

        从上表可以看出,activity相关的类,在android 4.4以前有比较频繁的变化,从android 4.4到android8相对稳定了几个版本,从android 8开始,到android 11,activity又会经历一次大的变更。

       下表展示了从android9及以前的AMS中非activity的其他组件核心成员引入时间

AMS 组件引入版本
ProcessRecord至少 android 1.6
ActiveServicesandroid 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出来后再分析。

        以上为个人所学,多有错误遗漏,请读者多多指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于应用在Google Play的元数据优化

应用标题中的关键词权重最大,其次是简短描述中的关键词,最后是长描述关键词,了解这些就能够很好的提高应用的可见度,下载量和整体成功率。 1,标题。 Google Play最多允许标题容纳30个字符,关键词的频率和密…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大,业务逐渐复杂化,项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具,项目管理软件不仅可以提高工作效率,还可以提高项目成功的几率,对于企业具有重要…

Unity进阶--对象池数据场景管理器笔记

文章目录 泛型单例类泛型单例类&#xff08;不带组件版&#xff09;对象池管理器数据管理器场景管理器 泛型单例类 using System.Collections; using System.Collections.Generic;public abstract class ManagersSingle<T> where T : new() {private static T instance;…

DevExpress WPF Tree List组件,让数据可视化程度更高!(一)

DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体&#xff0c;可以把数据信息显示为REE、GRID或两者的组合&#xff0c;在数据绑定或非绑定模式下&#xff0c;具有完整的数据编辑支持。 DevExpress WPF 拥有120个控件和库&#xff0c;将帮助您…

验证码登录如何实现?

手机验证码登录 1、需求分析2、数据模型3、代码开发-交互过程4、代码开发-准备工作5、代码开发-修改LoginCheckFilter6、代码开发-接口开发7、前端代码介绍8、启动测试 1、需求分析 为了方便用户登录&#xff0c;移动端通常都会提供通过手机验证码登录的功能。 手机验证码登录…

手边酒店多商户版小程序V1.0.47 全开源版 安装测试教程

手边酒店多商户小程序是基于框架应用模块应用&#xff0c;需要框架基础上使用&#xff0c;总体体验了一下功能还是强大&#xff0c;非常合适酒店及民宿类小程序搭建。小程序端支持多店版支持平台入驻。手边酒店多商户版只有模块版&#xff0c;无独立版本&#xff0c;该版本核心…

Rust vs Go:常用语法对比(十)

题图来自 Rust vs. Golang: Which One is Better?[1] 182. Quine program Output the source of the program. 输出程序的源代码 package mainimport "fmt"func main() { fmt.Printf("%s%c%s%c\n", s, 0x60, s, 0x60)}var s package mainimport "fm…

桥梁安全生命周期监测解决方案

一、方案背景 建筑安全是人们生产、经营、居住等经济生活和人身安全的基本保证&#xff0c;目前我国越来越多的建筑物逐 步接近或者已经达到了使用年限&#xff0c;使得建筑物不断出现各种安全隐患&#xff0c;对居民的人身安全和财产安全产 生不利影响&#xff0c;因此房…

Bug竞技场【已经修复】

目录 1.基础知识 2.最佳组合 2.1 铁男-螳螂 2.2 弟弟组合 海克斯抽卡bug 1.基础知识 背景&#xff1a;美测服-美服-马服-可以有效地减少bug率 复盘是为了更好的战斗&#xff01; 提前观看一些视频资料也是如此。 通过看直播博主的经验&#xff0c;可以让你关注到本来对战的…

Python 生成随机图片验证码

使用Python生成图片验证码 Python 生成随机图片验证码安装pillow包pillow包生成图片基本用法生成图片验证码 Python 生成随机图片验证码 在写一个Web项目的时候一般要写登录操作&#xff0c;而为了安全起见&#xff0c;现在的登录功能都会加上输入图片验证码这一功能&#xff…

结构型设计模式之组合模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

Hadoop学习日记-MapReduce思想及执行流程

MapReduce思想 Map负责“拆分”&#xff1a;即将复杂问题拆分成可以并行计算的小问题&#xff0c;彼此之间几乎没有依赖联系。 Reduce负责对Map阶段的结果进行合并汇总 Map和Reduce的抽象接口如下&#xff1a; map:(k1; v1) — (k2; v2) reduce:(k2; [v2]) — (k3; v3) 一…

看了2023年的一线互联网公司时薪排行榜!值得思考

前言 根据最近针对国内的一线互联网企业做的调研&#xff0c;汇总了他们的平均时薪水平&#xff0c;最终出了一个排行榜&#xff01; 首先我们来看下&#xff0c;排行榜分哪几个Level&#xff0c;分别为初级、中级、高级、资深、专家/架构这五个&#xff0c;主要根据工程师的…

基于Javaweb实现ATM机系统开发实战(十四)交易记录分页实现

还是老规矩&#xff0c;先看前端页面查看需要传递哪些参数&#xff0c;并且把逻辑有问题的部分进行修改~ <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri&qu…

自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配&#xff0c;用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本…

AcrelEMS企业微电网能效管理平台实现用户侧智能配电和智能用电管理-安科瑞黄安南

摘要&#xff1a;随着科技的发展&#xff0c;电力系统正逐步向智能化、数字化、互联网化迈进。智能配电与智能用电是电力产业发展的重要方向&#xff0c;将为传统电力系统带来革命性的变革。本文将对智能配电和智能用电的概念、特点、关键技术及应用进行详细介绍。 1、智能配电…

数据结构初阶--带头双向循环链表

目录 一.带头双向循环链表的定义 二.带头双向循环链表的功能实现 2.1.带头双向循环链表的定义 2.2.带头双向循环链表的结点创建 2.3.带头双向循环链表的初始化 2.4.带头双向循环链表的打印 2.5.带头双向循环链表的判空 2.6.带头双向循环链表的尾插 2.7.带头双向循环链…

白皮书|数字孪生工厂:成就智能制造的未来

前言 目前我国已经进入“技术应用”的数字孪生双驱动时代&#xff0c;在市场需求和国家政策的推动下&#xff0c;各地因地制宜发展数字孪生技术&#xff0c;深入开展数字孪生应用建设。今天我们就重点来聊一聊数字孪生技术在工厂中的应用&#xff0c;希望通过本次案例的深度剖析…

深“扒”云原生高性能分布式文件系统JuiceFS

JuiceFS 是一款面向云原生设计的高性能分布式文件系统&#xff0c;在 Apache 2.0 开源协议下发布。提供完备的 POSIX 兼容性&#xff0c;可将几乎所有对象存储接入本地作为海量本地磁盘使用&#xff0c;亦可同时在跨平台、跨地区的不同主机上挂载读写。 JuiceFS 简介 JuiceFS…

推荐几款不错的AI绘画工具

随着近年来数据、算法等核心技术的不断进步&#xff0c;人工智能在内容创作各垂直领域的比例不断增加&#xff0c;包括人工智能写作、人工智能编辑和最近流行的人工智能绘画。 许多朋友也想跟上潮流&#xff0c;使用人工智能绘画生成软件创建人工智能图像&#xff0c;但我不知…