尚硅谷大数据项目实战提升大神班2021网盘分项

#1

download:尚硅谷大数据项目实战提升大神班2021

Android启动流程

Android启动流程是怎样的?其实是指我们安卓系统从按下电源到显示界面的全过程。当我们给手机充电,按下电源,就会弹出相应的启动界面。等一会儿就会弹出熟悉的主界面,其实就是我们Android系统的整个启动过程。

这篇文章就是想和大家聊聊我们Android系统启动过程中发生的事情。
另外,这篇文章可以看作是一篇介绍文章,会出现很多名词,对于不了解底细的人来说可能会比较陌生。
这里只介绍它们的名称和功能。一些重要的流程后面会有相应的文章。
不需要知道的,在这里可能就被刷到一边了。请理解。

电脑是怎么启动的?
其实组装过电脑的人应该知道,我们的电脑其实是由各种各样的硬件组成的。最重要的是CPU,是用来计算的。
我们的鼠标和键盘是用来输入的。无论是2K分辨率还是1080P分辨率的显示器,都是用来显示图形界面和音频的。当然还有一个东西叫主板。我们所有的硬件设备最终都会连接到主板上,无论是以线缆的形式,还是像CPU和内存一样直接插在主板上。当我们按下电源的启动按钮时,我们会先执行主板上的启动程序。他将首先执行一个叫做Bios的程序。如果你的电脑系统坏了,我们必须在Bios中重新设置启动盘的加载路径。一般是预装系统的u盘,然后给我们的电脑重装系统。

Android启动流程
1.手机上的BIOS:引导加载程序
以上,电脑启动过程。为什么要谈电脑的启动呢?因为安卓的创业跟它差不多。手机所有的硬件也是嵌入在手机主板里的,只是手机比电脑机箱更轻更薄。
当我们的手机关机开机时,我们要做的第一件事就是按下电源键。按下电源键,其实就是给我们的手机主板重新上电。开机后,我们的主板会启动一个BootLoader程序,在已经设置好的位置加载我们的手机系统。这个BootLoader相当于我们电脑的Bios。
10年前,Android刚刚兴起的时候,相比ios封闭的生态系统。安卓系统的部分用户非常喜欢做的一件事就是刷机。而且各大厂商还会为手机制作相应的Rom包,供所有玩家使用。现在那个时候MIUI崛起了。那时候小米1999年还没做第一款手机,只做Rom系统。
当然,不仅仅是小米一家,百度的系统,阿里的系统,国外CM团队做的系统都会是下一个系统。记得我高中的时候有一个俗称谷歌二王子的三星i9020,是Android2.3,后来谷歌给二王子推出了自己的Android4.0的Rom包。当时全球最早使用Android4.0的用户是拥有i9020手机的用户。
到时候下载Rom包放在SD卡下面。进入BootLoader界面后,双击清除所有设置,然后选择sdcard上的安装包,等待安装完成后再重启。可以用最新的Android4.0 .所以这个BootLoader相当于电脑Bios。
但是现在的手机没有那么多可玩性,不能更换主板的cpu,也没有相应的系统让用户刷手机。

2.Android的第一个进程:空闲
Android是基于Linux内核的手机操作系统。所以BootLoader启动Android系统后,它启动的第一个进程和Linux一样,是空闲进程。而这个过程的PID = 0。
基于Linux系统,很多机制都和Linux类似,比如内核空间,用户空间。其实这是一个比较抽象的概念。我们可以用后台系统类比,方便理解。
假设你是后台经理。您的权限可能只是查看数据。但是您无权查看新帐户或删除数据。如果要查,需要获得更高的权限,也就是俗称的提权。
当我们的操作系统运行时,为了系统的稳定性。将整个内存区域分成两部分,一部分是系统运行的内存区域。如果你想操作这个区域或者运行一些函数来修改这个内存上的数据,你必须有极高的权限。这个内存区域也是内核空间。另一个区域是运行一些常用程序,这个区域叫做用户空间。反之,操作内核空间的权限称为内核状态,操作用户空间的权限称为用户状态。
为什么分成这两块?原因是为了安全和稳定。如果,你是一个系统开发人员,当你的系统运行时,客户随机点开一个App。这个App是一个恶意程序,修改你系统的一些内存数据,导致你的系统崩溃崩溃。久而久之,你的操作系统就会失去市场。这就是为什么Linux把内存分为用户空间和内核空间。
空闲的主要功能

初始化进程和内存管理,并加载硬件驱动程序。
创建一个pid=1的init进程,这个init进程是第一个用户空间进程。
创建一个pid=2的kthreadd进程,该进程被抛入内核空间。
空闲进程本身在内核空间中运行。

2.内核相关进程:kthreadd
对于kthreadd进程,我们其实不需要知道太多。毕竟正常开发不需要关注内核相关代码。我们只需要知道两件事,

kthread = 2的进程pid=2
内核的相关资源就是通过这个过程创建的。
这个进程及其子进程都在内核空间中运行。

3.一切的开始:初始化过程
Init,我们从它的名字就知道它的重要性。这个进程也是由空闲进程创建的,它的pid=1。它是属于用户空间的第一个进程。
init的主要作用

这个过程的主要作用是分叉出合子过程。

4.最重要的过程:受精卵
合子英文翻译成受精卵,我们平时启动的所有流程都是从这个流程复制过来的。复制是指这个进程会复制两个完全相同的进程,其中一个进程继续是合子进程,另一个进程在执行完相关代码后成为你想要启动的进程。但是在fork离开其他进程之前,他要先做一些初始化,让fork出来的进程跟他一样带着这些初始化的函数,而不是再初始化一次。
合子的主要功能

创建虚拟机
注册JNI
启动ZygoteServer(实际上是Socket,用于跨进程通信)
预加载资源,然后复制的进程已经加载了资源。
启动系统服务器
等等,一旦AMS通知了创建过程,这个过程就会被拆分。

合子其他
这里再多说一点。Zygote进程本身创建了JVM虚拟机并注册了JNI,这意味着我们的代码可以真正从这里开始执行Java代码。以前都是C++代码。
此外,在fork过程之前,已经创建并预加载了虚拟机注册JNI。所以我们的fork进程从诞生开始就自带了虚拟机,注册了JNI代码,加载了相应的资源。

5.勤劳的工具人:系统服务器
为什么说很累?因为除了上面提到的进程,其他所有进程都是由SystemServer创建的。其中AMS、WMS、PMS等重要流程都是Zygote在他的带领下创造的。

6.黑暗中有一个村庄:发射器
你有没有想过,我们每天滑动手机的时候,界面是什么样的?其实就是一个App就像我们开发的手机程序一样。只不过是安卓系统自动启动的。而且,它可以显示我们所有安装的应用,仅此而已。
当我们点击Launcher上的App图标时,它会与AMS进行通信,AMS再与Zygote进行通信。Zygote process fork创建了一个新的流程并执行了相关代码,这样我们写的App就创建好了。

结局
至此,Android的启动过程基本完成。后面会按照相应的重要性来解释。此外,每章末尾还会附上几个问题。毕竟看了一遍,只是简单的阅读。只有真正的思考才能真正记住。