Android 开机流程分析



一、简要描述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方案:
   marvell(pxa935) :                bootROM +  OBM [l4]  + BLOB
informax(im9815) :             bootROM + barbox + U-boot
mediatek(mt6516/6517) :     bootROM +  pre-loader[l5]   + 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后台服务,启动步骤及顺序。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值