Android AMS介绍

注:本文为作者学习笔记,如有误,请各位大佬指点

系统进程运行环境的初始化

  • Context是一个抽象类,它可以访问application环境的全局信息和各种资源信息和类

  • context功能:

    • 对Activity、Service生命周期的管理
    • 通过Intent发送广播/注册广播接收者
    • 访问APK各种资源,比如Reservice、AssertManager等
    • 访问Package的相关资源
    • APK的权限管理
  • Android进程分为:

    • 应用进程

      ActivityThread就是应用进程的主线程,

      应用进程启动后,首先会执行ActivityThread的main(),

      应用程序也是通过ActivityThread来和AMS通信,调用和执行四大组件。

    • 系统进程

      SystemServer是Android的系统进程,

      由于它也有Activity和一些系统资源,所以为了保证调用方式的统一,它也需要Activity和Context等运行环境,所以SystemServer也是一个特殊的应用程序。

  • 系统Context的创建过程

    在启动SystemServer启动之后,执行createSystemContext(),

    在这个方法内部会完成系统进程运行环境的初始化,包括创建ActivityThread线程,ResourcesManager对象的创建和初始化,LoadedAPK的创建和初始化,LoadedAPK代表一个系统进程的APK,它里面存储资源的位置、JNI包的位置等,代表的就是Framework-res-apk,ContextImpl的构造方法创建一个Context,会将ResourcesManager、LoadedAPK加载进去,最终生成一个和系统进程相关的Context。

    ActivityThread和Context就构成了Android程序的运行环境。

ActivityThread、ApplicationThread

ActivityThread

​ 代表Android的主线程(不是线程类),系统创建完一个新的应用程序后,会在这个进程的主线程中调用ActivityThread的main(),里面会执行一个loop的循 环,使当前线程进入消息循环。

​ 所以Android应用进程的入口函数是ActivityThread的main(),就是一个ActivityThread类对应一个应用程序进程。

ApplicationThread

​ 是ActivityThread的内部类, 是一个Binder对象。在此处它是作为IApplicationThread对象 的server端,等待client端的请求,然后进行处理,最大的client就是AMS。

AMS是啥

  • AMS是什么

    位于应用框架层,负责系统中四大组件的启动、切换、调度,及应用进程的管理和调度工作

  • 什么时候初始化?

    在SystemServer进程开启的时候,就会初始化AMS

  • 简介

    • AMS通过使用一些系统资源和数据结构(如进程、任务栈、记录Activity生命周期的状态机等)来管理Activity生命周期。

    • 当用户在设备上执行新的操作时,AMS会找到相应的任务栈,并根据其优先级来判断应该启动哪个Activity。

    • AMS也负责检查和处理系统内存的使用情况,并根据需要重新排列和重组任务栈中的Activity。

    • ActivityTaskManagerService(ATMS)是Android 10 新增的系统服务类,ATMS承担了AMS的部分工作(activities、task、stacks、display相关),比如将activity的启动相关的调用转移到ATMS了。

  • AMS功能

    • 组件状态管理

      包括四大组件的开启、关闭等(比如startActivity、startActivityAndWait、activityPaused、stopActivity、removeContentProvide)

    • 组件状态查询

      查询组件当前运行等情况(比如getCallingActivity、getService)

    • Task相关

      包括removeTask、removeSubTask、moveTaskBackwards、moveTaskToFront等

    • AMS是通过ActivityStack及其他数据结构佬记录,管理系统中的activity及其他组件的状态,并提供查询功能的一个系统服务

AMS原理

  • 应用程序启动过程

    点击应用程序图标时,由Launcher应用程序向AMS发送一个启动请求。

    AMS根据包名和类名找到对应的Activity,并启动activity。

    AMS在启动activity过程中,会创建activity所在的进程,并控制生命周期。

  • Activity生命周期的管理

    AMS通过与Zygote进行通信,创建Activity实例,

    然后根据activity的状态来管理它的运行状态,

    当应用程序处于后台时,AMS会将其进程变成缓存进程,

    当内存不足时,AMS会杀死缓存进程。

    AMS还负责监测应用程序的内存使用情况,内存不足,就会根据优先级来终止一些应用程序的Activity。

  • 应用程序之间交互

    当用户启动一个新应用程序时,AMS检查该应用程序是否已经在运行,根据需要执行操作:

    如果已经在运行,就直接切换到这个应用程序;

    如果不存在,就启动这个应用程序;

    如果在后台运行,就把它切换到前台。

  • 系统服务的调度

    系统服务包括WI-FI、蓝牙等,AMS会启动、停止、重启这些服务,以保证系统正常运行。

  • 应用程序的任务管理

    将多个应用程序的activity组成一个任务,提供任务导航和管理等功能。

  • 应用程序的权限管理

    当应用程序请求权限时,AMS会弹出对话框询问用户是否授权,

    如果用户授权,就将应用的权限信息存储到系统中。

常用类和方法

  • ActivityManagerService类

    AMS的核心类,负责管理应用程序的生命周期、进程的创建和销毁

    • startProcessLocked() 启动一个新进程
    • killProcessesLocked() 杀死不必要的进程
    • attachApplicationLocked() 将应用程序绑定到AMS
    • handleAppDiedLocked() 处理应用程序死亡事件。
  • ActivityStack类

    管理应用程序的Activity栈(activity任务),一个ActivityStack对应一个Activity任务。

    • startActivityLocked() 启动一个新的Activity
    • moveToBackLocked() 将当前Activity移动到栈底
  • ProcessRecord类

    一个进程实例,负责管理进程的生命周期。进程之间通信采用Binder机制。

    • startProcess() 启动一个新的进程

    • kill() 结束进程

  • ActivityTaskManagerService类

    处理应用程序的Task相关问题。Task是一组相关的Activity集合,他们可以共享一个Back键返回栈,通常处于一个任务栏中。

    • startActivity(Intent intent) 启动指定的Activity,并添加到Task中
    • moveTaskToFront(int taskId, int flags) 将指定的Task移动到前台

SystemServer加载AMS

Zygote进程会创建SystemServer进程,AMS是在SystemServer中启动的:
在这里插入图片描述
在run()里面新建一个SystemServiceManager对象,然后加到本地服务列表中,

接着启动三类服务:引导服务(AMS就是其中一个)、核心服务、其他服务:

  1. 创建AMS对象,并启动服务
  2. 将AMS所在的系统进程添加到进程管理中(完成AMS注册到SystemManager中)
  3. 为系统进程安装ContentProvider对象
  4. 在systemReady方法中做善后
    在这里插入图片描述
    然后启动AMS的主线程Looper,用于处理AMS的各种操作。

App启动中的AMS流程

  1. 用户点击应用程序图标,系统通过Launcher应用程序给AMS发送一个启动应用程序的请求。
  2. AMS接收到启动请求后,先检查应用程序是否已经运行,
    1. 如果已经运行,则直接把应用程序的任务栈置于前台,并把最上层的activity显示在屏幕上。
    2. 如果程序没有运行,ANS就会根据包名和activity类名创建一个新的进程,把它添加到系统的进程列表中。
  3. AMS会在新的进程中创建一个ActivityThread实例,并通过Binder机制与该进程进行通信。
  4. ActivityThread负责处理应用程序的生命周期和界面显示等任务。在创建完ActivityThread实例后,AMS会调用ActivityThread的main()启动该线程的主线程。
  5. 主线程启动后,ActivityThread会初始化应用程序的上下文环境,并加载应用程序的资源,然后ActivityThread会调用Instrumentation的callApplicationOnCreate(),通知应用程序的application实例进行初始化操作。
  6. 应用程序的application实例初始化完成后,ActivityThread会调用Instrumentation的newActivity()创建启动activity的实例,并将其添加到任务栈中。
  7. ActivityThread会调用activity的onCreate(),执行应用程序的初始化逻辑。在这个过程中,activity可以加载布局、注册监听器等。
  8. 当Activity的onCreate()执行完后,ActivityThread会调用activity的onStart(),使activity进入可见状态
  9. 最后,ActivityThread会调用activity的onResume(),使activity进入前台并显示在屏幕上。

通信方式

对于Android上层架构,最常用的通信方式是Binder、Socket、Handler,当然也有少量其他的IPC方式,比如杀进程Process.killProcess() 采用的是signal方式。

为何Android要采用Binder作为IPC机制

  • 管道:在创建时分配一个page大小的内存,缓存区大小比较有限。
  • 消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;
  • 共享内存:无须复制,共享缓冲区直接附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;
  • 套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;
  • 信号量:常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为 进程间以及同一进程内不同线程之间的同步手段。
  • 信号: 不适用于信息交换,更适用于进程中断控制,比如非法内存访问,杀死某个进程等;

使用Binder的理由

Binder跨进程通信的优点

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DenseNet算法:口腔癌识别

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 DenseNet算法结构 其基本思路与ResNet一致,但是它建立的是前面所有层和后面层的密集连接,它的另一大特色是通过特征在channel上的连接来实现特征重用。 二 设计理念 三…

【黑马点评】0.环境配置--Redis6.2.6和可视化工具在Windows上的安装

黑马点评--0.Redis6.2.6在windows上的环境配置与可视化 0 前言1 下载安装2 解压后运行msi文件3 修改配置文件并打开Redis3.1 修改密码(可选)3.2 测试 4 Redis可视化(可选)4.1 Another Redis Desktop Manager下载安装4.2 连接Redis…

Kubernetes-Operator篇-04-operator部署验证

1、部署命令 这个是很多博客教程都在使用的部署命令: make manifests make install export ENABLE_WEBHOOKSfalse make run我们使用之前的demo来进行部署验证:Kubernetes-Operator篇-02-脚手架熟悉 这里面涉及到的makefile的配置可以参考:…

Webpack模式-Resolve-本地服务器

目录 ResolveMode配置搭本地服务器区分环境配置 Resolve 前面学习时使用了各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库,在 Webpack 中,resolve 是用于解析模块依赖的配置项,它决定了 We…

爬虫——爬取小音乐网站

爬虫有几部分功能??? 1.发请求,获得网页源码 #1.和2是在一步的 发请求成功了之后就能直接获得网页源码 2.解析我们想要的数据 3.按照需求保存 注意:开始爬虫前,需要给其封装 headers {User-…

计算机网络(十) —— IP协议详解,理解运营商和全球网络

目录 一,关于IP 1.1 什么是IP协议 1.2 前置认识 二,IP报头字段详解 三,网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四,公网IP和私有IP 五,理解运营商和全球网络 六&#xff…

openpnp - 底部相机高级校正的参数设置

文章目录 openpnp - 底部相机高级校正的参数设置概述笔记修改 “Radial Lines Per Calibration Z” 的方法不同 “Radial Lines Per Calibration Z”的校验结果不同 “Radial Lines Per Calibration Z”的设备校验动作的比较总结备注END openpnp - 底部相机高级校正的参数设置 …

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大…

Linux·进程概念(下)

1. 进程优先级 优先级就是获得某种资源的先后顺序,因为CPU资源是有限的,因此各个进程之间要去争取CPU的资源。 那么针对Linux操作系统下的PCB中,也就是task_struct结构体中,使用了int类型的变量记录了每个进程的优先级属性&#x…

“米哈游悄然布局未来科技:入股星海图,共绘具身智能机器人新篇章“

米哈游悄然入股具身智能机器人公司:技术布局与未来展望 近日,米哈游阿尔戈科技有限公司宣布入股具身智能机器人公司星海图,这一消息在行业内引起了广泛关注。米哈游,这家以游戏开发而闻名的企业,近年来正逐步扩大其在人工智能和新兴科技领域的投资布局,此次入股星海图正是…

数组指针和指针数组

引用:【数组指针】 仅此一篇 让你深刻理解数组指针-CSDN博客 b站:【动画讲解C语言指针-14-数组指针和指针数组】 https://www.bilibili.com/video/BV1Qj421U75U/?share_sourcecopy_web&vd_sourced59dcee6044af8fc880b46b581c3f58a 指向数组和指向…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024(IntelliJ IDEA、PhpStorm、RubyMine、Rider……)安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

双指针:滑动窗口

题目描述 给定两个字符串 S 和 T,求 S 中包含 T 所有字符的最短连续子字符串的长度,同时要求时间复杂度不得超过 O(n)。 输入输出样例 输入是两个字符串 S 和 T,输出是一个 S 字符串的子串。样例如下: 在这个样例中&#xff0c…

在树莓派上部署开源监控系统 ZoneMinder

原文:https://blog.iyatt.com/?p17425 前言 自己搭建,可以用手里已有的设备,不需要额外买。这套系统的源码是公开的,录像数据也掌握在自己手里,不经过不可控的三方。 支持设置访问账号 可以保存录像,启…

C++中,如何使你设计的迭代器被标准算法库所支持。

iterator(读写迭代器) const_iterator(只读迭代器) reverse_iterator(反向读写迭代器) const_reverse_iterator(反向只读迭代器) 以经常介绍的_DList类为例,它的迭代…

QT--基础

将默认提供的程序都注释上意义 0101.pro QT core gui #QT表示要引入的类库 core:核心库 gui:图形化界面库 #如果要使用其他库类中的相关函数,则需要加对应的库类后,才能使用 greaterThan(QT_MAJOR_VERSION, 4): QT wid…

算法: 二分查找题目练习

文章目录 二分查找二分查找在排序数组中查找元素的第一个和最后一个位置搜索插入位置x 的平方根山脉数组的峰顶索引寻找峰值寻找旋转排序数组中的最小值点名 总结精华模版 二分查找 二分查找 没啥可说的,轻轻松松~ class Solution {public int search(int[] nums, int target…

栈的介绍与实现

一. 概念与结构 栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out的原则。 压栈:栈的插…

二叉树进阶学习——从前序和中序遍历序列构造二叉树

1.题目解析 题目来源:105.从前序与中序遍历序列构造二叉树——力扣 测试用例 2.算法原理 首先要了解一个概念 前序遍历:按照 根节点->左子树->右子树的顺序遍历二叉树 中序遍历:按照 左子树->根节点->右子树的顺序遍历二叉树 题目…

在 Kali Linux 中安装 Impacket

步骤 1:更新系统 打开终端并确保你的系统是最新的: sudo apt update && sudo apt upgrade -y 步骤 2:安装依赖 在安装 Impacket 之前,你需要确保安装了 Python 和一些必要的依赖。通常,Kali 已经预装了 Pytho…