Android
系统是基于Linux
定制的一款开源的而移动端操作系统,由于其开源的特性,各大手机厂商可以针对其源码进行深度定制,对于开发者来说,有如此庞大且优秀的开源os
提供参考,尤其是对移动端的开发者来说,阅读Android
系统源码可以帮助我们更好地理解其中的各种机制,平时束手无策的问题也可以在源码中寻找答案。当然光8.0的源码就20多个g,像全部读完几乎是不可能的事,我们主要以framework
为主线,以系统运行机制为分支,层层阅读,剥开Android
系统的神秘面纱。
Android 系统架构
首先来一张google
经典的Android
系统架构图:可以看到,从上到下主要分为4层:应用层,framework
层,系统库和运行时,Linux
内核层。
#Android 启动流程
这里再上一张Android系统启动的流程图,可以看到系统从启动开始是按照一个流程:Loader
->kernel
->framework
->Application
来进行的。
Loader层:
Boot Rom
:当手机处于关机状态时,长按开机键开机,会引导芯片开始从固化在Rom里预设的代码开始执行,然后加载引导程序到Ram
Boot Loader
:启动Android系统之前的引导程序,主要是检查Ram
,初始化参数等
Kernel层
Kernel
层指的就是Android内核层,这里一般开机刚刚结束进入Android系统,Kernel
层的启动流程如下:
- 启动
swapper
进程(pid=0),这是系统初始化过程kernel创建的第一个进程,用于初始化进程管理、内存管理、加载Display
、Camera
、Binder
等驱动相关工作 - 启动
kthreadd
进程,这是Linux
系统的内核进程,会创建内核工作线程kworkder
、软中断线程ksoftirqd
和thermal
等内核守护进程。kthreadd
是所有内核进程的鼻祖。
Native层
这里的native
层主要包括由init
进程孵化的用户空间的守护进程,bootanim
开机动画和hal
层等。Init
是Linux
系统的守护进程,是所有用户空间进程的鼻祖。
init
进程会孵化出ueventd
、logd
、healthd
、installd
、adbd
、lm这里写代码片
kd等用户守护进程;init
进程还会启动ServiceManager
(Binder服务管家)、bootanim
(开机动画)等重要服务。init
进程孵化出Zygote
进程,Zygote
进程是Android系统第一个Java进程(虚拟机进程),Zygote
进程是所有Java进程的父进程。
Framework层
framework
层有native
层和java
层共同组成,协调系统平稳有序的工作。framework
层主要包括以下内容:
Media Server
进程,是由init
进程fork
而来,负责启动和管理整个C++ framework
,包含AudioFlinger
,Camera Service
等服务。Zygote
进程,由Init
进程通过解析init.rc
文件生成,Zygote
是Android系统的第一个Java进程,是所有Java进程的父进程。System Server
进程,由Zygote
进程fork
而来,是Zygote
进程孵化的第一个子进程,负责启动和管理整个Java Framework
,包括Ams
、Pms
等。
App层
Zygote
进程孵化的第一个App
进程是Launcher
进程,也就是我们的桌面进程,也就是我们打开手机看到的用户界面。因为在前面的framework
生成了各种守护进程和管理进程,对于Launcher
也就有对应的点击、长按、滑动、卸载等监听。Zygote
进程也会创建Browser
、Phone
、Email
等App进程。也就是说所有的App进程都是由Zygote
进程fork
生成的。而且上层的进程全部由下层的进程进行管理,包括但不限于界面的注册、跳转,消息的传递。
Zygote进程的启动
了解了Android
系统从按下开机键到桌面完整运行在用户眼前的整个流程,我们就可以针对系统的各个过程进行分析。由于是移动开发,平时最多打交道的是应用层,也是就上面的App
层,跟我们打交道最多的就是framework
层,我们主要关注framework
层是如何启动并调度各应用进程协调工作的。从ZygoteInit
的main
方法开始,我们先看framework
启动流程的时序图(省略了一些步骤)大体如下:
[外链图片转存失败(img-Gm3OOCcd-1568628095444)(http://on-img.com/chart_image/5b694cb9e4b025cf4939ddf2.png)]
1.ZygoteInit.main
public static void main(String argv[]) {
ZygoteServer zygoteServer = new ZygoteServer();
// Mark zygote start. This ensures that thread creation will throw
// an error.
ZygoteHooks.startZygoteNoThreadCreation();
...
try {
// Report Zygote start time to tron unless it is a runtime restart
if