简述Android系统启动流程
2021-01-10 本文已影响0人
会思考的鸭子
说明:本文内容主要参考《Android进阶解密》
一、启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化在rom)开始执行,加载引导程序BootLoader到RAM,然后执行。
二、引导程序BootLoader
引导程序BootLoader是Android在操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。
三、Linux内核启动
当内核启动时、设置缓存、被保护存储器、计划列表、加载驱动。当内核完成系统设置时,它首先在系统文件中寻找init.rc文件,并启动init进程。
四、init进程启动
init进程启动做了很多工作,总的来说主要做了以下三件事:
- 创建和挂载启动所需的文件目录
- 初始化和启动属性服务
- 解析init.rc配置文件并启动Zygote进程
五、Zygote进程启动
- 创建AppRutime并调用其start方法,启动Zygote进程(fork方式)
- 创建java虚拟机并为java虚拟机注册JNI方法
- 通过JNI调用ZygoteInit的main函数进入Zygote的java框架层
- 通过registerZygoteSocket方法创建服务端socket,并通过runSelectLoop方法等待AMS的请求来创建应用程序
- 启动SystemServer进程
六、SystemServer进程启动
SystemServer进程也是通过fork自身方式创建的,会复制Zygote的地址空间,所以也会得到虚拟机、socket之类的的拷贝,不过socket是用不到的,所以会调用关闭socket的方法。
SystemServer进程被创建之后,主要做了如下工作:
- 创建PathClassLoder,Android的一种类加载器,主要用于安装好的应用的dex文件加载
- 启动Binder线程池,这样就可以与其他进程进行通信
- 创建SystemServiceManager,用于对系统的服务进行创建、启动和生命周期管理
- 启动各种系统服务
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启动后会将已安装的应用的快捷图标显示在界面上