深入研究源码:Android10.0系统启动流程(一)

4,136 阅读4分钟

前言

针对系统启动流程的专题研究也进行了差不多一周了,虽然进度缓慢,但也算是有一些阅读源码的心得,以及对源码的一点理解

由于系统启动流程涉及的源码相对较多,所以决定分几篇文章来写,本篇主要是对启动流程进行一个简单的概述,以及谈一下我个人的读源码的方法

福利活动

Android研习社机械工业出版社联合发起的赠书活动正在进行中,欢迎大家点击链接参与

正文

启动流程概述

这里说的启动流程是指Android系统的启动流程

让我们来回想一下,我们是如何“启动”一个全新未开封的Android手机的:

  1. 按电源键
  2. 进入开机动画
  3. 经过漫长的等待(大概几分钟?哈哈)
  4. 开机动画结束
  5. 正式开机,进入设置画面
  6. 进入系统桌面(Launcher)

是不是感觉步骤还是挺多的?其实咱们主要做的还是只负责按电源键就OK了,咱们要分析的,就是从1-5这几步,系统都做了哪些事情,我简单画了个图(ps:这也叫图?):

  1. loader

刷过机的朋友大概都知道,Android可以通过某个组合按键进入BootLoader页面,这个也就是上图中的最底层,在Android系统,甚至于它的内核还未加载时的一个引导程序,主要负责对kenel进行解压和初始化的工作

  1. idle进程

kernel中的idle进程是0号进程,由内核中启动,并始终执行在内核态,由内核态的idle进程开启我们常提的1号进程,init(对应源码,system/core/init/init.cpp

  1. init进程

这个进程也是邓老师的书中所提到的,“天字号”进程,但是经过我们上面的分析,其实它并不是开天辟地的始祖

init.cpp中做的事情其实不只是开启init进程,这个后面分析具体源码时再做详细介绍

init进程负责的事情主要是对init.rc这个系统启动脚本文件进行解析(loadBootScripts()),经过对ro.zygote对应的具体的架构的脚本文件进行解析,进行到第四步

  1. zygote进程

zygote进程的入口我找了好久,其实zygote.rc中的脚本已经说的很清楚了

由此我们找到对应的源码位置在framework/base/cmds/app_process/app_main

app_process中把app_main运行的进程设置process_name为zygote,这也就是我们在执行ps指令时看到的zygote进程了,此时zygote还处于native层,通过jni调用zygoteInit.java中的main函数,正式进入Java世界,zygoteInit中又开启了SystemServer,进入第四步

  1. SystemServer

这部分源码还没阅读到,这里只是先简单提一下...

  1. Launcher

Launcher已经是我们具体的App应用了,这个是由zygote进程fork出来的进程

到此,经过这么多步骤,系统终于启动起来,并且可以跟用户交互了

如何阅读源码

正所谓,授人以鱼,不如受人以渔,所以我还是简单提一下,我是如何去阅读源码的

这个问题我跟朋友探讨过,也跟前辈请教过,目前我是采用这样的方式

比如针对系统启动流程的相关源码,如果我对这一块完全陌生,没有任何概念,那我需要先去阅读相关的书籍,比如邓老师的《深入理解Android》,或者去找一些相关文章,先对这一块有一个大概的概念,具体涉及到了哪些类,涉及了哪些流程

然后再针对这些具体类,或者流程,提出自己的疑问,或者说,自己给自己去提一些问题,然后带着这些具体的问题,再去深入源码研究

还有最最重要的是,要明确读源码的目的和相关问题,不要陷入细节中不能自拔,比如我其实花了很久想搞懂kernel中的idle进程是如何启动system中的init进程的,但是这个问题其实没有那么重要,

下一篇文章将详细介绍init启动流程的相关源码,抓大放小,与君共勉

写在最后

觉得不错?不妨点个赞,然后关注下?