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

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...