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跨进程通信的优点

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

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

相关文章

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Rust 教程Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片(如 ESP32、ESP32-S2、ESP32-C3 等&#xff0…

可视化图表与源代码显示配置项及页面的动态调整功能分析

可视化图表与源代码显示配置项及页面的动态调整功能分析 文章目录 可视化图表与源代码显示配置项及页面的动态调整功能分析1.分析图表源代码2.分析源代码显示功能**完整代码参考:** 3.分析源代码显示及动态调整**完整代码参考:** 4.分析代码编辑器及运行…

中国电信解锁万亿参数大模型:TeleAI的创新与突破

首个由万卡集群训练出来的万亿参数大模型,已被一家央企解锁。 具体而言,为了推动纯国产人工智能的探索,带来这条新路径的正是中国电信人工智能研究院(TeleAI)。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…

CSS中字体图标的使用

引言: 在网页设计当中,会有很多很简洁的图标,比如箭头,照相机,放大镜等 这些大概率都是使用字体图标来完成的,因为字体图标比较简洁高效,不会像图片一样需要向浏览器请求数据。那么字体图标该…

使用powershell的脚本报错:因为在此系统中禁止执行脚本

1.添加powershell功能环境: 2.启动powershell的执行策略 因为在此系统中禁止执行脚本。 set-executionpolicy unrestricted

Redis: 主从复制读写分离环境搭建

概述 Redis 的单机模式实际上就是在一个服务器上装了一个单节点的Redis通过简单的配置和简单的命令启动起来就可以使用这种搭建环境,不保证高可用的情况下,完全没有问题如果说你的项目必须要具备高可用,而且 Redis 也要提供更高的性能这个单…

【hot100-java】【寻找重复数】

技巧 使用字典,边记录边比较,有直接输出。 def findDuplicate(nums):seen {}for num in nums:if num in seen:return numseen[num] Truereturn None 可惜不是O(1) 二分查找 class Solution {public int findDuplicate(int[] nums) {int left0;int ri…

宝塔搭建nextcould 30docker搭建onlyoffic8.0

宝塔搭建nextcould 宝塔搭建nextcould可以参考这两个博文 我搭建的是30版本的nextcould,服务组件用的是下面这些,步骤是一样的,只是版本不一样而已 nginx 1.24.0 建议选择nginx,apache没成功。 MySQL 8.0以上都可以 php 8.2.…

Certbot自动申请并续期https证书

Certbot自动申请并续期https证书 一、 安装 Certbot:使用命令安装 Certbot: dnf install certbot python3-certbot-nginx获取 SSL 证书:运行 Certbot 命令来获取并安装 SSL 证书。 示例命令,替换其中的域名和路径信息&#xff1a…

jmeter-请求参数加密-MD5加密

方法1 :使用jmeter自带的函数助手digest Tool(工具)---Function Helper Dialog(函数助手对话框) 第一个参数是要md5加密的值,第二个参数是保存加密后值的变量 ( 此处变量是从txt文件导入的,所以使用的是${wd} ) …

Linux网络操作命令与函数全面总结

1. 引言 Linux作为服务器和开发平台,网络操作是其核心功能之一。本文旨在全面总结Linux系统中的网络操作方法,包括命令行工具和编程接口,帮助读者深入理解Linux网络管理的机制。 2. 命令行工具 2.1 ping 命令 ping 命令用于测试网络连接和…

基于投影滤波算法的rick合成地震波滤波matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 RICK合成地震波模型 4.2 投影滤波算法原理 5.完整工程文件 1.课题概述 基于投影滤波算法的rick合成地震波滤波matlab仿真。分别通过标准的滤波投影滤波以及卷积滤波投影滤波对合成地震剖面进行滤波…

基于Hive和Hadoop的共享单车分析系统

本项目是一个基于大数据技术的共享单车分析系统,旨在为用户提供全面的单车使用信息和深入的出行行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 S…

论文阅读 | HiDDeN网络架构

ECCV 2018 斯坦福-李飞飞团队 一、问题描述 受以下启发: 对抗性例子的发现:深度学习模型在图像识别任务中对微小的、难以察觉的输入扰动非常敏感,这些扰动可以导致模型错误分类图像。这一现象表明,神经网络可以在图像中编码信息&…

Python或R时偏移算法实现

🎯要点 计算单变量或多变量时序距离,使用欧几里得、曼哈顿等函数量化不同时序差异。量化生成时序之间接近度相似性矩阵。使用高尔距离和堪培拉距离等相似度测量。实现最小方差匹配算法,绘制步进模式的图形表示。其他语言包算法实现。 &…

IP协议讲解

IP协议 IP协议的本质:提供一种能力,将数据跨网络从A主机传输到B主机 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大 的数字是15, 因…

【数据结构初阶】排序算法(下)冒泡排序与归并排序

文章目录 4. 交换排序4. 1 冒泡排序 5. 归并排序6. 非比较排序6. 1 计数排序 5. 排序性能分析6. 排序算法复杂度及稳定度分析 4. 交换排序 交换排序基本思想: 所谓交换**,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置**。 交换排序的特点是…

归并排序【C语言版-笔记】

目录 一、概念二、排序流程理解三、代码实现3.1主调函数3.2 merge函数 四、性能分析 一、概念 归并是一种算法思想,是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素,可以把n个元素看作n个有序表,把它们两…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27目录1. VisScience: An Extensive Benchmark for Evaluating K12 Educational Multi-modal Scientific Reasoning VisScience:…

java中的强软弱虚

在java中对象的引用有强、软、弱、虚四种,这些引用级别的区别主要体现在对象的生命周期、回收时机的不同。 文章目录 准备工作1. 设置内存2. 内存检测 强引用软引用弱引用虚引用 准备工作 1. 设置内存 为方便调试,将内存设置为16MB 依次点击菜单栏的R…