Android系统启动流程
2013-04-14 12:18 wiikii# 阅读(1032) 评论(0) 编辑 收藏 举报资料来源:《Android开发实战体验》
Android系统完整启动过程,从系统层次解度可分为Linux系统层,Android系统服务层,Zygote进程模型三个阶段。从开机到启动Home Launcher完成,具体细节可分为7个部分:启动BootLoader,加载系统内核,启动守护进程Init,启Zygote进程,启动Runtime进程,启动本地服务和启动Home Launcher。
- 启动BootLoader
Android系统是基于Linux操作系统的,所以它最初的启动过程跟Linux一样。当设备通电时,首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一小段程序。通过这段小程序初始化硬件设置,建立内存空间映射图,从而将系统的软硬件环境导入到合适的状态,以使为最终调用操作系统内核准备好正确的运行环境。
- 加载系统内核
当BootLoader装载内核映像到代码段时,分别放置实时模式代码(程序内部地址都指向的是实际内存地址)和保护模式代码(程序内部地址需要经过操作系统的内存地址转换单元转化为具体地址)到不同的位置,然后进入实模式代码执行,实模式代码执行完后转入保护模式代码。
- 启动Init进程
当系统内核加载完后,会首先启支Init守护进程,它是内核启动的第一个用户级进程,其进程号总是1,Init进程启动完成后,还负责启动其它的一些重要守护进程,包括:usbd(USB Daemon)——USB连接后台进程,负责管理USB连接;adbd(Android Debug Bridge Daemon)——ADB连接后台进程,负责管理ADB连接;debugger(Debugger Daemon)——调试器后台进程,负责管理调试请求与调试过程;rild(Radio Interface Layer Daemon)——无线接口层后台进程,负责管理无线通信服务。
- 启动Zygote进程
Zygote进程启动后,会初始化一个Dalvik VM实例,然后为它加载资源与系统共享库,并开启Socket监听服务,当收到Dalvik VM实例请求时,会通过COW(copy on write)技术最大程度的得用自己,生成一个新的Dalvik VM实例。Dalvik VM创建方法基于Linux的Fork原理。Zygote进程孵化Dalvik VM实例流程如下:
- 启动Runtime进程
在Zygote进程启动完成后,Init进程会启动Runtime进程。Runtime进程首先初始化服务管理器(Service Manager),并把它注册为绑定服务(Binder Service)的默认上下文管理器,负责绑定服务的注册与查找。然后Runtime进程会向Zygote进程发送启动系统服务(System Service)的请求,Zygote进程在收到请求后,会“孵化”出一个新的Davlik VM实例并启动系统服务进程。Runtime进程的启动过程如下:
- 启动本地服务
System Service会首先启动两个本地服务(由C或C++编写的Native服务):Surface Flinger和Audio Flinger,这两个本地服务向服务管理器注册成为IPC服务对象,以便在需要它们的时候很容易查找到。然后System Service会启动一些Android系统管理服务,包括硬件服务和系统框架核心平台服务,并注册它们成为IPC服务对象。
- 启动Home Launcher
当System Service加载完所有的系统服务后就意味着系统准备好了,它会向所有服务发送一个系统准备完毕(systemready)广播。当Activity Manager Service (由System Service启动)接收到systemready广播后,会向Zygote进程发送创建Dalvik VM实例的请求,Zygote进程会负责生成一个新的Dalvik虚拟机实例,然后ActivityManagerService在系统中查找具有<category android:name="android.intent.category.HOME"/>属性的Activity,并启动它。
至此,整个系统启动完毕。