Android 安卓启动流程

Posted bobuddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 安卓启动流程相关的知识,希望对你有一定的参考价值。

安卓启动名词缩写笔记:
QRD(QualcommReferenceDesign):高通参考设计
AOP(Alwaysonprocessor):实时响应处理器
SP(SecureProcessor):安全处理器
AVB(androidVerifiedBoot):安卓开机检验启动
SHRM(SystemHardwareResourceManager):系统硬件资源管理器
PBL(PrimaryBootLoader):主引导加载程序
XBL(eXtensiblebootloader/Secondarybootloader):扩展引导加载程序
ABL(Applicationbootloader):应用引导程序。主要应用于android。

 

步骤1、系统启动
这一段是在ROM里面执行的,使用的是汇编语言。

启动ROM代码从预先定义的位置开始执行。它将引导加载程序加载到RAM中并开始执行。

引导ROM代码将使用映射到ASIC上的一些物理球的系统寄存器来检测引导媒体。这是为了确定在何处找到引导加载程序的第一阶段。

一旦引导媒体序列建立,引导ROM将尝试加载第一阶段的引导加载程序到内部RAM。一旦引导加载程序就位,引导ROM代码将执行跳转并继续在引导加载程序中执行。

 

步骤2、引导装载程序
Bootloader的执行分为两个阶段,第一个阶段是检测外部RAM,第二个阶段是帮助加载程序,在第二个阶段Bootloader设置网络、内存等需要运行内核的时候,Bootloader可以为内核提供特定目的的配置参数或输入。

Android引导加载程序可以在以下位置发现:

<AndroidSource>\\bootable\\bootloader\\legacy\\usbloader
遗留加载程序包含两个重要的文件,即init.S和main.c

init.S:初始化堆栈,将BSS段归零,调用main.c中的_main()方法。
main.c:初始化硬件(时钟、板、键盘、控制台),创建Linux标记。
在嵌入式Linux中,uBoot通常是选择的引导加载程序。设备制造商通常使用他们自己专有的引导加载程序。

1、第一个引导加载程序阶段将检测并设置外部RAM。

2、一旦外部RAM可用,系统准备好运行一些更重要的东西,第一阶段将加载主引导加载程序,并将其放在外部RAM中。

3、引导加载程序的第二阶段是将要运行的第一个主程序。这可能包含用于设置文件系统、额外内存、网络支持和其他内容的代码。在移动电话上,它还可能负责为调制解调器CPU加载代码,并设置低级内存保护和安全选项。

4、一旦引导加载程序完成了任何特殊任务,它就会寻找要引导的Linux内核。它将从引导媒体(或其他取决于系统配置的源)加载此文件,并将其放在RAM中。它还将在内存中放置一些引导参数,以便内核在启动时读取。

5、完成引导加载程序后,它将执行跳转到Linux内核,通常是一些解压缩例程,内核承担系统责任。

 

3、Linux内核
Linux内核在Android上启动的方式与在其他系统上类似。它将设置系统运行所需的一切。初始化中断控制器,设置内存保护,缓存和调度。

一旦内存管理单元和缓存被初始化,系统将能够使用虚拟内存并启动用户空间进程。 内核将在根文件系统中查找init进程(在Android开源树的system/core/init下找到),并将其作为初始用户空间进程启动。

 

4、init进程
初始化它的第一个进程,我们可以说它是所有进程的根进程或祖母进程,init fork出来其它进程。 init进程有两个职责: 1、挂载目录如/sys、/dev、/proc 2、运行init.rc脚本。

init进程可以在以下位置找到:

<android source>/system/core/init
init.rc文件可以在源代码树中找到:

<android source>/system/core/rootdir/init.rc
这是一个描述系统服务、文件系统和其他需要设置的参数的脚本。init.rc脚本被放置在Android开源项目的system/core/rootdir中。

 

5、Zygote和Dalvik


在Java中,我们知道单独的虚拟机(VMs)实例会在内存中为单独的应用程序弹出,在Android应用程序应该尽快启动的情况下,如果Android os为每个应用程序启动不同的Dalvik VM实例,那么它会消耗大量的内存和时间。所以,为了解决这个问题,Android操作系统被命名为"Zygote"。

Zygote支持跨Dalvik虚拟机的共享代码,更低的内存占用和最小的启动时间。

Zygote是一个VM进程,它在系统启动时启动,我们在前面的步骤中已经知道了。

合子预加载并初始化核心库类。

通常核心类是只读的,是Android SDK或核心框架的一部分。在Java VM中,每个实例都有自己的核心库类文件和堆对象的副本。

简而言之,Zygote是由init进程启动的,基本上只是开始执行并初始化Dalvik VM。

 

6、系统服务
系统服务是在系统中运行的第一个java组件。它将启动所有的Android服务,如电话管理器和蓝牙。

当前,每个服务的启动都直接写入系统服务的run方法中。

可以在开放源码项目的文件框架中找到系统服务:

/base/services/java/com/android/server/SystemServer.java
核心服务:

1.启动电源管理器 2.创建活动管理器 3.开始电话注册 4.开始包管理器 5.将活动管理器服务设置为系统流程 6.开始上下文管理器 7.启动系统上下文提供程序 8.开始电池服务 9.开始报警管理 10.开始传感器服务 11.开始窗口管理器 12.开始蓝牙服务 13.开始安装服务

其他服务:

1.启动状态栏服务 2.开始硬件服务 3.开始NetStat服务 4.开始连接服务 5.开始通知经理 6.开始DeviceStorageMonitor服务 7.开始位置管理器 8.开始搜索服务 9.开始剪贴板服务 10.开始签入服务 11.开始壁纸服务 12.开始音频服务 13.开始HeadsetObserver 14.开始AdbSettingsObserver

 

7、启动完成
一旦系统服务在内存中启动并运行,Android就完成了启动过程,此时“ACTION_BOOT_COMPLETED”标准的广播动作就会触发。

安卓启动流程:
PBL(PrimaryBootLoader)→
XBL(eXtensibleBootLoader/Secondarybootloader)→
ABL(Applicationbootloader)→
Kernel→
Android
PBL:主引导加载程序,固化在ROM上;(QCSOC的启动固件,负责上电后的第一步操作;空板上电自动进9008)QualCommbootloader采用UEFI(UniversalExtensibleFirmwareInterface):XBL、ABLXBL(ExtensibleBootLoader/Secondarybootloader):扩展引导加载程序(有时加载会
被细分为SBL1、SBL2、SBL3);
XBL中会编译firehose_programmer(firehose_programmer.c),分区表,用于provision
,下载和第一次启动;ABL(Applicationbootloader):应用引导程序,引导android启动,加载
Linux内核(linuxloader.c,内核加载器);
 

以上是关于Android 安卓启动流程的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶修炼:安卓启动流程之init

Android framework重要服务之InputManagerService的启动流程

Android系统揭秘-Activity启动流程(上)

安卓启动流程(一) - rc文件初步解析

CVE-2020-0108 安卓前台服务特权提升漏洞

CVE-2020-0108 安卓前台服务特权提升漏洞