对zygote的理解

文章目录

  • 1 问题和注意点
  • 2 简答
  • 1 了解Zygote的作用
    • 1.1 启动三段式
  • 2 Zygote的启动流程
    • 2.1 Zygote进程是怎么启动的?
      • 2.1.1 启动配置
      • 2.1.2 启动进程
        • 1 fork + handle
        • 2 fork + execve
      • 信号处理
  • 3 进程启动之后做了什么?
    • 3.1 Zygote的Native世界
    • 3.2 Zygote的Java世界
  • 4 要注意的细节
  • 5 两个问题
  • 6 谈谈你对zygote的理解?

1 问题和注意点

  • 问题1:了解Zygote的作用(初级)

  • 问题2:熟悉Zygote的启动流程(中级)
    启动的时候做了哪些事?有哪些关键步骤?
    进程是怎么启动的? 进程启动之后做了什么?

  • 问题3:深刻理解Zygote的工作原理(高级)
    怎么启动进程的?怎么跟别人通信的?

要注意的细节:

  • Zygote fork要单线程
  • Zygote的IPC没有采用binder

两个问题:

  • 孵化应用进程这种事为什么不交给SystemServer来做,而专门设计一个Zygote?

  • Zygote的IPC通信机制为什么不采用binder?如果采用binder的话会有什么问题么?

2 简答

init进程在启动过程中创建了zygote进程;

zygote进程 创建DVM (Dalvik 虚拟机)和 ART 、孵化应用进程、启动SystemServer进程;


1 了解Zygote的作用

Zygote的作用是什么

  1. 创建DVM (Dalvik 虚拟机)和 ART
  2. 孵化应用进程
  3. 启动SystemServer进程

我们也将它称为孵化器。

常用类、JNI函数、主题资源、共享库

1.1 启动三段式

进程启动—>准备工作—>LOOP循环


2 Zygote的启动流程

2.1 Zygote进程是怎么启动的?

对zygote的理解_第1张图片

2.1.1 启动配置

对zygote的理解_第2张图片

service zygote /system/bin/app_process -Xzygote /system/bin 
--zygote --start-system-server  
  class main    
  socket zygote stream 660 root system    
  onrestart write /sys/android_power/request_state wake    
  onrestart write /sys/power/state on    
  onrestart restart media    
  onrestart restart netd    
  writepid /dev/cpuset/foreground/tasks

2.1.2 启动进程

1 fork + handle

pid_t pid = fork();
if (pid == 0) {
    // child process
} else {
    // parent process
}

2 fork + execve

pid_t pid = fork();
if (pid == 0) {
    // child process
    execve(path, argv, env);
} else {
    // parent process
}

信号处理

对zygote的理解_第3张图片
如果zygote进程挂掉的话,init进程就会收到SIGCHLD信号,init就会重启zygote进程。

3 进程启动之后做了什么?

3.1 Zygote的Native世界

对zygote的理解_第4张图片

int main(int argc, char *argv[]) {
    JavaVM *jvm;
    JNIEnv *env;
    JNI_CreateJavaVM(&jvm, (void **) &env,&vm_args);
    jclass clazz = env->FindClass("ZygoteInit");
    jmethodID method = env->GetStaticMethodID(clazz, "Main","([Ljava/lang/String;)V");
    env->CallStaticVoidMethod(clazz, method, args);
    jvm->DestroyJavaVM();
}

3.2 Zygote的Java世界

对zygote的理解_第5张图片

  boolean runOnce() {
        String[] args = readArgumentList();

        int pid = Zygote.forkAndSpecialize();

        if (pid == 0) {
            // in child
            handleChildProc(args,...);
            return true;
        }

    }

对zygote的理解_第6张图片

4 要注意的细节

  • Zygote fork要单线程
  • Zygote的IPC没有采用binder,采用socket

5 两个问题

孵化应用进程这种事为什么不交给SystemServer来做,而专门设计一个Zygote?

Zygote的IPC通信机制为什么不采用binder?如果采用binder的话会有什么问题么?

6 谈谈你对zygote的理解?

  • What:zygote的作用是什么?
  • How:zygote的启动流程是什么?
  • Why:zygote的工作原理是什么?

你可能感兴趣的:(12剖析Android,Framework)