Android之系统启动的操作流程
白羽 2018-06-07 来源 :网络 阅读 1874 评论 0

摘要:Android系统的启动操作流程由Linux系统启动与Android应用系统启动两个阶段组成。





Android系统的启动操作流程由Linux系统启动与Android应用系统启动两个阶段组成。


Linux系统启动

Android操作系统启动次序分别为系统上电,Bootloader引导,Linux内核启动,init初始化系统服务等。

1. 系统上电与启动ROM

如同传统的PC设备,Android系统的CPU上电复位后,将程序指针指向复位时的零地址(启动地址),从该地址读取启动程序的可执行代码直接运行,或者将可执行代码与数据载入CPU内置的RAM中再运行。所谓的启动ROM内固化有启动代码,其起始地址就设在CPU复位后的启动地址(零地址)处,CPU复位后指针指向该处,开始执行代码。


2. Bootloader引导程序

Bootloader被烧录进入android系统后,系统上电复位,Bootloader被载入,在操作系统内核运行之前得到执行。通过这段小启动程序,我们可以初始化硬件设备,建立内存空间映射图,从而将系统的软,硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好环境,完成整个系统的加载启动任务。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Bootloader引导程序。Bootloader本质作用相当于电脑的BIOS,在手机进入操作系统之前初始化软硬件环境,最终让手机成功启动。

Android是一个开源系统,如不加修改,必将造成同质化,这是OEM/ODM厂商们必须考虑的问题。目前,各大厂商为了获得独有的系统价值,系统的稳定运行,用户信息安全等,最常用的方式是对Bootloader加密(加锁)。加密的Bootloader仅能引导原厂提供的固件(操作系统内核与主要应用软件),对任何第三方固件都不予识别。之前,除了发烧友,人们一般不会更多关注Bootloader的加锁问题。但随着Android的普及与人们对个性化的极致追求,越来越多的用户开始关注是否能够解锁Bootloader,进而加载其他固件。

但是,当每一台Android手机都能随意刷写固件时,不但存在潜在的系统稳定性与系统安全问题,而且对于厂商而言,更加担心其生产的手机在某种程度上沦为一种硬件平台,自身蕴含于软件中的所谓“灵魂”将不复存在。此外,OEM厂商在新机型上新添加了很多功能,由于Bootloader的解锁,用户可以通过更换固件,将新固件直接用于老型号机器,使厂商蒙受损失,因此,OEM厂商通常对Bootloader进行加密或加锁处理,限制用户自行更改。

然而,Android的开源本质体现的是一种共享与尊重。“Bootloader”的锁与不锁在技术上并不是难题,在确保安全的前提下,更应首先考虑用户的选择:给需要的用户解锁,为不需要的用户保留!


3. Linux内核启动

Linux内核有两种映像:一种是非压缩内核,称为Image,另一种是压缩内核,称为zImage。根据内核映像的不同,Linux内核的启动在开始阶段也有所不同。zImage是Image经过压缩形成的,所以它的大小比Image小。但是在使用zImage之前,必须在它的开头加上解压缩的代码,zImage解压缩之后才能执行,因此它的执行速度比Image要慢。考虑到嵌入式系统的存储空间一般比较小,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。

Bootloader启动后,系统启动的控制权移交给Kernel。Kernel启动主要包括:初始化内核,初始化设备驱动,启动内核,挂载文件系统和启动用户空间进程。


4. Init初始化系统服务

init是所有Linux系统进程的父进程,其进程ID为1,它负责系统的初始化和启动,创建并运行系统中的关键进程,比如shell,lgoin等。init也理所当然地成为Android系统中的第一个进程,被赋予更多重要的工作职责,比如创建zygote进程,提供一个属性服务(property service)来管理系统属性。


Android应用系统启动

Linux内核启动完毕之后,init进程将开始启动Android应用系统。init进程创建Android系统中的关键进程,如Android系统本地服务(Native Service),Zygote进程,其中Zygote进程和其子进程Android系统服务(System Server)是Andorid系统的基础。在相继启动Zygote进程和System Server进程成功后,系统将启动主页面(home),在主页面启动成功之后,Android应用系统启动才正式完成。Android系统应用程序启动的整体流程如下图:

 Android之系统启动的操作流程

下面详细说明每一步启动流程:

1. 启动Android系统本地服务

Android系统本地服务(Native Service)由init启动的,属于核心服务,采用C++语言编写,在运行时库层上实现。Native Service是Android系统内核层与Android应用层通信的重要管道,通过socket向应用层提供特定的服务。

Native Service启动项定义在 init.rc 中,提供的本地服务主要有:


Console,shell console服务


Servicemanager,Binder服务管理器,管理所有Android系统服务。


Vold(Volume Daemon),支持存储外设的热插拔。

 

Mountd(设备安装Daemon),负责设备安装及状态通知。

 

Debuggerd(Debug Daemon),处理调试进程的请求。

 

Rild(radio interface layer),无线接口层。

 

Zygote,启动Dalvik并负责进程孵化服务。


Mediaserver,负责多媒体播放相关的功能,包括音视频解码,显示输出等。

 

2. 启动Zygote

Zygote由init进程根据 init.rc 文件中的配置项创建。Zygote最初的名字叫“app_process”,但在运行过程中app_process通过Linux下的pctrl系统调用将自己的名字变成了Zygote。

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器。Zygote负责虚拟机的初始化,预置类库的加载和初始化等操作。每当系统要求执行一个Android应用程序时,Zygote就会创建一个子进程来执行该应用程序。其优点在于,当系统需要一个新的虚拟机实例时,Zygote通过自身复制的方式,可以快速地为系统提供虚拟机实例。另外,对于一些只读的系统库,所有虚拟机实例都和Zygote共享同一块内存区域,有助于节省内存开销。Zygote进程是整个Android的孵化器进程,所有的Activity进程均是通过它来生成的。


3. 启动Android系统服务

Android系统服务(System Server)作为Zygote的第一个子进程,也是由Zygote进程孵化出来的。它是Android框架层的核心,主要负责Android系统初始化并启动其他服务。Android的其他服务都由Systemserver启动并运行在该进程空间。在Zygote进程启动过程中通过指定参数“--start-system-server”来实现SystemServer的启动。


4. 启动Android系统主界面

在完成Android系统应用程序启动后,还需要有一个主页面(Home)应用程序来负责把它们在桌面上展示出来。在Android系统中,Home应用程序是Launcher,下面将详细分析Launcher应用程序的启动过程。


Launcher由ActivityManagerService启动,而ActivityManagerService是在开机时由SystemServer启动,SystemServer首先需要启动PackageManagerService,由它来负责启动系统的应用程序。在系统中的应用程序启动完成后,SystemServer接下来通过ActivityManagerService来启动Launcher。Launcher在启动的时候便会通过PackageManagerService把系统中已经启动折应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用系统应用程序了。

 


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程