Zygote的简单理解

一、Zygote的作用

  1. 启动SystemServer
  2. 孵化应用进程

实际上SystemServer也是从Zygote继承而来,SystemServer实际上需要用到一些Zygote中已经准备好的系统资源,比如,常用类,JNI函数,主题资源,共享库等,从而节约系统的资源,直接复用可以节约系统资源,提升性能。

 

二、Zygote的启动流程

对于Android中的任何独立进程的启动,可分为下面三段式,进程启动后作一些准备工作,然后进入线程的消息队列Loop中,

因此,Zygote的启动也会经过此过程,Zygote的启动是由Linux开机启动时Init进程通过读取init.rc配置文件读取来fork出zygote,直观效果图表示为

 

Zygote进程启动后实际上会做主要的两件事情,这两件事情实际上就是为Android系统的启动准备

1、Zygote的Native世界,为进入Java层作准备

  • 启动Android的虚拟机(zygote的c++代码main函数中,通过JNI_CreateJavaVM函数)
  • 注册Android的JNI函数
  • 进入Java世界

2、Zygote的Java世界,启动Framwork中的java服务,以及启动Launcher等。

Zygote启动后会去Preload Resource,然后启动SystemServer, SystemServer与Looper之前通过Socket通信

SystemServer启动后,Loop循环中如何执行socket请求?

Zygote启动后会进入一个Loop循环,在这个循环中它会不断轮询runOnce函数

boolean runOnce() {
    //跨进程传输过来的,如AMS,PMS等
    String[] args = readArgumentList();

    int pid = Zygote.forkAndSpecialize();
    
    if(pid == 0) {
        //in child,实际上是执行ActivityThread.main(),应用程序进程启动后,会调用ActivityThread.main()
        handleChildProc(args, ...);
        return true;
    }
}

Zygote的启动要单线程,为什么?

不管父进程里面有多少线程,子进程在创建的时候只有一个单线程,因此父进程中的这些除主线程之外的其它进程挂起,等创建完子进程之后,再重启父进程中的其它线程。

Zygote的跨进程通IPC没有采用binder机制,而是采用本地的Socket通信。

三、谈谈你对 Zygote的理解?

what:Zygote的作用是什么?(两大作用)

How:zygote的启动流程是什么?(Init读取init.rc配置文件,fork出zygote)

why:zygote的工作原理是什么?(进程启动三段式,preloadRes, fork systemServer, loop作socket通信,通过关键函数runOnce)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值