当前位置: 首页 > news >正文

【Android】AMS(一)系统启动流程

前言

AMS(Activity Manager Service)即活动管理器服务,是Android系统中的一个核心服务。它主要负责管理应用程序的生命周期,包括启动应用程序、切换应用程序、管理任务栈等。

Android启动流程

Android程序的启动流程可以概括为以下几个步骤:

Boot Room(引导程序):

当我们按下手机的电源键时,Boot Room会首先运行,它会检测并初始化硬件设备,加载引导程序和启动内核。在这一步中,Boot Room需要确保设备能够正常地启动,并加载能支持Android系统的Bootloader引导程序。

Bootloader:

在手机启动过程中先运行,它负责控制系统的引导流程,包括检测硬件、初始化系统资源和加载内核等操作。

内核启动:

内核(Kernel)是Android系统的核心组件,它管理硬件设备、内存、进程和线程等系统资源。在内核启动的过程中,它会分配内存和初始化各种设备驱动程序。在完成初始化后,内核会启动init进程。

Init进程:

Init进程是Android系统的第一个用户空间进程,也是整个系统进程的父进程。它会在内核启动后立即启动,并负责初始化Android系统的各种服务和应用程序。在这一步中,Init进程会检查系统分区是否挂载成功,启动Zygote进程和Android的各个服务。

Zygote进程:

Zygote进程是专门为应用程序进程创建而设计的进程。它会在启动时读取预先编译过的Java核心库,并创建一个Android运行时环境。当一个新的应用程序进程需要启动时,Zygote进程会复制自己的状态并使用其作为模板来快速创建一个新的应用程序进程。

应用程序进程:

最后,Android系统会启动各种应用程序和服务的进程,如Launcher、Settings、Phone、SMS等。这些进程通常是由Zygote进程和其他系统服务创建的,它们通过Android API访问系统资源,并提供用户界面和功能。


内核主要任务

在系统启动过程中,内核是第二个被加载并运行的程序,它主要负责以下几个方面的任务:

硬件资源管理:

内核需要检测和识别设备硬件,并根据相关驱动程序来初始化和管理硬件资源。这些硬件资源包括CPU、内存、屏幕、键盘、USB口、Wi-Fi等,内核需要保证这些硬件设备能够正常工作。

内存管理:

内核需要分配并管理系统的物理内存和虚拟内存。在内核启动过程中,它会从系统中分配一部分物理内存,在内存中建立页表映射关系,并创建内核堆栈和用户进程堆栈。此外,内核还要实现内存保护机制、内存回收机制、内存压缩和释放机制等。

进程和线程管理:

在Android系统中,每个应用程序都运行在独立的进程中。内核需要创建和管理进程和线程,实现进程间通信和资源共享。在内核启动过程中,它会启动init进程作为系统的根进程,并在init进程中创建其他系统服务和应用程序进程。

设备驱动程序初始化:

内核需要加载并初始化各种设备驱动程序,包括输入输出设备驱动、系统总线设备驱动、网络设备驱动等。这些设备驱动程序与硬件相关联,将硬件和软件有效地联系在一起。


Init进程任务

Init进程是Android系统的第一个用户空间进程,也是整个系统进程的父进程。它会在内核启动后立即启动,并负责初始化Android系统的各种服务和应用程序。在这一步中,Init进程会检查系统分区是否挂载成功,启动Zygote进程和Android的各个服务。

挂载文件系统

在Linux系统中,文件系统需要以某种方式挂载到根目录下才能被访问。在Android系统启动时,Init进程会根据fstab文件配置,挂载根文件系统以及各种类型的文件系统,如proc、sysfs、tmpfs等。

设置SELinux策略

SELinux是一种基于内核的安全机制,可以限制应用程序的权限,提高系统的安全性。在Android系统启动时,Init进程会设置SELinux策略,并限制应用程序的权限。

开启属性服务,并注册到epoll中

在Android系统中,属性服务用于存储系统和应用程序的一些属性信息,如屏幕分辨率、设备名称等。在Init进程启动过程中,它需要开启属性服务,并将其注册到epoll中,以便其他进程可以访问这些属性信息。

解析init.rc脚本

在Android系统中,init.rc脚本用于定义系统启动时需要执行的命令和服务。在Init进程启动过程中,它会解析init.rc脚本,并按照其中的命令和服务依次执行。

循环处理脚本 - 启动Zygote

在执行完init.rc脚本后,Init进程会循环处理脚本并启动一些服务,包括启动Zygote进程、启动SystemServer等。

循环等待

在完成所有初始化工作之后,Init进程会进入一个循环等待状态,监听系统事件。当发生某些事件时,Init进程会根据事件类型执行相应操作,如启动或停止某个服务等。


Zygote进程任务

Zygote进程是专门为应用程序进程创建而设计的进程,在Android系统中起着至关重要的作用。它会在启动时读取预先编译过的Java核心库,并创建一个Android运行时环境。当一个新的应用程序进程需要启动时,Zygote进程会复制自己的状态并使用其作为模板来快速创建一个新的应用程序进程。

Zygote进程可以简单总结为以下几点:

初始化运行环境,创建JVM

在Zygote进程启动时,native代码会先初始化运行环境,包括创建Java虚拟机、加载Android Framework等。这些操作会在C++层面完成,然后通过JNI接口与Java层进行交互。

注册监听器

Zygote进程会注册一个监听器,用于等待其他进程的消息通知。当其他进程需要创建新的应用程序进程时,它们可以通过向Zygote进程发送消息来通知它。

调用ZygoteInit.main函数

在Zygote进程启动之后,native代码会调用ZygoteInit类中的main函数。这个函数的作用是解析传递给Zygote进程的参数,设置Zygote进程的一些属性,如用户ID、内存分配策略等。

预加载 - 加快进程启动

为了加快应用程序进程的启动速度,Zygote进程会预加载一些常用的类和库,如ActivityThread、SystemServer等。这样,在应用程序进程启动时,就可以直接使用这些已经加载好的类和库,而不必再重新加载和初始化它们,从而提高系统性能。

Socket - 等待通知

Zygote进程会创建一个Unix域套接字,并等待其他进程的连接请求。当其他进程需要创建新的应用程序进程时,它们会通过该套接字与Zygote进程进行通信,传递启动参数和选项等信息。

循环等待

在完成所有初始化工作之后,Zygote进程会进入一个循环等待状态,监听其他进程的连接请求。当其他进程发送消息给Zygote进程时,它会根据消息内容创建新的应用程序进程,然后再次进入循环等待状态。


相关文章:

【Android】AMS(一)系统启动流程

前言 AMS(Activity Manager Service)即活动管理器服务,是Android系统中的一个核心服务。它主要负责管理应用程序的生命周期,包括启动应用程序、切换应用程序、管理任务栈等。 Android启动流程 Android程序的启动流程可以概括为…...

FineBI6.0基础学习第一课 数据门户

PC端门户使用示例 首先,以管理员身份登录FineBI系统,安装数据门户,安装步骤见官网 新建一个数据门户...

如何部署项目到Tomcat + 第一个Servlet程序

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、Tomcat 1.1 Tomcat是什么 1.2 下载安装 1.3 部署项目 二、第一个Servlet程序 2.1 Servlet是什么 2.2 创建Maven项目 2.3 引入依赖 2.4 创建目录 2.5 编写类方法 2.6 打包…...

牛客刷题(HTML-Day1)

第一题&#xff1a; 1.下列代码在页面中显示的内容为&#xff08; &#xff09; <!DOCTYPE html> <html> <body> <p>hello<q>html</q></p> </body> </html> A hello“html” B hello html C hello“”html D 其他几…...

性能测试如何入门?熬夜7天整理出这一份3000字超全学习指南

赶鸭子上架要我搞性能测试&#xff0c;怎么办&#xff1f; 我第一次真正意义上搞性能测试是在2014年。项目组要求搞性能测试&#xff0c;我之前也没搞过&#xff0c;对服务端也不熟悉。就那么一脸懵逼地开始搞性能。当时我连linux上有哪些能看系统资源的命令都不知道。稀里糊涂…...

信息安全实践1.2(重放攻击)

前言 这个实验是看一本书做的&#xff0c;就是李华峰老师的书——《Metasploit Web 渗透测试实战》&#xff0c;我之前写过一篇Slowloris DoS攻击的博客&#xff0c;也是看这本书写的&#xff0c;总的来说&#xff0c;有用处。这篇博客其实也只是很浅显的去做一下重放攻击。 要…...

上海亚商投顾:沪指高开高走 地产股迎来久违反弹

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日高开高走&#xff0c;沪指午后涨近1%&#xff0c;深成指、创业板指涨超1.2%&#xff0c;上证50盘中大…...

Vim学习笔记【Ch02】

Vim学习笔记 系列笔记链接Ch02 Buffers, Windows, TabsBuffers什么是buffer查看所有bufferbuffer之间的切换删除buffer退出所有窗口 Windows窗口的创建窗口切换快捷键其他快捷键 Tabs什么是tabtab相关命令 window和buffer结合的3D移动小结 系列笔记链接 Ch00&#xff0c;Ch01 …...

《低代码指南》——低代码维格云能源行业解决方案

目录 典型场景介绍: 一、能源资产管理 二、碳核查 三、配电运营 总 结: 从业界实际情况来看,流程建设本身是一个对业务现实进行抽象的过程,这个过程即使不考虑软件开发的门槛,对于很多客户而言也是个涉及较长周期的复杂工作,往往需要咨询专家或专业公司帮助其建设内…...

【自制C++深度学习推理框架】Layer的设计思路

Layer的设计思路 Layer的抽象 如果将深度学习中的所有层分为两类, 那么肯定是"带权重"的层和"不带权重"的层。 基于层的共性&#xff0c;我们定义了一个Layer的基类&#xff0c;提供了一些基本接口&#xff0c;并可以通过继承和多态机制实现不同类型的L…...

Rust每日一练(Leetday0011) 下一排列、有效括号、搜索旋转数组

目录 31. 下一个排列 Next Permutation &#x1f31f;&#x1f31f; 32. 最长有效括号 Longest Valid Parentheses &#x1f31f;&#x1f31f;&#x1f31f; 33. 搜索旋转排序数组 Search-in-rotated-sorted-array &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷…...

STL --- 五. 函数对象 Function Objects

目录 1、函数对象的定义和作用 2、函数对象的分类和使用 3、std 常用的函数对象 4、函数对象的适配器 5、std 算法和函数对象区别 1、函数对象的定义和作用 STL&#xff08;Standard Template Library&#xff09;中的函数对象&#xff08;Functor&#xff09;是一种重载…...

Java IO 流操作详解

Java IO 流操作详解 一、简介1. 什么是IO流2. IO流的分类3. IO流的作用 二、Java IO流的输入操作1. 文件输入流2. 字节输入流3. 缓冲输入流4. 对象输入流 三、Java IO流的输出操作1. 文件输出流2. 字节输出流3. 缓冲输出流4. 对象输出流 四、Java IO流的常用方法解析1. 字节读写…...

Halcon 形状匹配参数详解

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score) find_shape_model(Image : : //搜索图像 ModelID, //模板句柄 AngleStart, // 搜索时的起始角度 AngleExte…...

C++11强类型枚举

C11引入了强类型枚举&#xff08;enum class&#xff09;&#xff0c;也称为枚举类。 强类型枚举是一种更加类型安全的枚举类型&#xff0c;相对于传统的枚举类型&#xff0c;强类型枚举可以提供更好的安全性和可读性。 强类型枚举的格式如下&#xff1a; enum class 枚举名 …...

pytorch讲解(部分)

友爱的目录 自动求导机制从后向中排除子图自动求导如何编码历史信息Variable上的In-place操作In-place正确性检查 CUDA语义最佳实践使用固定的内存缓冲区使用 nn.DataParallel 替代 multiprocessing 扩展PyTorch扩展 torch.autograd扩展 torch.nn 多进程最佳实践共享CUDA张量最…...

C++ 基本的7种数据类型和4种类型转换(C++复习向p3)

文章目录 基本内置类型存储范围typedef 声明新名字enum 枚举类型类型转换 基本内置类型 boolcharintfloatdoublevoidwchar_t ⇒ short int 存储范围 可以这样 sizeof(int) 来确认 int 占用字节数 char&#xff0c;1字节&#xff0c;-128~127 或 0~255 wchar_t&#xff0c;2…...

Scrum敏捷迭代规划和执行

Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的&#xff0c;在Leangoo中&#xff0c;我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog&#xff08;迭代&#xff09;看板&#xff0c;用于管理当前Sprint的需求和开发任务&#xff0c;可视化展示每…...

智警杯赛前学习1.1---excel基本操作

修改默认设置 步骤一&#xff1a;打开“Excel选项”窗口&#xff0c;打开“文件”菜单&#xff0c;选择“选项”标签 步骤二&#xff1a;在“Excel选项”窗口中&#xff0c;选择“常规与保存”标签&#xff0c;在“常规与保存”标签中&#xff0c;可以修改录入数据时的默认字体…...

【Android】Handle(一) 主要特点和用途

在Android中&#xff0c;Handler是一种消息处理机制&#xff0c;它允许我们在不同线程之间交换信息并更新UI。具体来说&#xff0c;Handler可以将一个Runnable或Message对象加入到消息队列中&#xff0c;并在合适的时间去执行它们。 以下是Handler的主要特点和用途&#xff1a…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...