Android 启动流程梳理

news2024/11/17 8:49:36

前言


什么是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进程

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等重要进程,都是在他的带领下经由Zygote创建出来的。


6.柳暗花明有一村:Launcher

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


结尾

到此,Android的启动流程大致讲完了。后面会根据相应的重要程度,进行讲解。另外每章最后会附加几个问题。毕竟看了一遍只是简简单单的读了一遍,只有真正的思考才会真正的记住。 另外,文章中要是有哪里说的不对的,一定要跟我提出,我会进行修正。毕竟我就是一个想向大家科普一些我学到的知识的小研发,各位看官才是真正的大佬。 文章不定时更新,关注一下是我更新的最大动力。在这个经济下行的寒冬,让我们努力学习,武装自己一起度过这个互联网寒冬。书写不易,请各位务必关注一下啊!最后附上Android启动流程图。方便各位理解。


本章问题

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

Android启动流程图解

在这里插入图片描述

更多Android 知识点归整

Android 性能调优系列https://0a.fit/dNHYY

Android 车载学习指南https://0a.fit/jdVoy

Android Framework核心知识点笔记https://0a.fit/acnLL

Android 音视频学习笔记https://0a.fit/BzPVh

Jetpack全家桶(含Compose)https://0a.fit/GQJSl

Kotlin 入门到精进https://0a.fit/kdfWR

Flutter 基础到进阶实战https://0a.fit/xvcHV

Android 八大知识体系https://0a.fit/mieWJ

Android 中高级面试题锦https://0a.fit/YXwVq

后续如有新知识点,将会持续更新,尽请期待……

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

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

相关文章

开源数据备份工具 Duplicati

使用 Duplicati 腾讯云 COS,完美备份我的服务器数据。 文件备份需求 我有两台腾讯云的服务器,一台部署了博客,一台部署了一些个人项目,虽说云服务器很稳定,基本不会发生丢失数据的问题,但我个人之前经历过…

ThreeJs学习

1 基本使用 //1、创建场景 const scene new THREE.Scene() //2、创建网格模型 const geometry new THREE.BoxGeometry(100,100,100) const matrial new THREE.MeshLambertMaterial({color: #0000ff }) const mesh new THREE.Mesh(geometry,matrial) scene.add(mesh) //3、…

Redis之String类型和Hash类型的介绍和案例应用

一. String类型基础 1.类型介绍 典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下。 2. 指令Api说明 ​ 编辑3.常用Api说明 (1).StringSet:写入数据,如果数据已经存在,则覆盖;可以一次性存入1…

B2B电子商务策略[在2022年发展您的业务]

常规的电子商务商店向消费者(B2C 或企业对消费者)销售产品。B2B(企业对企业)电子商务不同于常规电子商务,因为 B2B电子商务的商业模式是让一家企业在线向另一家公司销售产品。 您可能会想:如何向企业销售比…

Windows OpenGL 图像色调

目录 一.OpenGL 图像色调调节 1.原始图片2.效果演示 二.OpenGL 图像色调调节源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 OpenGL…

Ubuntu 20.04 server永久关闭swap

方法一 编辑/etc/fstab ,sudo vim /etc/fstab,找到如下行 找到/dev/disk/by-uuid/28b306c5-92e4-4180-966d-cdedfbce3a4d /boot ext4 defaults 0 1 修改为如下图,并(/swap.img none swap sw 0 0) 将如下行注释&#…

Yolo算法检测之Anchor Boxes原理详解

刚开始yolo系列的目标检测算法,在一个网格中只能检测一个对象,但是我们在实验中发现,一个网格中很多时候存在不仅一个目标,可能存在多个目标,类似如下图所示,下面中间的网格中就存在人和车辆两个目标的中心…

嵌入式开发学习之--Git管理代码

本章主要介绍一下代码管理,在最后有常用的git指令,可以档资料收藏一下。 文章目录前言一、Github是什么二、Github的简单应用1.新建库 git init2. 添加文件 git add .2. 提交到本地仓库 git commit -m "注释"3. 创建分支 Git checkout -b [分支…

IPython工作原理

IPython工作原理 文章目录IPython是什么?IPython工作原理IPython控制台IPython内核实现一个简单的包装内核代码在IPython内核中的执行流程IPython是什么? Python最有用的功能之一就是它的交互式解释器。交互式编程允许我们非常快速地执行代码片段、测试…

[附源码]计算机毕业设计在线教育系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

详解 Intersection Observer API ( 交叉观察器 )

文章目录一、介绍二、兼容性三、内置方法/属性四、使用五、相关链接一、介绍 Intersection Observer API 提供了一种方法可以监听目标元素是否展示到视口(viewport),常见的需求场景: 图片懒加载滚动动画… 上述的需求&#xff…

基于PHP+MySQL医院门诊缴费系统的设计与实现

本医院门诊缴费系统可以说是一个综合性的医院门诊缴费系统,这它包含了挂号管理,医生信息管理,药品信息管理,患者信息管理,住院信息挂了,收费信息管理等多种功能,因而具有一定的实用性。本站是一个B/S模式系统,开发采用了目前流行的PHP技术。系统界面友好,操作简单,比较实用。 本…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态,我们的愿景是:定义移动时代最佳体验,建设智能小程序行业标准,打破孤岛,共建开源、开放、繁荣的小程序行业生态。百度…

element-ui实现一个动态布局的对话框

前言:在工作中有各种各样的对话框,最多就是填写信息这些的,一般这样的内容都是el-input输入框,el-select选择框等等之内的,这时我们就可以封装成一个组件,想要什么内容就传一个json配置,像其他组…

适合Python初学者阅读的Github开源代码

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 你想要的,这里都有! Python作为一门热门的编程语言,在Github上想要找Python项目可以说是「多如牛毛」。 无论是Star数量还是项目数量,都稳居前3名。 项…

5分钟搭建一个粗粒度「视频去重」系统

Jupyter Notebook 教程: How to Build a Video Deduplication System 「视频去重」可以在海量的视频数据中实现侵权片段或者删除掉重复冗余的内容 。随着抖音、快手、Bilibili 等视频平台的兴起和火爆,类似视频这样的非结构化数据在数量上有了极大的增长。 视频平台…

【数据可视化】第四章—— 基于pandas的数据可视化(pandas基本操作)

图形绘制的代码:链接:https://pan.baidu.com/s/1pgS60sry6XDILIhth8bAvA?pwdabcd 提取码:abcd 文章目录1. Pandas库的数据运算1.1 方法形式的运算1.2 比较运算法则1.3 排序2. 基本统计分析函数2.1 基本统计分析函数2.2 累计统计分析函数2.3 …

[附源码]计算机毕业设计JAVA学生量化考核管理系统

[附源码]计算机毕业设计JAVA学生量化考核管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

基于PHP+MySQL高校毕业设计管理系统的设计与实现

直以来我国领导人提倡以人为本的治国方案,而大学是未来人才的培养基地,如何能够更好的对高校毕业设计信息进行管理,是很多高校一直在研究的一个问题,只有更加科学的对高校毕业设计信息进行管理,才能够更加积极的培养国家的栋梁之才。 管理员部分功能 1:教师新管理…

第二十二章《记事本》第1节:记事本项目简介

记事本软件能够打开、编辑、保存各种类型的文本文档,也能在文本文档中查找特定的关键字,此外在还能设定文本文档的字体、字号以及风格等。 22.1.1记事本功能简介 记事本软件的运行结果如图22-1所示。 图22-1记事本软件界面 从图21-1可以看到:记事本程序运行开始后,在没有…