面试官:“请描述一下Android系统的启动流程”

news2024/10/7 10:17:45

作者:OpenGL

前言

什么是Android启动流程呢?其实指的就是我们Android系统从按下电源到显示界面的整个过程。

当我们把手机充好电,按下电源,手机会弹出相应启动界面,在等了一段时间之后,会弹出我们熟悉的主界面,这其实就是我们Android系统的整个启动过程。

本篇文章就是想跟大家聊一下我们的Android系统启动过程中到底经历了什么。

另外,本篇可以看成一篇介绍文章,会出现很多名词,这些词对于不了解底层的人来说可能会有些陌生, 在这里只会介绍他们的名称以及作用。一些重要的进程后续会出相应的文章。 而不需要了解的,可能在这里就一笔带过了。请各位谅解。

电脑是如何启动的呢

其实组装过电脑的人应该知道我们的电脑其实是由各式各样的硬件组成的。最重要的是CPU,他是用来进行计算的。 我们的鼠标键盘是用来输入的。显示器不管你是2K分辨率还是1080P分辨率都是用来显示图形界面的,另外还有音响等。

当然这里还有一个东西叫做主板,我们所有的硬件设备最终都要连接在主板上,无论是你通过线的形式,
还是像CPU和内存一样直接被插在主板上。

当我们按下电源的启动键,会先执行主板上的启动程序,他会先执行一个叫做Bios的程序,如果你的电脑系统坏了,就要在Bios重新设置启动盘的加载路径,一般情况下是一个已经预装好系统的U盘,进而给我们的电脑重新安装系统。


Android的启动流程

1. 手机上的BIOS:BootLoader

上面讲了,电脑的启动流程。为啥要讲电脑的启动呢?因为Android的启动和它差不多。手机的所有硬件也都镶嵌在手机的主板上,只不过手机相对电脑的机箱来说,整体更加轻薄。

当我们手机关机进行启动的时候,我们第一件要做的就是按下电源键。按电源键,其实就是再给我们的手机主板通电。通电之后,我们的主板会启动一个BootLoader的程序,去已经设置好的位置加载我们的手机系统。这个BootLoader就相当于我们电脑的Bios。

在十年前,Android刚刚兴起的时候,相比于ios封闭的生态系统。Android系统的一些用户,非常喜欢做的一件事情就是刷机。
而且各大厂商也会出相应的手机Rom包,给各个玩家刷机。现在的MIUI就是那时候兴起的,彼时的小米还没有做自己的第一部1999的手机,它做的只是Rom系统。

当然下场做系统的不止小米一家,还有百度的系统,阿里的系统,还有国外的CM团队做的系统。我记得当时高中的我有了一部三星的i9020俗称谷歌二太子,它本身是Android2.3系统的,后来Google推出了自己的Android4.0系统的Rom包给二太子,当时全世界第一批用上Android4.0的用户,就是拥有i9020手机的人。

那时候就是下载Rom包放到SDCard下,在进入BootLoader界面,双清所有设置,接着选择sdcard上的安装包,等待安装完毕再进行重启。就可以用上最新的Android4.0了。

所以说这个BootLoader就相当于电脑的Bios

只不过现在的手机没有那么多的可玩性,不能换主板cpu,也没有相应的系统给用户进行刷机了。


2. Android的第一个进程:idle

Android是基于Linux系统内核做的一款移动端操作系统。所以在在BootLoader启动Android系统之后,它启动的第一个进程也和Linux一样,是idle进程。并且这个进程的 pid = 0

基于Linux系统所以很多机制也和Linux比较相似,就比如说内核空间用户空间。其实这属于一个比较抽象的概念。我们可以用后台系统类比一下方便理解。

假设你是一个后台管理人员。你的权限可能就是单纯的查看数据。但是新建账号或者删除数据这些功能你是无权使用的。你要是想使用这些功能的话需要获取更高的权限,也就是我们俗称的提权。

我们的操作系统在运行的时候,为了系统的稳定。会将整块内存区域分成两份,一份是系统运行的内存区域,要想操纵这块区域,或者运行某些函数往这块内存上修改数据,就必须拥有极高的权限,这块内存区域也就是内核空间。另一块区域就是运行一些普通的程序,这一块区域被称作用户空间。与之相对的,可以操作内核空间的权限被称作内核态,可以操作用户空间的权限被称作用户态

为什么会分成这两块呢,究其原因是为了安全稳定。如果,你是一个系统开发商,你的系统在运行的时候,客户随便点开一个App,这个App是一个恶意程序,它修改了你系统运行的某些内存数据,导致你的系统崩溃死机。久而久之,你的操作系统就会失去市场。所以Linux才会把内存分为用户空间内核空间

idle的主要作用

  1. 初始化进程以及内存管理,加载硬件的驱动程序
  2. 创建init进程,该进程的pid=1,init进程是第一个用户空间的进程
  3. 创建kthreadd进程,该进程pid=2,并且该进程仍属于内核空间
  4. idle进程自己也运行在内核空间

2. 和内核相关的进程:kthreadd

对于kthreadd进程,我们其实并不需要知道太多,毕竟我们正常开发用不到关注内核相关的代码。我们只需要知道几点,

  1. kthread的进程pid=2
  2. 内核相关的资源都是由这个进程创建而来的。
  3. 该进程以及由它产生的子进程都运行在内核空间

3. 一切的开始:init进程

init进程,光听名字我们就知道他的重要性。这个进程也是由idle进程创建而来的,他的pid=1。并且它是第一个属于用户空间的进程。

init主要作用

  1. 该进程最主要的作用就是fork出了Zygote进程
  2. 同时会创建ServiceManager进程。即我们俗称的服务大管家。

4. 最重要的进程:Zygote

Zygote英文翻译为受精卵,我们平时启动的所有进程等都是由这个进程复制而来。所谓复制就是,这个进程会复制出两份一模一样的进程,其中一个继续当Zygote进程,另一个进程执行完相关代码就变成了,你想启动的进程。但是在fork出别的进程之前,他要先进行一些初始化,这样fork出来的进程就和他一样自带这些初始化好的功能,而不是在初始化一遍。

Zygote的主要作用

  1. 创建虚拟机
  2. 注册JNI
  3. 启动ZygoteServer(实际就是Socket,用来跨进程通信)
  4. preload 预加载资源,之后复制出的进程就都已经是加载过资源的进程了
  5. 启动SystemServer
  6. 循环等待,一旦AMS通知创建进程,就会进行进程分裂

Zygote其他

这里多说一嘴,Zygote进程本身创建了JVM虚拟机,注册了JNI,也就是说我们的代码从这里开始,才真正的开始可以执行Java代码,之前运行的都是C++代码
另外,由于在fork进程之前进行了创建虚拟机注册JNI,以及预加载等工作。所以我们fork出的进程从出生开始,就自带了虚拟机,并且已经注册好了JNI代码,相应的资源也已经加载完毕了


5.累死累活的工具人:SystemServer

为啥说它是累死累活的呢,因为几乎所有服务都是由SystemServer创建的。其中包括AMS,WMS,PMS等重要服务,都是运行在该进程上的,并且在该进程上注册到ServiceManager进程中。


6.柳暗花明有一村:Launcher

各位有没有想过,我们每天滑动手机时的界面到底是什么。其实它和我们开发的手机程序一样,都是一个App。只不过它是由Android系统自动启动的。并且,它可以把我们的所有安装的App全都显示出来,仅此而已。
当我们点击Launcher上的App图标时,它会和AMS进行通信,AMS又和Zygote进行通信。Zygote进程fork出了一个新进程,并执行相关代码,从而我们编写的App就这样被创建了出来。

本章问题

  1. Android系统的启动流程都经历了什么
  2. init进程都有哪些作用
  3. zygote进程都干了什么
  4. systemserver是由谁启动的呢
  5. 我们平时看到的系统界面实际是什么

Android启动流程图解

Android 学习手册

Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Flutter 篇:https://qr18.cn/DIvKma
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 面试题锦:https://qr18.cn/CKV8OZ
Android 车载面试题:https://qr18.cn/FTlyCJ

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI数据标注工程师这个职业怎么样?

本篇文章主要讲解ai数据标注工程师这个职业的具体情况和相关的职业前景 作者:任聪聪 日期:2023年4月18日 数据是ai的灵魂,自然界中相对应的数据都活多少存在不准确、杂乱、无效等属性,需要人为进行收集、整理、分类和处理。其中ai…

Linux 内核原理摘录

文章目录 一、Linux 内核设计与实现1、进程管理(1)调度2、内核数据结构(1)kfifo 3、中断 一、Linux 内核设计与实现 本章主要用来摘录《Linux 内核设计与实现》一书中学习知识点,其基于 Linux 2.6.34 。 1、进程管理 …

PowerShell install go+caddy+filebrowser+nssm 实现部署文件系统

filebrowser filebrowser 是一个使用go语言编写的软件,功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件,或者是添加删除文件,甚至可以分享文件,是一个很棒的文件管理器,你甚至可以当成一个网盘来使用。…

找高清视频素材,就上这6个网站。

推荐6个高清视频素材库,免费下载,建议收藏~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个,全部都很高清,站内可以按标签分类查找…

某医院访问医保系统慢流量分析案例

背景 我们已将NetInside流量分析系统部署到某市人民医院的机房内,使用流量分析系统提供实时和历史原始流量。本次分析重点针对访问外网医保系统性能进行分析,以供安全取证、性能分析、网络质量监测以及深层网络分析。 分析时间 报告分析时间范围为&am…

【Linux】进程间通讯

前提知识 进程间具有独立性 ,现在我们要打破独立性,去通讯,所以 通讯的成本一定很高。 又时候又需要多进程协同完成某种业务内容 ,例如以前: cat file | grep “hello",这就是两个进程之间的通讯。 通讯的本质就是…

【一文学会MQTT协议和mosquitto】

一文学会MQTT协议和mosquitto 一.、MQTT的基本概念二、mosquittomosquitto基本概念常用API 三、MQTT测试EMQX 一.、MQTT的基本概念 MQTT是一种基于发布/订阅模式的协议,其中发布者发布消息,订阅者订阅感兴趣的主题(topic)&#x…

QGIS--开发OpenSCENARIO动态场景(二)--安装插件

1.下载并安装ad_map(无需构建): 1)ad_map插件: https://github.com/carla-simulator/map/releases 下载第一个:ad_map_access_qgis.zip 2)导入插件: 从MenuBar的Plugins >…

YOLOv8 更换主干网络之 FasterNet

论文地址:https://export.arxiv.org/pdf/2303.03667v1.pdf 为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。并且,如此低的FLOPS主要…

ThreadLocal InheritableThreadLocal TransmittableThreadLocal的使用以及原理

ThreadLocal 每个线程向ThreadLocal设置值&#xff0c;再取值&#xff0c;实现线程之间的隔离 public class ThreadLocalCase1 {private static ThreadLocal<Integer> threadLocal new ThreadLocal<>();public static void main(String[] args) {Random random …

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper f…

MySQL学习笔记第一天

第02章 MySQL环境搭建 1.MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现…

AIGC: Midjourney和Stable Diffusion在大厂中的应用

AIGC: Midjourney和Stable Diffusion在大厂中的应用和教程​http://www.webhub123.com/#/home/detail?projectHashid51631966&ownerUserid21336964 收录效果如下 登录后即可一键拥挤收藏以下所有文章网址到我的收藏夹&#xff0c;网站帮你简单高效地管理你的网络收藏&…

Memtiter-benchmark源码解析4memtier_benchmark.cpp源代码解读

run_benchmark 程序入口 First , create the cg_thread instances in the vector threads and then call each cg_thread’s prepare() function of them. Subsequently, launch each thread in the vector threads cg_thread m_base event_base_new() // line 528 一个cli…

移动端手机网页适配iPad与折叠屏设备

采用的网页适配方案&#xff1a;移动端页面px布局适配方案&#xff08;viewport&#xff09; 产生此问题的原因 由于手机与平板等设备宽高比差异导致页面展示不全或者功能按钮展示在视口之外点击不到。 简单来说就是我们的页面都是瘦长(即高大于宽)的&#xff0c;而折叠屏等设…

【计算机专业应届生先找培训还是先找个工作过渡一下?】

计算机专业应届生先找培训还是先找个工作过渡一下&#xff1f; 计算机应届生是先培训还是先工作&#xff0c;这个问题应该困扰了很多专业技能一般的同学&#xff0c;尤其是学历方面还没有优势的普通本专科院校。都说技术与学历优秀的人进大厂&#xff0c;技术一般学历优秀的人能…

@ComponentScan自动扫描组件并指定扫描规则

1.使用注解配置包扫描 1.1.创建相关类 分别创建BookDao、BookService、BookServiceImpl以及BookController这三个类&#xff0c;并在这三个类中分别添加Repository、Service、Controller注解 BookDaopackage com.tianxia.springannotation.dao;import org.springframework.s…

【社区图书馆】如何唤醒数学脑

如何唤醒数学脑 内容简介 每个人天生都有数学力&#xff0c;有着内建的“数学式思维模式”&#xff0c;若能有效发挥&#xff0c;就能在学校、职场、人际关系中表现出来&#xff0c;从容不迫地获得更好的效率及成就感。 但这种思维模式会受到周围情境、心理状态等因素的影响&…

思必驰闯关科创板:对标科大讯飞,发展阶段落后逾10年

4月17日&#xff0c;人机对话解决方案提供商——思必驰科技股份有限公司&#xff08;下称“思必驰”&#xff09;已更新提交相关财务资料&#xff0c;根据相关规定&#xff0c;上交所恢复了其发行上市审核。 2022年7月15日&#xff0c;思必驰向科创板递交IPO申请。今年3月底&am…

贵金属期货交易平台排行榜是真的还是假的?如何选择?

贵金属期货交易是一种非常常见的投资形式&#xff0c;其市场容量非常大&#xff0c;因此有各种各样的期货交易平台。这导致许多投资者不知道如何选择这些平台。对于投资者来说&#xff0c;只有选择一个高质量的期货交易平台&#xff0c;他们才能更好地进行后续的交易。如何选择…