前言
本篇文章我们不会涉及到源码,只是对Android系统的启动流程做一个简单的介绍;
注意:该篇文章并不会很详细地去讲到系统启动的各个环节,只会涉及到几个重要的点而已。
以下分析的源码版本号:Android 8.0
正文
先来看下面的这张流程图,我们今天的内容就是围绕这张图来讲:
1、按Power键启动系统
当android系统开机时,系统的引导芯片代码会从预定义的地方(在ROM)开始执行,会去加载引导程序BootLoader到RAM中,然后执行BootLoader。
2、引导程序BootLoader(系统启动加载器)
引导程序是Android操作系统被拉起来之前的一个程序,它的作用就是把android系统拉起运行,也就是把linux内核启动。
3、Linux内核启动
当 Linux 内核启动后会初始化各种软硬件环境,加载驱动程序,挂载根文件系统,Linux 内核加载的准备完毕后就开始加载一些特定的程序(进程)了。第一个加载的就是 init 进程。
4、init进程启动
init进程是Linux系统中用户空间的第一个进程,进程号固定为1。内核启动后,在用户空间启动init进程,并调用init中的main()方法。
init进程的主要作用:
- 创建目录,挂载分区。
- 解析
init.rc文件。 - 启动解析的服务(
init.rc里面,有很多待启动的服务,如:zygote进程、servicemanager、surfaceflinger)。 - 守护解析的服务,守护的关键服务被杀掉后,会马上又重新起来,有些关键服务被杀掉后,不能重新起来的,就会导致手机重启。
5、init.rc配置文件的解析
·init.rc·是一个非常重要的配置文件,它是由Android初始化语言(Android Init Language)编写的脚本,系统的一些关键服务,就是通过解析它后,得到需要启动的关键服务(如zygote、servivemanager等)
6、启动zygote进程
Zygote进程是由init进程解析init.rc脚本创建的;- 首先会创建一个java虚拟机实例,然后注册JNI方法,最后通过JNI调用进入Java世界来到
ZygoteInit.main方法; - 在Java世界中,
给Zygote注册了socket用于进程间通信,预加载一些通用的类和资源(system/etc/preloaded-c]asses 文件中的类、drawable和color资源、opengl等); - 启动
system_server进程后,zygote进程继续循环等待孵化创建新的进程。
7、sysytem_server进程启动
在Android 系统中大约有 80 个系统服务,都是由SystemServer进程来创建的。作为一个应用开发者来说,需要特别熟悉的大概有这么四个: ActivityManagerService、WindowManagerService、PackageManagerService 和InputManagerService,也就是我们常说的 AMS、WMS、PMS 和IMS。
系统服务启动后都会交给ServiceManager来管理,即像AMS、WMS、PMS等服务,是在System_Server进程里的(创建的),但是却交给了ServiceManager去管理。
到这以后,android系统的几个重要的点就都启动完成了。
后续还有很多详细的知识点,比如:Launcher进程是如何被启动的?应用进程是如何被启动的?应用的首个activity是如何被启动的?等等,就暂时不在这篇文章继续讲了,会在后面的文章继续讲。
系列文章
点击直达→→ 更多系统启动流程文章
有所收获的朋友,请多多关注、点赞,谢谢大家!