Zygote

作者: 兲涳滺籃 | 来源:发表于2019-07-24 17:39 被阅读0次

    一、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

          本文链接:https://www.haomeiwen.com/subject/iwffrctx.html