一、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线程。
网友评论