Android Framework-Zygote

123 阅读3分钟

Zygote是什么

在Android中,负责孵化新进程的这个进程叫做Zygote,安卓上其他的应用进程都是由它孵化的。

Zygote的作用是什么?

  • 创建SystemServer
  • 孵化应用进程

Zygote启动过程

image.png

SystemServer的作用是什么?

System Server 是Zygote fork 的第一个Java 进程,创建提供所有核心的系统服务。

SystemServer启动流程

  1. 初始化了必要的一些环境参数,比如 系统时间,时区,语言,加载一些库,初始化 Looper,创建系统上下文

  2. 创建SystemServiceManager对象,来管理各种系统服务,比如PMS、AMS

  3. 启动服务、startBootstrapServices()、startCoreServices()、 startOtherServices(),所有服务继承SystemService

Zygote fork了哪些

  • AndroidRuntime:虚拟机、libc
  • 预加载资源

不从init进程fork是因为AndroidRuntime、预加载资源是共同需要的

不从SystemServer进程fork是因为 相比Zygote多运行了AMS、WMS等服务,有些服务对一个应用程序来说是不需要的。另外进程的 fork() 对多线程不友好,仅会将发起调用的线程拷贝到子进程,这可能会导致死锁,而SystemServer中肯定是有很多线程的。

Zygote 为什么不采用 Binder 机制进行 IPC 通信?

Binder 机制中存在 Binder 线程池,是多线程的,如果 Zygote 采用 Binder 的话就存在死锁问题。其实严格来说,Binder 机制不一定要多线程,所谓的 Binder 线程只不过是在循环读取 Binder 驱动的消息而已,只注册一个 Binder 线程也是可以工作的,比如 service manager 就是这样的。实际上 Zygote 尽管没有采取 Binder 机制,它也不是单线程的,但它在 fork() 前主动停止了其他线程,fork() 后重新启动了。

Android应用启动流程

image.png

Source端进程发送请求目标Activity启动阶段:

  1. Source端发起显示/隐式启动请求启动Activity

system_server进程通过AMS处理启动Activity请求:

  1. 解析启动目标Activity的Intent

  2. 创建目标Activity对应的ActivityRecord

  3. 为目标Activity查找/分配或者创建最优Task栈

  4. Pause前台Activity

  5. Resume请求的目标Activity

  6. AMS请求zygote进程为目标Activity创建所属进程

zygote进程处理system_server进程发送的创建目标Activity进程请求阶段:

  1. zygote接受AMS请求fork创建目标Activity所属进程

  2. 调用RuntimeInit,初始化目标进程运行环境

  3. 通过反射调用目标进程ActivityThread主线程main方法,开启目标进程新时代

目标Activity进程启动阶段:

  1. 开启目标Activity进程的的Looper消息循环

  2. 注册ApplicationThread到AMS,AMS把Application和进程进程绑定

  3. 创建目标进程Application,并执行其onCreate方法

开启目标Activity生命周期阶段:

  1. 真正启动目的端Activity

  2. 通过反射加载目标Activity

  3. 执行目标Activity生命周期

  4. 初始化目标Activity窗口为显示做准备

目标Activity显示阶段:

  1. 新建DecorView

  2. 新建ViewRootImpl

20.将window添加到WMS准备显示

Source端Activity收尾工作:

  1. Source端Activity执行onStop()等逻辑