1、1 Android 系统的启动过程1.1 启动过程Android 系统完整的启动过程,可分为 Linux 系统层、Android 系统服务层、Zygote 进程模型三个阶段,从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤。1. 启动 BootLoader2. 加载系统内核3. 启动 Init 和其它重要守护进程4. 启动 Zygote 进程5. 启动 Runtime 进程,初始化 Service Manager。Service Manager 用于 binder 通讯,负责绑定服务的注册与查找。6. 启动 SystemService7. 启动 Home Lauche
2、r8. 启动其它应用程序1.1.1 BootLoaderAndroid 系统是基于 Linux 操作系统的,所以它最初的启动过程和 Linux 一样。当设备通电后首先执行 BootLoader 引导装载器,BootLoader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。1.1.2 启动 Init 和守护进程当系统内核加载完成之后,会首先启动 Init 守护进程,它是内核启动的第一个用户级进程,进程号永远是 1。当 Init 进程启动后,如( 图 7-1)它
3、还负责启动其他的一些重要守护进程,主要包括:Usbd 进程(USB Daemon):USB 连接后台进程,负责管理 USB 连接。adbd 进程(Android Debug Bridge Daemon):ADB 连接后台进程,负责管理 ADB 连接。debuggerd 进程(Debugger Daemon) :调试器后台进程,负责管理调试请求及调试过程。rild 进程 (Radio Interface Layer Daemon): 无线接口层后台进程,负责管理无线通信服务。图 1-1 Init 和其它重要守护进程的启动,图片来源: http:/www-igm.univ-mlv.fr/dr/XP
4、OSE2008/android/fonct.html1.1.3 启动 Zygote 进程如( 图 7-2)所示,当 Init 进程和一些重要的守护进程启动完成之后,将启动 Zygote 进程。Zygote 进程在系统运行期间,当接收到创建虚拟机请求时,将孵化 Dalvik VM 实例。图 1-2 Zygote 进程的启动Zygote 进程启动后,首先初始化一个 Dalvik VM 实例,然后为它加载资源与系统共享库,并开启 Socket 监听服务,当收到创建 Dalvik VM 实例请求时,会通过 COW(copy on write)技术最大程度地复用自己,生成一个新的 Dalvik VM 实
5、例。Dalvik VM 实例的创建方法基于 linux 系统的 fork 原理。Zygote 进程孵化 Dalvik VM 实例流程如( 图 7-3)所示:图 1-3 Zygote 进程孵化 Dalvik VM 实例流程1.1.4 启动 Runtime 进程和初始化 Service Manager当 Zygote 进程启动完成之后,Init 进程会启动 Runtime 进程。Runtime 进程首先初始化服务管理器(Service Manager) ,并把它注册为绑定服务( Binder services)的默认上下文管理器,负责绑定服务的注册与查找。图 1-4 Runtime 进程启动过程1
6、.1.5 启动系统服务当 Runtime 进程启动 Service Manager 后,将会启动 System Service。System Service 的启动流程如下所示:1) 如( 图 7-5)所示,Runtime 进程向 Zygote 进程发送启动系统服务(System Service)的请求,Zygote 进程收到请求后,会“孵化”出一个新的 Dalvik VM 实例并启动系统服务进程。2) 如( 图 7-6)所示,System Service 首先启动两个本地服务(由 C 或 C+编写的native 服务): Surface Flinger 和 Audio Flinger。这两个
7、本地系统服务向服务管理器注册成为 IPC 服务对象,以便在需要它们的时候很容易查找到。3) 如( 图 7-7 所示),System Service 然后启动一些 Java 层的 Android 系统管理服务,包括硬件服务和系统框架核心平台服务,并将它们注册成 IPC 服务对象。这些服务启动的代码位于 SystemServer.java 的 run 函数当中。4) 当 SystemService 加载完所有的系统服务后就意味着系统就准备好了,整个系统的进程图如( 图 7-8)。然后 SystemService 会向所有服务发送一个系统准备完毕(systemready)的广播消息。图 1-5 Sy
8、stem Server 启动过程图 1-6 Android Native System service 的启动图 1-7 Android managed services 的启动图 1-8 系统准备完毕1.1.6 启动 Launcher如( 图 7-9)所示,当 ActivityManagerService 接收到 systemready 广播后,会向 Zygoute进程发送创建 Dalvik 虚拟机实例的请求, Zygoute 进程会负责生成一个新的 Dalvik 虚拟机实例,然后 ActivityManagerService 在系统中查找具有属性( 在 AndroidManifest.xm
9、l 中声明该属性)的 Activity,并启动它,如果找到多个具有 HOME 属相的 Activity,如果用户没有将其中一个设置成默认桌面,则会让使用者选择其中一个应用作为 Launcher。图 1-9 Launcher 启动过程当启动 Launcher 之后,整个系统的进程图如( 图 7-10)所示。图 1-10 Launcher 启动后的进程图1.1.7 启动其它应用程序ActivityManagerService 同时也会使用同样的方法启动 Contact(联系人)等其它应用程序。每个应用都在自己的独立进程当中运行,如( 图 7-11)所示。图 1-11 系统进程图1.2 开机画面与动
10、画android -启动画面制做 png 图片initlogo.rlehttp:/ android -bootanim(Android 开机动画)http:/ 开机动画的执行者:frameworks/base/cmds/bootanimation默认的动画资源:frameworks/base/core/res/assets/images1.2.1 开机动画自定义 Android 的开机动画使用动画包:bootanimation.zip目标路径:/system/media/bootanimation.zipbootanimation|- desc.txt|- part0| |- boot_00.
11、png| |- boot_01.png- part1|- boot_00.png|- boot_01.pngdesc.txt 文件格式:宽 高 帧数标志符 循环次数 阶段切换间隔时间 对应目录名标志符 循环次数 阶段切换间隔时间 对应目录名1.3 参考文档经典文章(maxleng、sustzombie 和 caowenbin 有很多专题)android 启动过程再研 (最为经典, 该作者关于 Android 的其它文章: http:/ 启动过程http:/www.bangchui.org/read.php?tid=7966http:/ http:/ 核心分析 之八 Android 启动过程详解
12、http:/ 核心分析 之九-Zygote Servicehttp:/ Android 系统启动流程介绍 (附图) http:/ 源码学习之八系统启动过程http:/ 有几篇专门介绍开机过程和开机画面&动画的文章http:/ 启动过程http:/ 启动流程代码分析(eoe Android 特刊第 21 期)http:/ Android 启动过程的进一步研究 (还介绍如何将 busybox 交叉编译到手机上对内核进行调试) Android 启动过程总结-有 3 篇 http:/ Android 根文件系统启动过程( init 守护进程分析)http:/ Android 应用程序快速启动的秘诀 (
13、介绍了 Android 系统的一些基本理念)http:/ 系统进程 Zygote 启动过程的源代码分析http:/ 开机启动流程初探http:/ 详细时序图http:/ 详细时序图http:/ 的 StatusBar 分析http:/ 源码学习之六ActivityManager 框架解析http:/ Android 源码分析 - (一) Android 启动过程(介绍 platform/system/core/init/init.c 文件)http:/ 启动过程(1)(2)http:/ init 启动过程分析http:/ 启动过程(运行环境的启动)http:/ 启动过程(英文原版 )http:/