Android系统的启动过程

当我们拿到一台Android的智能手机,从打开开关,到我们可以使用其中的app时,这个启动过程到底是怎么样的?


系统上电

当给Android系统上电,CPU复位之后,程序指针会指向启动地址,从该地址读取启动程序的可执行代码直接运行,或者将可执行代码与数据载入CPU内置的RAM中再运行。

CPU复位,其实就是在电源接通的瞬间,CPU内的寄存器和各引脚均会被置为初始状态,并将程序指针指向引导程序的位置。

这一段代码,放在PC中,叫做BIOS,而在Android等嵌入式系统中就叫做Bootloader。

Bootloader引导程序

通过Bootloader引导程序,可以初始化硬件设备,建立内存空间映射图,为操作系统内核准备好环境,完成整个系统的加载启动任务。    

    

Bootloader是支持交互式操作的,一般刷机中会用到的Fastboot模式,就是在Bootloader启动之后,根据用户输入的指令(在手机上用音量键,Home健等操作),停留在当前状态。

而正常情况下,Bootloader程序执行完成之后,就会开始加载Android操作系统。

加载内核

我们知道Android操作系统的内核其实就是Linux内核。当Bootlader引导程序启动之后,就会进入Linux的内核引导阶段。

引导阶段会初始化内核和设备驱动,接着启动内核,挂载文件系统,最后启动用户空间进程。

Init程序

Init程序是用户空间的第一个进程。它负责解析一个叫做init.rc的配置文件,启动Android系统底层运行的一些服务进程。

init.rc文件定义了不同的Action和Service,其格式如下:

Action

on boot
     ...
     class_start core
     class_start main

Action是以关键字on来定义的,紧接着的boot是一个触发条件,如上面的action表明当Android启动(boot)的时候,要做些什么事情。

Service

service servicemanager /system/bin/servicemanager #声明一个service,而servicemanager则是其名字
     class core                          #optioin, 该service属于core类
     user system                         $option,该service属于System用户
     group System

Service是以关键字servie来定义的,紧跟着的是其名字和其启动的文件,如上面,会执行/system/bin/serviemanager文件,并将其命名为 servicemanager。

如上,Action boot之后的class_start core等,是Init程序在开机时会启动的服务。

这些服务包括ueventd, servicemanager, void, zygote, installd, ril-daemon等,我们一般称它们为守护进程。

Init程序同时也会开启属性服务,存放一些关于Android系统的全局系统设置信息。

最后,当所有的Action和Service都启动完成之后,Init程序就会进入一个无限的循环,监听系统中发生的事件,对一些事件进行处理,比如重启某些服务等。

ServiceManager

ServiceManager是Init程序启动的守护进程之一,它是Android中Binder通信的基础。

ServiceManager提供了注册,检索服务的功能。在zygote子进程system_server(在下面)启动的每一项服务都会将其注册到ServiceManager中,由ServiceManager来统一进行管理。值得注意的是,ServiceManager本身也是一个Service,所以它也会将自己注册到自身上面。

而ServiceManager启动的过程做了三件事:

1)打开Binder设备,把Binder设备映射到内核空间中,由于内核空间是所有进程共享的区域,所以借助这块区域,可以实现不同进程间资源的共享,从而达到进程间通信。

2)ServiceManager本身会变成一个ContextManager,即上面所说的注册到自己身上,负责各种Service的上下文管理。

3)最终ServiceManager也是会进入一个无限循环。

Zygote

Zygote也是由Init程序启动的其中一个服务,但它却是Android世界中的第一个Dalvik虚拟机。在之后,所有的Dalvik虚拟机都是由Zygote孵化出来的,这是因为Android中每一个应用都有着自己的进程,而每一个进程中都着一个Dalvik虚拟机,如果每起一个应用就创建一个虚拟机,效率太低,而通过复制Zygote,不仅可以提高创建的速度,还能够共享系统和框架的资源,可以大幅度提高应用程序启动的速度。

Zygote启动之后

1)首先会创建一个socket,等待某个客户端的请求。

2)接着创建其第一个子进程,叫做system_server。system_server会开启Android系统的Native Service和Java Service。

其中Native Service就是那些利用JNI实现的共享库,而Java Service则是通过Java语言实现的ActivitManagerService等,都是在这个阶段由system_server启动并注册到一个叫ServiceManager的服务进程中。

ActivityManagerService启动之后,会进入到一个叫System Ready的状态,而在其达到System Ready的状态之前呢,就会启动一个叫做Launcher的应用,而这个Launcher就是Android系统启动成功之后见到的Home桌面了。

而在SystemReady的状态,其会跟Zygote启动之初的Socket进行通信,告诉zygote,一切已经就绪。

3)Zygote知道已经启动成功,就开始进入一个无限的循环,在Socket上等待请求的到来。

至此,从手机上电的那一刻起,到加载内核,到最后显示Home桌面的整个过程就结束了,而这篇文章想介绍的也差不多了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值