一、简要描述Android系统启动流程
Android是一个基于Linux的开源操作系统。当前绝大多数的Android设备都是运行在ARM处理器(ARM 源自进阶精简指令集机器,源自ARM架构)上,除了英特尔的Xolo设备,Xolo来源自凌动1.6GHz x86处理器。Android嵌入设备的启动过程与桌面版本相比稍微有些差别,这篇文章将解释Android设备的启动过程。
当你按下电源开关后Android设备执行了以下步骤。
第一步:Boot ROM
由于不同处理器芯片厂商对arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,当电源按下,上电引导程序开始从预定义的地方(固化在ROM,即Boot ROM)开始执行,初始化硬件,提供下载模式等,加载通常的bootloader(如uboot)。
下面是几个arm平台的bootloader方案:
informax(im9815) : bootROM + barbox + U-boot
broadcom(bcm2157) : bootROM + boot1/boot2 + U-boot
//TODO: 增加高通的方案
第二步:引导程序bootloader
简单地说,bootLoader是由Boot ROM加载,将系统的软硬件环境带到一个合适状态,为启动、运行操作系统做好准备的一段程序。这样描述是比较抽象的,但是它的任务确实不多,终极目标就是把OS拉起来运行。bootLoader是OEM厂商或者运营商加锁和限制的地方。
Android引导程序可以在\bootable\bootloader\legacy\usbloader找到。在BootLoader运行的最后,将调用start_kernel启动linux内核。
备注:
bootloader中会检查是否进入recovery,满足下列三个条件中的任意一个系统将进入recovery模式:
第一种是kernel直接写一个寄存器(
base + APP_DATA1
)来标记下次启动将进入recovery模式;
第二种是快捷键:powerkey+downVOL;
第三中就是上层应用发送下来的回复出厂设置的命令,这个命令在restart之前kernel会往MISC分区中写command(boot-recovery)。这项工作在文件:bootable/bootloader/uboot/board/mt6516/mt6516_recovery.c完成。
recovery_check_key_trigger()
recovery_check_command_trigger()
第三步: 启动linux内核
在上一步中,当内核与体系架构相关的汇编代码执行完毕,将进入start_kernel启动内核。这部分涉及linux众多数据结构的初始化,包括内核命令行解析,内存缓冲区建立初始化,页面分配和初始化,虚拟文件系统建立,根文件系统挂载,驱动文件挂载,二进制程序文件的执行等。
1) 源码:kernel/*
2) 说明:kernel由bootloader加载
第四步: 应用初始化(init)
内核进程启动后,Init进程作为Android系统用户空间的第一个进程启动,进程号是1,所以其他的用户进程都是init进程的子孙进程,包括zygote、proerty service等framwork中的重量级角色。
第五步: Android启动--重要的后台程序zygote
zygote被誉为Android系统的基石、Android进程的孵化器,这里不再多言。zegote是由init进程解析init.rc中的配置项创建的,本身是一个Native的应用程序,接收客户端创建进程的请求,使用JNI调用linux fork函数创建进程。
第六步: 系统服务system server
system server 是zygote的嫡长子,实现了Java Service的注册及初始化操作,PackageManagerService、ActivityManagerService等主要服务都是在这里启动的。
第七步:桌面launcher
系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在 ActivityManagerService.systemReady()通知的过程中建立的,最终调用launcher()启动。
第八步: 开机自启动的第三方应用程序
系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
详情:待补充
第九步: 总结
综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而systemserver用于管理android后台服务,启动步骤及顺序。