Android系统启动流程介绍

前言:本文只将最近看书了解到的知识点进行一个浓缩总结,并没有对其中流程进行详细介绍,都是些C/C++代码,流程也比较复杂,可能这篇文章对没看过源码的人会很懵逼,也不知道实现原理,后续有精力再整理吧~

一、整体流程

1.启动电源以及系统启动
当电源按下时引导芯片代码从预定义的地方(固化再ROM)开始执行。加载引导程序BootLoader到RAM中,然后执行。

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

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

4.init进程启动
init进程做的工作比较多,主要用来初始化和启动属性服务,也用来启动Zygote进程。

5.Zygote进程启动
创建Java虚拟机并为Java虚拟机注册JNI方法,创建服务器端Socket,启动SystemServer进程。

6.SystemServer进程启动
启动Binder线程池和SystemServiceManager,并且启动各种服务。

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

二、init进程总结

init进程做了很多的工作,总结来说主要做了以下三件事:
1.创建和挂载启动所需的文件目录。
2.初始化和启动属性服务。
3.解析init.rc配置文件并启动Zygote进程。

三、Zygote进程启动总结

Zygote进程启动共做了如下几件事:
1.创建AppRuntime并调用其start方法,启动Zygote进程。
2.创建Java虚拟机并为Java虚拟机注册JNI方法。
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
4.通过registerZygoteSocket方法创建服务器端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程。
5.启动SystemServer进程。

补充:
ZygoteInit的main方法主要做了四件事情:
1.创建一个Server端的Socket。
2.预加载类和资源。
3.启动SystemServer。
4.等待AMS请求创建新的应用程序进程。

四、SystemServer进程总结

SystemServer进程被创建后,主要做了如下工作:
1.启动Binder线程池,这样就可以与其他进程进行通信。
2.创建SystemServerManager,其用于对系统的服务进行创建、启动和生命周期管理。
3.启动各种系统服务。

五、Launcher启动

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

发布了88 篇原创文章 · 获赞 161 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/woshizisezise/article/details/103931645