在接下来的几篇博客中我会主要给大家讲一下android系统的启动过程,之前也断断续续讲过<code>packagemangerservice</code>和home程序的启动过程,但是没有系统的讲过,接下来将系统性地介绍整个系统的启动过程。包括主要的四大步骤:
init进程服务 native服务启动 systemserver,android服务启动 home应用程序启动
总体的启动流程如下图所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIzUjN1UzMxkTM2ATMxYTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)
接下来的《android启动过程详解》系列将以本图为框架进行介绍,重点包括四大步骤,以及各个步骤中的重点组件:<code>zygyte</code>,<code>servicemanager</code>,<code>dalvik vm</code>, <code>systemserver</code>,<code>activitymanagerservice</code>,<code>packagemanagerservice</code>等等。
本文首先对整体的启动过程做一个简单的梳理。
init是一个由内核启动的用户级进程,在linux内核启动完成后就会启动init进程,再由init进程来完成接下来加载过程。可以说init进程的启动才标志着android空间的启动。init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:
(1) zygoteservice (2) servicemanager ……
这里的service并不是android应用层的service概念,而是为整个系统服务的基础服务,其实现也是在native层完成的。init.rc是android规定的初始化脚本,其包括了四种类型:
service commands options actions
而init程序正是通过读取init.rc的文件来读取相关配置:
读取init.rc的相关服务,添加到service_list中
通过service_start,建立service进程
在创建好zygoteservice之后,它就会fork出一个进的进程来运行systemserver,而systemserver最为重要的一个工作就是启动各个系统级的android应用服务,包括packagemanagerservice, activitymanagerservice,windowmanagerservice等等。systemserver会开启一个serverthread,然后在这个线程中启动上述各个service,并通过addservice添加对应的服务。