浅析Android系统启动过程
Android
系统的启动流程是十分复杂的,但是作为应用层的开发人员来说,了解其大致流程即可。
启动流程概览
Android
系统启动流程大致可以概括为以下的几个步骤:
启动电源及系统启动
引导程序
BootLoader
启动Linux
内核启动init
进程启动Zygote
进程启动SystemServer
进程启动Launcher
启动
关键进程
在介绍启动流程之前,先来了解一下几个关键的进程及其作用:
init
进程
init
进程是Android
系统中用户空间的第一个进程,进程号为1
,是Android
系统启动流程中的一个关键进程。它被赋予很多重要的工作职责,比如创建Zygote
(孵化器)和属性服务等。init
进程是由多个源文件组成的,这些文件位于源码目录system/core/init
中。
Zygote
进程
在Android
系统中,DVM
和ART
、应用程序进程以及运行系统关键服务的SystemServer
进程都是由Zygote
进程来创建的,我们也可以将其称为孵化器。它通过fork
(复制进程)的形式来创建应用程序进程和SystemServer
进程。由于Zygote
进程在启动时会创建DVM
或ART
,因此通过fork
而创建的应用程序进程和SystemServer
进程可以在内部获得一个DVM
或ART
的实例副本。
SystemServer
进程
SystemServer
进程主要用于创建系统服务,我们熟悉的AMS
、WMS
和PMS
都是由它来创建的。
Launcher
Launcher
是一个应用程序,用来显示系统中已经安装的应用程序。Launcher
在启动过程中会请求PMS
返回系统中已安装的应用程序信息,并将这些信息封装为一个快捷图标列表显示在系统屏幕上,用户可以点击这些图标来启动相应的应用程序。
启动流程
1. 启动电源及系统启动
当电源按下时,引导芯片代码从预定义的地方(固化在ROM
中)开始执行。这里主要做的是加载引导程序BootLoader
到RAM
中,然后执行引导程序。
2. 引导程序BootLoader
启动
引导程序BootLoader
是在Android
操作系统开始运行前到一小段程序,它的作用是把系统OS
拉起来并运行。
3. Linux
内核启动
当内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。当Linux
内核完成系统设置时,它首先在系统中寻找init.rc
文件,并启动init
进程。
4. init
进程启动
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务
- 解析
init.rc
配置文件 - 启动
Zygote
进程
5. Zygote
进程启动
- 创建
AppRuntime
并调用其start
方法,启动Zygote
进程 - 创建
Java
虚拟机并为其注册JNI
方法 - 通过
JNI
调用ZygoteInit
的main
函数进入Zygote
的Java
框架层 - 通过
registerZygoteSocket
方法创建服务端Socket
,并通过runSelectLoop
方法等待AMS
的请求来创建新的应用程序进程。
6. SystemServer
进程启动
被SystemServer
进程启动的AMS会启动Launcher
,Launcher
启动后会将已安装应用的图标显示到界面上。
结合上面的流程,给出Android
系统启动流程图:
参考资料:《Android进阶解密》
关注我