Android AMS学习笔记

news/2025/1/8 2:49:29/文章来源:https://www.cnblogs.com/liguo-wang/p/18656626

AMS

Activity管理模块Service管理模块BroadcastReceiver管理模块ContentProvider管理模块进程管理模块App错误管理模块App性能分析模块

App端框架

上图先简单介绍下App端框架的运行过程:
  1. 凡是从ActivityManagerService过来的数据,都需要经过ApplicationThread类,这本身是一个binder通信的过程。而大部分数据会通过Handler post到UI线程去执行,ActivityThread会把各种数据进行分发,比如是启动Activity的还是启动Service的等等。
  2. 当App进程被创建后,ActivityManagerService会把当前App的各种重要信息比如包名、Apk版本信息、Apk文件路径、so库文件路径、共享库文件路径等等这些数据传递给App进程,LoadedApk会把Apk文件路径、so库文件路径、共享库文件路径这些数据交给类加载器,类加载器就可以加载当前Apk中的各种类了。
  3. 在启动一个Activity的时候,ActivityManagerService会把Activity的信息如Activity的类名通过binder通信传递给ActivityThread,而ActivityThread会根据要启动的Activity的类名通过反射,初始化一个对应Activity的实例,进而会调用相应Activity的onCreate、onResume这些生命周期方法。
 
 
凡是与Service、ContentProvider、BroadcastReceiver三大组件有关系的事情都归我ActivityManagerService负责,而Activity相关的事情都归ActivityTaskManagerService负责

启动

SystemServer把所有的服务分类为bootstrap servicecore serviceother serviceapex service这四种类型。先在startBootstrapServices方法中启动bootstrap类型的服务,其次在startCoreServices方法中启动core类型的服务,再次在startOtherServices方法中启动other类型的服务,最后在startApexServices启动apex类型的服务。因此SystemServer启动过程就是依照上面的顺序启动各种服务,而我ActivityManagerService很荣幸属于bootstrap类型的服务,因此是最早被初始化
SystemServer的启动过程中会分发不同的阶段值,不同的阶段值所代表的含义各不相同,服务收到这些阶段值就可以知道当前是到了哪个启动阶段了,同时根据自己的需求来做不同的事情。
PHASE_WAIT_FOR_DEFAULT_DISPLAY代表当前阶段正在等待获取显示屏幕的硬件信息,这时候SystemServer的启动过程就暂时处于暂停状态,若屏幕硬件信息获取失败则停止启动;否则继续启动。
PHASE_ACTIVITY_MANAGER_READY代表ActivityManagerService已经准备好了,其他的服务可以使用ActivityManagerService提供的服务了,比如发送广播。
PHASE_BOOT_COMPLETED代表SystemServer启动完成了,所有的服务都已经准备好“进入工作状态”了,Android设备可以被用户使用了 (当然这只是解释几个常用的阶段值)。
 
启动可以分为出生设置系统进程准备等待boot anim完成这四个步骤,出生这个步骤发生于startBootstrapServices方法的最前面,而设置系统进程这个步骤发生于startBootstrapServices方法的中间部分,准备这个步骤发生于startOtherServices方法的结尾部分,而等待boot anim则是最后一个步骤。可以看到ActivityManagerService的启动贯穿了Systemserver启动流程的全过程
启动发生后,添加到ServiceManager服务,这样我的使用方比如各种App就可以使用我的功能了。我所在的systemserver进程被ProcessRecord对象记录下来,并且它不再“无名无姓”了,它的包名就是android。这样进程管理就可以对systemserver进程进行管理了。同时systemserver进程的pid和oom_score:-900信息也传递给lmkd进程,便于lmkd更好的查杀进程。
经过此步骤后,SystemServer后面的启动流程中各种服务就可以从进程管理根据包名android拿到systemserver进程对应的ProcessRecord对象,进而做相应的处理了。
Systemserver启动贯穿了SystemServer启动的整个流程,如下是启动过程所做的事情:
  1. 在SystemServer最先启动的时候,会创建ActivityManagerService的实例,并且初始化它包含的各种属性
  2. 我还承担了设置系统进程的任务,我会创建ProcessRecord对象把systemserver进程信息记录下来,并且为systemserver进程提供android这样的包名,这样systemserver进程就可以被记录并且被进程管理进行管理了,同时我还会把systemserver进程的pid和oom_score:-900的信息传递给lmkd进程
  3. 在准备阶段我会把PHASE_ACTIVITY_MANAGER_READY这个阶段值发送给所有服务,并且还会启动launcher,启动launcher可是一个系统能不能被使用的一个重要环节
  4. 当收到launcher启动完成的消息后,boot anim会消失,这时候我会发送PHASE_BOOT_COMPLETED阶段值,该值可是代表Android设备可以被用户使用了。
 

APP的启动

App进程的启动分为准备告知初始化三部分
 
准备作为启动的第一阶段,它发生于main方法,因为ActivityThread还没有实例化,因此会实例化一个ActivityThread对象。如果要想保证一个App进程一直运行的话,一般的做法是在一个线程里面不断的循环执行某些操作。而Android中创造了Looper、Handler、Message、MessageQueue,在main方法中会开启Looper,这个Looper会保证当前线程不断的“循环”下去,这里的循环并不是傻傻的循环,而是Looper的MessageQueue中有Message的话去执行,没有Message的话则会处于等待状态。而Looper所处的线程就是UI主线程了,也就是Looper会在UI主线程里面不断的“循环”下去。
告知用简单明了的话说就是App进程告知ActivityManagerService我这边准备好了,为啥要有这一阶段呢?
首先systemserver进程中的ProcessList类虽然是fork App进程的发起方,但是App进程被fork成功以及准备好这些好消息是非常有必要告知ActivityManagerService的。经过此阶段后,App进程处于等待ActivityManagerService的回复结果中。
初始化主要做了初始化PathClassLoader创建Application安装ContentProvider调用Application的onCreate方法
 
ATMS会通过binder通信把启动Activity的数据发送给ApplicationThread,ApplicationThread同样把这一消息通过Handler post到UI线程中。最终会在ActivityThread的handleLaunchActivity方法中开始启动Activity
 
Task的容器--TaskDisplayArea
 
启动Activity的过程分为查询Activity信息检查记录Activity信息启动App进程App进程准备好发送初始化数据发送Activity启动信息这几步,当然这几步中会需要zygote进程进程管理模块帮忙

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

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

相关文章

Android:PMS学习笔记

Android:PMS学习笔记概述:https://mp.weixin.qq.com/s/i6LlSf8kHOBOk5iKoVVoxA 概述包含哪些部分:权限管理模块负责apk权限相关的事情,比如请求某个权限,apk权限状态存储,收集所有apk声明的权限 共享库模块负责apk使用到的所有共享库 记录存储模块会把apk相关的很多信息记…

Android 权限管理系统学习笔记

权限管理系统(PackageManagerService) 权限管理系统所做的事情大体可以分为管理声明的权限、管理App使用的权限、权限的授予/撤销、资源使用记录这四类。权限管理系统大体分为权限控制器App、管理类、服务类三大模块权限控制器App它的“英文名”是PermissionController,它是…

【安全工具+蜜罐】企业安全建设之蜜罐搭建与使用

一、基本介绍 HFish是一款基于Golang开发的跨平台多功能主动诱导型开源国产蜜罐框架系统,它从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发,为用户提供可独立操作且实用的功能,通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能力,目前HF…

全局变量(PHP)

引子:从本章开始,正式进入Web开发篇,当然文章所写内容并非如何从零开始成为一名合格的开发者,而是站在安全的角度学开发。再说白点,就是开发者在开发业务系统时,哪处容易出现安全问题就学哪处。本章则从PHP基础之全局变量开始。免责声明:本文章仅用于交流学习,因文章内…

.NET 响应式编程 System.Reactive 系列文章(一):基础概念

在.NET中,响应式编程的核心库是System.Reactive,通常简称为Rx。本篇文章将介绍响应式编程的基础概念以及System.Reactive的核心组件,为后续深入学习奠定基础。.NET 响应式编程 System.Reactive 系列文章(一):基础概念 引言 在现代软件开发中,处理异步事件和数据流已经成…

【神兵利器】绕过EDR防病毒软件

免责声明 仅限用于技术研究和获得正式授权的攻防项目,请使用者遵守《中华人民共和国网络安全法》,切勿用于任何非法活动,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律连带责任项目介绍 项目演示了使用Windows API函数(例如:VirtualAllo…

RAG项目推荐:bRAG-langchain-构建自己的 RAG 应用程序所需了解的一切

检索增强生成 (RAG) 项目项目链接:https://github.com/bRAGAI/bRAG-langchain/tree/mainbRAGAI 的官方平台即将上线。加入等待列表,成为早期使用者之一! 本仓库包含了对检索增强生成 (RAG) 在各种应用中的全面探索。 每个笔记本都提供了从入门级到高级实现的详细实践指南,包…

五上数学LK情况反馈203班

五上数学LK情况反馈203班 上周五进行了LK,使用答题卡,电子阅卷,答题卡放在中学部,我们只有拿着学生没有写答案的试卷讲评,需要知道具体错误的,由周老师告知学生,今天晚上有半数以上学生,周老师已经告知学生错误题目了,分数已经公布。 本次考试难度较大,带有XB的性质,…

【金融行业】2024中国网络安全产业势能榜优能企业 金融行业典型案例展示

金融行业一直是信息安全的重点领域,随着金融科技的快速发展和数字货币的崛起,金融机构面临着前所未有的挑战。数据泄露、网络攻击等安全事件的频发,促使金融企业加强安全保障。然而,信息安全的提高不仅仅是防止外部威胁的关键,更重要的是确保业务在突发事件或安全事件发生…

Timer、Ticker使用及其注意事项

在 Golang 中,Timer 和 Ticker 是常用的定时器工具,但它们的使用易出错,尤其是初学者。本文将深入探讨定时器的正确使用方式、常见误区,并通过源码解读帮助你更好地理解它们的工作原理。Timer、Ticker使用及其注意事项 在刚开始学习golang语言的时候就听说Timer、Ticker的使…

entire vs whole; coca

entire 868 whole 466left 4WORD 1: ENTIRE WORD W1 W2 AN 15134 932 VIRTUALLY 354 71 Virtually the entire sample几乎所有样本 Virtually the entire Israeli governing class几乎整个以色列统治阶级 DEVOTED 216 71 devoted his entire care…