Zygote进程

Zygote进程

Posted by candy1126xx on March 10, 2017

简介

Zygote进程由Kernel层init进程创建,是Android Java层第1个进程。所对应的可执行程序是app_process,所对应的源文件是App_main.cpp。Zygote进程启动后,会启动AndroidRunTime组件、fork出SystemServer进程及各种应用进程。

启动后做了些什么?

  1. 注册Java虚拟机,并设置虚拟机相关参数;
  2. 注册一些JNI函数;
  3. 创建一个服务端Socket,当监听到客户端请求时,fork出新进程;
  4. 预加载类和资源;
  5. 启动SystemServer进程;

fork应用进程

第一步,发起进程通过Binder机制向SystemServer进程发起请求。最终调用到Process.start()。

第二步,SystemServer进程向Zygote进程发起请求。

  1. 一些参数:
  2. 向Zygote进程发起Socket请求,并把上述参数发送过去;
  3. Zygote进程收到客户端请求后,把参数解析成Arguments对象,调用Zygote.forkAndSpecialize(),最终调用到Native层com_android_internal_os_Zygote.cpp -> ForkAndSpecializeCommon();
  4. TODO:Native层创建进程过程……
  5. 回到Java层新进程,调用handleChildProc()。

应用进程启动后的准备工作

  1. 关闭从Zygote进程继承下来的Socket;
  2. 设置进程名(为包名);
  3. 设置一些通用初始化(默认的未捕捉异常处理方法、时区、log配置等);
  4. 调用到Native层app_main.cpp -> onZygoteInit(),创建用于Binder通信的线程池;
  5. 设置虚拟机参数(内存利用率、targetSdkVersion等);
  6. 调用ActivityThread.main();