前言
Zygote可以说是Android开发面试很高频的一道问题,但总有小伙伴在回答这道问题总不能让面试满意, 在这你就要搞清楚面试问你对Zygote的理解时,他最想听到的和其实想问的应该是哪些?下面我们通过以下几点来剖析这道问题!
- 了解Zygote的作用
- 熟悉Zygote的启动流程
- 深刻理解Zygote的工作原理
下面来我们来深入剖析
一、 Zygote的作用
Zygote的作用分为两点:
- 启动SystemServer
- 孵化应用进程
关于这个问题答出了这两点那就是OK了。可能大部分小伙伴可能能答出第二点,第一点就不是很清楚。SystemServer也是Zygote启动的,因为SystemServer需要用到Zygote准备好的系统资源包括:
直接从Zygote继承过来就不需要重新加载过来,那么对性能将会有很大的提升。
二、Zygote的启动流程
2.1 启动三段式
在说Zygote启动流程之前,先明确一个概念:启动三段式, 这个可以理解为Android中进程启动的常用套路,分为三步骤:
这里要了解LOOP循环是什么,其实LOOP作用是不停的接受消息
,处理消息
,消息的来源可以是Soket
、MessageQueue
、Binder
驱动发过来的消息,但无论消息从哪里来,它整个流程都是去接受消息,处理消息。这个启动三段式,它不光是Zygote进程是这样的,只要是有独立进程的,比如说系统服务进程,自己的应用进程都是如此。
2.2 Zygote进程是怎么启动的?
Zygote进程的启动取决于init进程,init进程是它是linux启动之后用户空间的第一个进程,下面看一下启动流程:
- linux启动init进程
- init进程启动之后加载init.rc配置文件
- 启动配置文件中定义的系统服务,其中Zygote服务就是定义在配置中的
- 同时启动的服务除了Zygote之外还有一些别的系统服务也是会启动的,比如说ServiceManager进程,它是通过fork+execve系统调用启动的