当前位置: 首页 > 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…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...