系统启动流程(一)之Android系统启动流程

631 阅读3分钟

前言

本篇文章我们不会涉及到源码,只是对Android系统的启动流程做一个简单的介绍;

注意:该篇文章并不会很详细地去讲到系统启动的各个环节,只会涉及到几个重要的点而已。

以下分析的源码版本号:Android 8.0

正文

先来看下面的这张流程图,我们今天的内容就是围绕这张图来讲:

系统启动流程图.jpg

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进程的主要作用:

  1. 创建目录,挂载分区。
  2. 解析init.rc文件。
  3. 启动解析的服务(init.rc里面,有很多待启动的服务,如:zygote进程、servicemanagersurfaceflinger)。
  4. 守护解析的服务,守护的关键服务被杀掉后,会马上又重新起来,有些关键服务被杀掉后,不能重新起来的,就会导致手机重启。

5、init.rc配置文件的解析

·init.rc·是一个非常重要的配置文件,它是由Android初始化语言(Android Init Language)编写的脚本,系统的一些关键服务,就是通过解析它后,得到需要启动的关键服务(如zygoteservivemanager等)

6、启动zygote进程

  1. Zygote进程是由init进程解析init.rc脚本创建的;
  2. 首先会创建一个java虚拟机实例,然后注册JNI方法,最后通过JNI调用进入Java世界来到ZygoteInit.main方法;
  3. 在Java世界中,给Zygote注册了socket用于进程间通信,预加载一些通用的类和资源(system/etc/preloaded-c]asses 文件中的类、drawable和color资源、opengl等);
  4. 启动system_server进程后,zygote进程继续循环等待孵化创建新的进程。

7、sysytem_server进程启动

在Android 系统中大约有 80 个系统服务,都是由SystemServer进程来创建的。作为一个应用开发者来说,需要特别熟悉的大概有这么四个: ActivityManagerServiceWindowManagerServicePackageManagerServiceInputManagerService,也就是我们常说的 AMSWMSPMSIMS

系统服务启动后都会交给ServiceManager来管理,即像AMSWMSPMS等服务,是在System_Server进程里的(创建的),但是却交给了ServiceManager去管理。

到这以后,android系统的几个重要的点就都启动完成了。

后续还有很多详细的知识点,比如:Launcher进程是如何被启动的?应用进程是如何被启动的?应用的首个activity是如何被启动的?等等,就暂时不在这篇文章继续讲了,会在后面的文章继续讲。

系列文章

点击直达→→ 更多系统启动流程文章

有所收获的朋友,请多多关注、点赞,谢谢大家!