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

前言java

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

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

福利活动app

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

正文post

启动流程概述

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

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

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

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

  1. loader

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

  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启动流程的相关源码,抓大放小,与君共勉

写在最后

以为不错?不妨点个赞,而后关注下?

相关文章
相关标签/搜索