Zygote

一、App启动流程

App启动

二、zygote的作用

a. 启动systemServer (常用类、JNI函数、主题资源、共享库)

b. 孵化应用进程

三、zygote的启动流程

1. init进程是系统启动后用户空间第一个进程,它通过读取init.rc读取那些系统服务需要启动,如zygote, service manager,liunx启动之后,首先加载启动配置文件

2. fork+execve启动进程,主要为分native和java两方面

由native进行准备工作(启动Android虚拟机 --> 注册Android的JNI函数 --> 进入java世界)

由于zygote进程已经创建好了java虚拟机,新进程继承自zygote,所以不用创建了,只需要重置一下虚拟机的状态和守护线程。

然后切换到java去执行

1)首先预加载资源,preload resources

2)fork -> systemServer, SystemServer在单独的线程

3)然后进行loop循环,等待Socket

zygote进程loop循环接收socket消息,接收到消息后会执行runOnce方法,fork新进程,并在新进程中调用ActivityThread.main()方法

注意:

a. Zygote fork要单线程

b. Zygote的IPC没有采用binder,用的是socket

问题:

 1.孵化应用程序为啥不交给systemServer,而是专门设计一个zygote?

因为systemServer中运行了很多系统服务,不能被继承。应用程序启动时,除了必要的资源外,最好是干净的,所以需要单独用一个zygote来fork,zygote会把init工作做好,再共享给子进程,效率高

2. zyogte的IPC为什么不用binder?用binder会有问题吗?

因为Binder通信是需要多线程的,代理对象对binder的调用是在binder线程,需要再通过Hander调用主线程来操作。

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

你可能感兴趣的:(Zygote)