简述Android系统启动流程

说明:本文内容主要参考《Android进阶解密》

一、启动电源以及系统启动

当电源按下时引导芯片代码从预定义的地方(固化在rom)开始执行,加载引导程序BootLoader到RAM,然后执行。

二、引导程序BootLoader

引导程序BootLoader是Android在操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。

三、Linux内核启动

当内核启动时、设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程。

四、init进程启动

init进程启动做了很多工作,总的来说主要做了以下三件事:

  1. 创建和挂载启动所需的文件目录
  2. 初始化和启动属性服务
  3. 解析init.rc配置文件并启动Zygote进程

五、Zygote进程启动

  1. 创建AppRutime并调用其start方法,启动Zygote进程(fork方式)
  2. 创建java虚拟机并为java虚拟机注册JNI方法
  3. 通过JNI调用ZygoteInit的main函数进入Zygote的java框架层
  4. 通过registerZygoteSocket方法创建服务端socket,并通过runSelectLoop方法等待AMS的请求来创建应用程序
  5. 启动SystemServer进程

六、SystemServer进程启动

SystemServer进程也是通过fork自身方式创建的,会复制Zygote的地址空间,所以也会得到虚拟机、socket之类的的拷贝,不过socket是用不到的,所以会调用关闭socket的方法。

SystemServer进程被创建之后,主要做了如下工作:

  1. 创建PathClassLoder,Android的一种类加载器,主要用于安装好的应用的dex文件加载
  2. 启动Binder线程池,这样就可以与其他进程进行通信
  3. 创建SystemServiceManager,用于对系统的服务进行创建、启动和生命周期管理
  4. 启动各种系统服务

ps:这里多提一点,在第1、2之后,SystemServer的main方法还没有调用,一般来说main方法是作为方法或程序的入口,由于一开始已经完成了第1、2两点,所以系统采用抛异常的方式(在抛出异常之后,通过反射方法找到类),来调用SystemServer的main方法,这样可以清除main方法之前的堆栈帧,让main方法看起来就像入口方法一样,接着进行第3、4步。

顺便再提一句,其实创建应用进程和创建SystemServer进程的方式是类似的,fork Zygote自身,关闭Zygote端的soket,创建binder进程,抛异常并通过反射启动main方法。

七、Launcher启动

被SystemServer进程启动的AMS会启动Launcher,Launcher启动后会将已安装的应用的快捷图标显示在界面上

八、最后贴一下Android系统启动流程图

Android系统启动流程图

推荐阅读更多精彩内容