android9-android13 AMS演进初窥

news2024/11/17 15:44:53

目录

一:概览

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.coloradmin.cn/o/792012.html

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

相关文章

怎么给图片去底色?这几个方法一定要知道

如果你是一位设计师或者是需要制作图片的人,那么你一定知道去除图片底色的重要性。无论是制作海报、广告、产品图片还是网站页面,去除图片底色可以让你的设计更加精细、美观、专业。在本文中,我们将介绍三种常见的图片去底色方法,…

p7付费课程笔记5:串行gc以及并行gc

前言 前段时间我们学习jvm的基础结构和gc相关的基础知识,今天我们详细讲讲几大gc。 串行gc 串行 GC 对年轻代使用 mark-copy (标记-复制) 算法,对老年代使用 mark-sweep-compact (标记-清除-整理) 算法。 两者都是单线程的垃圾收集器,不能…

百度AI成为移动生态强者的真相

移动互联网的发展,让移动生态成为了互联网企业竞争的重要战场。在这场竞争中,百度AI凭借着其优质的技术实力和完善的生态系统,成为了移动生态中的强者。 那么,百度AI究竟靠什么成为了强者呢?首先,百度AI的技…

网络安全/黑客零基础入门(经验分享)

相关网站推荐 博主研究方向为安全领域,以后可能更多的在圈子内发表文章,提高文章质量。 1、FreeBuf 国内关注度最高的全球互联网安全媒体平台,爱好者们交流与分享安全技术的社区,网络安全行业门户。 2、看雪 看雪论坛是个软件…

GB/T 25000.51解读——软件产品的兼容性怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中,我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

Failed to load local font resource:微信小程序加载第三方字体

加载本地字体.ttf 将ttf转换为base64格式:https://transfonter.org/ 步骤如下 将下载后的stylesheet.css 里的font-family属性名字改一下,然后引进页面里就行了,全局样式就放app.scss,单页面就引入单页面 注: .title…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习:怎么用JMeter操作MySQL数据库?看完秒懂!_jmeter mysql_程序员馨馨的博客-CSDN博客 注:里面所有没打码的都是假数据,麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值,作为…

html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

一、问题原因 对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法 两步 1. 图片元素上设置属性 crossorigin"anonymous" 支持原生img和eleme组件 2. 存储桶设置资源跨域访问…

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

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

[小尘送书-第二期]《从零开始读懂量子力学》由浅入深,解释科学原理;从手机到超导,量子无处不在;从微观到宏观,遐想人生的意义!

大家好,我是小尘,欢迎关注,一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式五、名家推介写在最后 一、前…

Linux使用教程

一、Linux命令基础 1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项,表示:all的意思,即列出全部文件(包含隐藏的文件/文件夹…

【Vue】div标签实现输入框,利用contenteditable=“true“属性的标签实现

推荐个链接&#x1f517;&#xff0c;可以更好的查阅自己遇到的问题&#xff08;点击此处即可跳转&#xff09; 使用 div 实现 input、textarea 输入框 <template><div class"content"><div class"main editTextList" ><divclass&q…

[c++实验] 快读快写,O123优化,原版用时对比

前言 学过c的多知道&#xff0c;准确的来说是做过c题目的都知道&#xff1a;c题目不仅要求代码正确&#xff0c;还要求用时&#xff0c;大多用时要求都在200ms--1000ms之间&#xff0c;要是遇到大数据时&#xff0c;超时的可能就会大大提升。 结论 用时的把控也很重要&#…

网站实现下载apk安装包

目录 1、背景说明2、效果图3、具体实现3.1 界面代码3.2 js代码 4、说明4.1 存在异常4.2 解决方案 5、参考资料 1、背景说明 有时需要将写好的apk安装包在局域网内部进行发布&#xff0c;具体实现非常简单&#xff0c;如下所示 2、效果图 进入到网站后&#xff0c;点击下载按…

正确认识:2374782-02-0,FAPI-4,成纤维细胞活化蛋白抑制剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----试剂基础信息​​ 【中文名称】成纤维细胞活化蛋白抑制剂 【英文名称】 FAPI-4 【结 构 式】 【CAS】2374782-02-0 【分子式】C40H54F2N10O10 【分子量】872.93 【沸点】1144.165.0 C(Predicted) 【密度】1.460.…

【力扣周赛】第 355 场周赛(构造二分答案异或前缀 状态压缩⭐)

文章目录 Q1&#xff1a;6921. 按分隔符拆分字符串&#xff08;双指针&#xff09;Q2&#xff1a;6915. 合并后数组中的最大元素&#xff08;倒序遍历贪心&#xff09;代码优化 Q3&#xff1a;6955. 长度递增组的最大数目&#x1f6b9;&#x1f6b9;&#x1f6b9;&#x1f6b9;…

企业级PaaS低代码快开平台源码,基于 Salesforce Platform 的开源替代方案

PaaS低代码快开平台是一种快速开发应用系统的工具&#xff0c;用户通过少量代码甚至不写代码就可以快速构建出各种应用系统。 随着信息化技术的发展&#xff0c;企业对信息化开发的需求正在逐渐改变&#xff0c;传统的定制开发已经无法满足企业需求。低代码开发平台&#xff0…

ElementUI tabs标签页样式改造美化

今天针对ElementUI的Tabs标签页进行了样式修改&#xff0c;更改为如下图所属的样子。 在线运行地址&#xff1a;JSRUN项目-ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用&#xff0c;下面我也简单的贴上代码&#xff0c;代码没有注释&#xff0c;很抱歉&#x…

Centos7.9安装瀚高数据库企业版6.0.4_并开启远程连接_使用瀚高连接工具操作_亲测成功---国产瀚高数据库工作笔记003

1.首先去瀚高官网,注册,然后下载安装包, OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_openeuler切换root用户_su:拒绝权限_passwd: 鉴定令牌操作错误---国产瀚高数据库工作笔记001 一部分内容可以参考一下这个博文 2.准备一下环境: 关闭防火墙,关闭网络管理器 syste…

Spingboot yaml 配置文件及数据读取

属性配置在这里插入图片描述 修改服务器端口 → server.port80 修改 banner → spring.main.banner off(关闭)/console(控制台)/log(日志) 日志 → logging.level.rootinfo Common Application Properties 配置文件分类 优先级 如果三种文件共存时&#xff0c;优先级为&am…