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