Android基础之Android系统启动

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

Linux系统启动shell

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

1. 系统上电与启动ROMapp

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

2. Bootloader引导程序socket

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

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

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

然而,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系统应用程序启动的总体流程以下图:

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

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把系统中已经启动折应用程序以快捷图标的形式展现在桌面上,这样用户就可使用系统应用程序了。

相关文章
相关标签/搜索