前言java
针对系统启动流程的专题研究也进行了差很少一周了,虽然进度缓慢,但也算是有一些阅读源码的心得,以及对源码的一点理解markdown
因为系统启动流程涉及的源码相对较多,因此决定分几篇文章来写,本篇主要是对启动流程进行一个简单的概述,以及谈一下我我的的读源码的方法架构
福利活动app
由Android研习社
和机械工业出版社
联合发起的赠书活动正在进行中,欢迎你们点击连接参与函数
正文post
这里说的启动流程是指Android系统的启动流程动画
让咱们来回想一下,咱们是如何“启动”一个全新未开封的Android手机的:spa
是否是感受步骤仍是挺多的?其实我们主要作的仍是只负责按电源键就OK了,我们要分析的,就是从1-5
这几步,系统都作了哪些事情,我简单画了个图(ps:这也叫图?): code
刷过机的朋友大概都知道,Android能够经过某个组合按键进入BootLoader页面,这个也就是上图中的最底层,在Android系统,甚至于它的内核还未加载时的一个引导程序,主要负责对kenel进行解压和初始化的工做orm
kernel中的idle进程是0号进程,由内核中启动,并始终执行在内核态,由内核态的idle进程开启咱们常提的1号进程,init(对应源码,system/core/init/init.cpp
)
这个进程也是邓老师的书中所提到的,“天字号”进程,可是通过咱们上面的分析,其实它并非开天辟地的始祖
init.cpp
中作的事情其实不仅是开启init
进程,这个后面分析具体源码时再作详细介绍
init进程负责的事情主要是对init.rc
这个系统启动脚本文件进行解析(loadBootScripts()
),通过对ro.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
,进入第四步
这部分源码还没阅读到,这里只是先简单提一下...
Launcher已是咱们具体的App应用了,这个是由zygote进程fork出来的进程
到此,通过这么多步骤,系统终于启动起来,而且能够跟用户交互了
正所谓,授人以鱼,不如受人以渔,因此我仍是简单提一下,我是如何去阅读源码的
这个问题我跟朋友探讨过,也跟前辈请教过,目前我是采用这样的方式
好比针对系统启动流程的相关源码,若是我对这一块彻底陌生,没有任何概念,那我须要先去阅读相关的书籍,好比邓老师的《深刻理解Android》
,或者去找一些相关文章,先对这一块有一个大概的概念,具体涉及到了哪些类,涉及了哪些流程
而后再针对这些具体类,或者流程,提出本身的疑问,或者说,本身给本身去提一些问题,而后带着这些具体的问题,再去深刻源码研究
还有最最重要的是,要明确读源码的目的和相关问题,不要陷入细节中不能自拔,好比我其实花了好久想搞懂kernel
中的idle
进程是如何启动system
中的init
进程的,可是这个问题其实没有那么重要,
下一篇文章将详细介绍init启动流程的相关源码,抓大放小,与君共勉
以为不错?不妨点个赞,而后关注下?