Android Framework 学习(一):Zygote进程

1. Zygote是什么?

Zygote是Android系统中的进程,由用户空间的第一个进程Init进程启动的,是Android系统运行的第一个AndroidRuntime进程,同时也是打通Native和Java的桥梁。

2. Zygote的作用?

Zygote进程的作用主要有两个:

  • 创建SystemServer进程;
  • 孵化其他应用程序进程;

3. Zygote的启动流程?

Zygote进程是由Init进程解析init.zygote.rc文件启动的,zygote所对应的可执行程序app_process,所对应的源文件是App_main.cpp,进程名为zygote。

首先执行App_main.cpp的main()函数,在这里会执行以下步骤:

1.解析命令参数,主要是--zygote 和--start-system-server。

2.调用AppRuntime.start("com.android.internal.os.ZygoteInit",...),启动虚拟机,注册JNI函数;

3.通过JNI调用ZygoteInit.java的main()方法,从这里开始进入Java的世界;

运行Zygote的main方法,主要执行以下步骤:

  • 预加载 preloadClasses()、preloadResources()、preloadSharedLibraries()
  • forkSystemServer,最终会调用SystemServer.java的main()方法;
  • 创建ZygoteService,进入runSelectLoop;

4. Zygote需要注意的事项

1.Zygote进行fork的时候要是单线程,为了避免造成死锁或者状态不一致等问题;
2.Zygote的跨进程通信没有采用Binder机制,而是采用本地socket。

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

我们知道,应用在启动的时候需要做很多准备工作,包括启动虚拟机,加载各类系统资源等等,这些都是非常耗时的,如果能在zygote里就给这些必要的初始化工作做好,子进程在fork的时候就能直接共享,那么这样的话效率就会非常高。这个就是zygote存在的价值,这一点呢SystemServer是替代不了的,主要是因为SystemServer里跑了一堆系统服务,这些是不能继承到应用进程的。所以给SystemServer和应用进程里都要用到的资源抽出来单独放在一个进程里,也就是这的zygote进程,然后zygote进程再分别孵化出SystemServer进程和应用进程。

6. Zygote的IPC通信机制为什么使用socket而不采用binder?

主要原因是因为Zygote进行fork的时候要是单线程,父进程binder线程有锁,然后子进程的主线程一直在等其子线程(从父进程拷贝过来的子进程)的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,所以fork不允许存在多线程。而非常巧的是Binder通讯偏偏就是多线程,所以干脆父进程(Zygote)这个时候就不使用binder线程。

原文地址:https://www.cnblogs.com/renhui/p/12884039.html