Android N 的开机启动流程概述
原地址:https://blog.csdn.net/h655370/article/details/77727554

图片展示了Android的五层架构,从上到下依次是:应用层,应用框架层,库层,运行时层以及Linux内核层。而Android的启动流程是自下而上的,大体上分为三个阶段:1. BootLoader引导;2. 启动Kernel;3. 启动Android。如果再细化一点,则如下图所示:

Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动。上图中1、2、3是linux启动的过程,从4开始就是android启动的过程。
下面我详细描述一下过程:
Step 1. Boot Rom 【个人理解是一种芯片】
当按开机键的时候,引导芯片开始从固化在ROM的预设代码开始执行,然后加载引导程序到RAM【随机存储器】。
Step 2. Bootloader
BootLoader,又称为引导程序,是嵌入式系统在加电后执行的第一段代码。主要有检查RAM【就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行,我们称之为启动加载模式,该过程没有用户的介入,是它正常工作的模式。】,初始化硬件参数等功能,当然它的最终目的是启动操作系统运行。
文件路径:/bootable/bootloader/legacy/
Step 3. 初始化Kernel
接着就进入C语言编写的结构无关的代码了。这个入口的函数是start_kernel函数。start_kernel 函数完成了内核的大部分初始化工作。实际上,可以将start_kernel 函数看做内核的main函数。start_kernel函数执行到最后调用了reset_init函数进行后续的初始化。 reset_init函数最主要的任务就是启动内核线程kernel_init。kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程。到init_post函数为止,内核的初始化已经基本完成。
文件路径:/kernel_imx/init/main.c
简单的说,内核加载进内存后,将首先进入内核引导阶段,在内核引导阶段的最后,调用start_kernel进入内核启动阶段,主要是完成内核的大部分初始化工作。start_kernel会最终启动用户空间的init进程。
Step 4. init进程
当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都是由init进程直接或间接fork出来的。init进程负责创建系统中最关键的几个核心daemon(守护)进程,尤其是zygote和servicemanager。前者是android启动的第一个dalvik 虚拟机,它将负责启动Java世界的进程;后者是BInder通信的基础。另外,它还提供了property service(属性服务),类似于windows系统的注册表服务。
在Android系统中,会有个init.rc脚本。init进程一启动就会读取并解析这个脚本文件,把其中的元素整理成自己的数据结构(链表)。
换句话说, init进程负责解析init.rc配置文件,开启系统守护进程。两个最重要的守护进程是zygote进程和servicemanager,zygote是Android启动的第一个Dalvik虚拟机,servicemanager是Binder通讯的基础。
文件路径: /system/core/init/init.c
/system/core/rootdir/init.rc
/system/core/init/readme.txt
Step 5. Zygote进程
当init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程。我们知道,Linux是基于C的,而Android是基于Java的(当然底层也是C)。所以这里就会fork出一个Zygote Java进程用来fork出其他的进程。在zygote开启的时候,会调用ZygoteInit.main()进行初始化。zygote虚拟机启动子进程system_server,同时也可以看出zygote中定义了一个Socket,用于接收ActivityManagerService启动应用程序的请求。
文件路径:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
Step 6. SystemServer进程
前面ZygoteInit.java里面通过startSystemServer() fork出了SystemServer进程,这个进程在整个的Android中非常重要,它和Zygote进程一样,是Android Framework层的两大重要进程。系统里面重要的服务都是在这个进程里面开启的,例如AMS, WindowsManager, PackageManagerService等等都是由这个SystemServer fork出来的。在下面SystemServer 的代码中可以看到,这些服务如何开启和具体开启了哪些服务。
文件路径:/frameworks/base/services/java/com/android/server/SystemServer.java
从SystemServer.java文件代码中可以看出,在SystemServer进程开启的时候,就会初始化ActivityManagerService 。同时,会加载本地系统的服务库,调用createSystemContext()创建系统上下文,创建ActivityThread及开启各种服务等等。
也就是说在system_server中开启了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态。
Step 7. Home Activity
上面ActivityManagerService 开启之后,会调用finishBooting() ,完成引导过程,同时发送开机广播。
文件路径:/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
之后就会启动Home程序,完成系统界面的加载与显示。
其实这一步远比上面所说的复杂,具体步骤是:
1、在systemReady状态,ActivityManagerService会与zygote的Socket通信,请求启动Home。
2、zygote收到AMS的连接请求后,执行runSelectLoopMode处理请求。
3、zygote处理请求会通过forkAndSpecialize启动新的应用进程,并最终启动Home。
Android的开机启动流程就完成了。
------------------------------------------------------------------------------------------------
总结一下整个开机启动流程:
Step1 系统加电,执行bootloader。Bootloader负责初始化软件运行所需要的最小硬件环境,最后加载内核到内存。
Step2 内核加载进内存后,将首先进入内核引导阶段,在内核引导阶段的最后,调用start_kernel进入内核启动阶段。start_kernel最终启动用户空间的init程序。
Step3 init程序负责解析init.rc配置文件,开启系统守护进程。两个最重要的守护进程是zygote进程和ServiceManager,zygote是Android启动的第一个Dalvik虚拟机,ServiceManager是Binder通讯的基础。
Step4 zygote虚拟机启动子进程system_server,在system_server中开启了核心系统服务,并将系统服务添加到ServiceManager中,然后系统进入SystemReady状态。
Step5 在SystemReady状态,ActivityManagerService与zygote中的socket通信,通过zygote启动home应用,进入系统桌面。
从Step3开始,init启动后,上层的实现。
Step1 init启动的核心Daemon服务包括Android的第一个Dalvik虚拟机zygote。
Step2 zygote定义一个socket,用于接受ActivityManagerService启动应用的请求。
Step3 zygote通过fork系统调用创建system_server进程
Step4 在system_server进程中,将会启动系统核心服务以及其他服务。
Step5 系统服务启动后会注册到ServiceManager中,用于Binder通信。
Step6 ActivityManagerService进入systemReady状态。
Step7 在systemReady状态,ActivityManagerService会与zygote的Socket通信,请求启动Home。
Step8 zygote收到AMS的连接请求后,执行runSelectLoopMode处理请求。
Step9 zygote处理请求会通过forkAndSpecialize启动新的应用进程,并最终启动Home。
Android N 的开机启动流程概述的更多相关文章
- Android的开机启动流程
1.Android的开机启动流程 Android的层次框架图,如下所示: 图片清晰地展示了Android的五层架构,从上到下依次是:应用层.应用框架层.库层.运行时层以及Linux内核层.Androi ...
- android开机启动流程说明
android开机启动流程说明 第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./ ...
- linux系统下开机启动流程
在了解开机启动流程之前,还是得先了解一些磁盘的基本知识.磁盘主要由盘片,机械手臂,磁头,主轴马达构成.盘片就是存储数据的物理单位了.然后盘片上我们可以分成扇区(sector)和柱面(cylinder) ...
- Linux 开机启动流程
Linux的开机启动流程 1.开机BIOS自检 --> 检查CPU,硬盘等硬件信息 2.MBR[Major ...
- (转)CentOS 7系统详细开机启动流程和关机流程
CentOS 7系统详细开机启动流程和关机流程 原文:http://blog.csdn.net/yuesichiu/article/details/51350654 名称 bootup - 系统启动流 ...
- Android系统之LK启动流程分析(一)
1.前言 LK是Little Kernel的缩写,在Qualcomm平台的Android系统中普遍采用LK作为bootloader,它是一个开源项目,LK是整个系统的引导部分,所以不是独立存在的,但是 ...
- Linux的开机启动流程
Linux的开机启动流程 1.开机BIOS自检 --> 检查CPU,硬盘等硬件信息 2.MBR[Major ...
- Centos 6.x开机启动流程
Centos 6.x开机启动流程 BIOS(COMS)检查 加载Bios,bios包含所有硬件信息(CPU,内存,硬盘,时钟,鼠标键盘等等) 读MBR 硬盘上第0磁道第一个扇区被称为MBR(maste ...
- Linux系统入门---开机启动流程
目录 Linux系统入门---开机启动流程 一.centos6 二.systemd管理进程 1.查看级别 三.centos7实践案例: 1.案例1:centos7系统,单用户修改root密码 案例2: ...
随机推荐
- EFI系统引导的一些零碎知识点
EFI目录 下图只有Boot和Microsoft,如果你还装其他系统可能还会有其他的文件夹,比如你还装了Ubuntu(或者manjaro),那么会有个叫Ubuntu(manjaro)的文件夹与Boot ...
- bug日记之---------js中调用另一个js中的有ajax的方法, 返回值为undefind
今天做一个OCR授权的需求, 需要开发一个OCR弹框, 让用户选择是否授权给第三方识别公司(旷世科技)保存和识别用户个人信息, 照片等. 其中用到了在一个js的方法中调用另外一个js的方法, 其中有一 ...
- Sonar 配置及部署(Linux系统)
之前在windows系统上部署了sonar代码审查,由于工作需要,需要在Linux环境再部署一套. 其实,部署的大体都是大同小异的,这里罗列下各个配置,与windows部署不同的地方会重点说一下. 数 ...
- 远程和Ubuntu服务器进行Socket通信,使用python和C#(准备篇)
服务器在阿里云上,和一般的本地配置方案不太一样,所以网上的博客里没有解决办法,本人在这里记录一下,方便大家交流. 由于数据要保存到MySQL数据库中,使用python对数据进行操作,爬到数据直接进行保 ...
- 怎么样启用红米手机5的ROOT权限
红米手机5能如何拥有了root超级权限?各位清楚,android机器有root超级权限,一旦手机拥有了root相关权限,就能够实现更强的功能,举个栗子各位公司的营销部门的妹纸,使用较多营销工具都需要在 ...
- CentOS7.5下安装、配置MySql数据库 --CentOS7.5
1.下载MySql的rpm包 [root@VM_39_157_centos -]# wget http://repo.mysql.com/mysql-community-release-el7-5.n ...
- Echart使用笔记
一. registerTheme 注册主题,用于初始化实例的时候指定. Echart官网主题下载: http://echarts.baidu.com/download-theme.html 最好的办法 ...
- Django web框架-----win10搭建django2.1.7开发环境,定义简易视图及网址
① 安装Django 使用pip命令或者pycharm setting的project Interpreter工具添加安装 检查是否安装成功,以下命令无报错即成功: 查看安装的Django版本号的两种 ...
- 用python代码模拟登录网站
方法一:直接使用已知的cookie访问 特点: 简单,但需要先在浏览器登录 具体步骤: 1.用浏览器登录,获取浏览器里的cookie字符串 先使用浏览器登录.再打开开发者工具,转到network选项卡 ...
- ArcGIS发布地图服务时报错Error: ArcGIS Server site is currently being configured by another administrative operation. Please try again later.
2017-06-06试图发布ArcGIS Server站点托管的服务时,返回以下错误消息: ERROR: Service 'test'.'MapServer' in folder '/' is cur ...