【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)
第一题: 1.下列代码在页面中显示的内容为( ) <!DOCTYPE html> <html> <body> <p>hello<q>html</q></p> </body> </html> A hello“html” B hello html C hello“”html D 其他几…...

性能测试如何入门?熬夜7天整理出这一份3000字超全学习指南
赶鸭子上架要我搞性能测试,怎么办? 我第一次真正意义上搞性能测试是在2014年。项目组要求搞性能测试,我之前也没搞过,对服务端也不熟悉。就那么一脸懵逼地开始搞性能。当时我连linux上有哪些能看系统资源的命令都不知道。稀里糊涂…...

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

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

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

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

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

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

STL --- 五. 函数对象 Function Objects
目录 1、函数对象的定义和作用 2、函数对象的分类和使用 3、std 常用的函数对象 4、函数对象的适配器 5、std 算法和函数对象区别 1、函数对象的定义和作用 STL(Standard Template Library)中的函数对象(Functor)是一种重载…...

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引入了强类型枚举(enum class),也称为枚举类。 强类型枚举是一种更加类型安全的枚举类型,相对于传统的枚举类型,强类型枚举可以提供更好的安全性和可读性。 强类型枚举的格式如下: 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,1字节,-128~127 或 0~255 wchar_t,2…...

Scrum敏捷迭代规划和执行
Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的,在Leangoo中,我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog(迭代)看板,用于管理当前Sprint的需求和开发任务,可视化展示每…...

智警杯赛前学习1.1---excel基本操作
修改默认设置 步骤一:打开“Excel选项”窗口,打开“文件”菜单,选择“选项”标签 步骤二:在“Excel选项”窗口中,选择“常规与保存”标签,在“常规与保存”标签中,可以修改录入数据时的默认字体…...

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

40亿个QQ号,限制1G内存,如何去重?【已通过代码实现】
前几天发现一个有趣的文章 “40亿个QQ号,限制1G内存,如何去重?”,发现很有意思,就想着用代码实现一下,下面是分析和实现过程 一、审题分析 一个 QQ 号现在最长有 11 位,因为 int 是四字节,数值范围是2的31次方,因此得使用 long 存储,但考虑到实现,使用 int 存储(1…...

Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型
本期为TechBeat人工智能社区第502期线上Talk! 北京时间06月01日(周四)20:00,新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”,届时将介…...

从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法
前面已经对 string 类进行了简单的介绍和应用,大家只要能够正常使用即可。 在面试中,面试官总喜欢让学生自己 来模拟实现string类, 最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 为了更深入学习STL,下面我…...

reduce()方法详解
一、 定义和用法 reduce() 方法将数组缩减为单个值。 reduce() 方法为数组的每个值(从左到右)执行提供的函数。 函数的返回值存储在累加器中(结果/总计)。 注释:对没有值的数组元素,不执行 reduce() 方法。…...

C++虚假唤醒
概念: 虚假唤醒是指在使用条件变量时,线程被唤醒但条件并没有满足,导致线程执行错误的情况,这个过程就是虚假唤醒。 虚假唤醒弊端: 虚假唤醒会导致程序的正确性受到影响,因为唤醒的线程并没有满足条件&…...

【AI】dragonGPT - 单机部署、极速便捷
dragonGPT 从数据私有化,到prompt向量库匹配,再到查询,一条龙服务,单机部署,极简操作 pre a.需要下载gpt4all model到本地. ggml Model Download Link 然后将存放model的地址写入.env MODEL_PATH your pathb.…...

Uuiapp使用生命周期,路由跳转传参
Uniapp生命周期: 1. beforeCreate:在实例初始化之后,数据观测和事件配置之前被调用。 2. created:在实例创建完成后被立即调用。 3. beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。 …...

定积分的计算(牛顿-莱布尼茨公式)习题
前置知识:定积分的计算(牛顿-莱布尼茨公式) 习题1 计算 ∫ 0 2 ( x 2 − 2 x 3 ) d x \int_0^2(x^2-2x3)dx ∫02(x2−2x3)dx 解: \qquad 原式 ( 1 3 x 3 − x 2 3 x ) ∣ 0 2 ( 8 3 − 4 6 ) − 0 14 3 (\dfrac 13x^3-…...

leak 记录今天的一个小题
先看题, add没有大小限制,这里edit可以溢出8字节,也就是可以改后边的size,可以调用4次free没有调用函数只是把指针置0,show可以用一次. void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) {init_0(a1, a2, a3);while ( 1 ){menu();switch ( read_n() ){cas…...

软考A计划-试题模拟含答案解析-卷二
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...