Android Zygote

Android Handler随记_暮冬一十四的博客-CSDN博客

Android Binder随记_暮冬一十四的博客-CSDN博客

init进程

  1. 由pid为0的Linux内核进程启动
  2. 启动系统关键进程: 执行init.rc脚本,执行脚本中一行一行的Linux命令来启动进程
  3. 守护系统关键进程:如蓝牙、铃声、接打电话、安装应用等进程名结尾带“d”的系统进程
  4. 当守护的进程被杀死时,重启被杀死的进程
  5. 当守护的进程无法被重启时,重启手机:如Zygote

Zygote

  1. 由init进程执行zygote.rc脚本启动的
  2. 最开始启动的时候名字并不是叫Zygote,而是app_process
  3. 在app_main.cpp中当解析到命令中有“--zygote”时,将app_process的名字改为了Zygote(niceName=ZYGOTE_NICE_NAME,可能是感觉app_process不好听吧)
  4. Zygote是native进程:由c++代码启动的;
  5. Zygote创建一个Server端的Socket,实现与其他进程通信
  6. 调用preloadClasses和preloadResources提前加载系统资源、系统类;从而让APP进程不用重复加载系统资源、系统类;如Activity的Class、系统主题等
  7. ZygoteInit.java还去fork出了SystemServer这个java进程
  8. 启动App时,Zygote还负责fork出App进程

与Zygote进程通信为什么要用Socket,而不是Binder?

  1. Zygote它负责开进程
  2. Binder效率太高了,而开进程又比较慢,用Binder同时发多个启动进程请求时,会让内存瞬间暴涨; 安全方面:容易被Hook;
  3. Socket:请求串行,执行完一个开进程,再执行下一个;

Zygote是创建Android系统中Java世界的盘古,它创建了第一个Java虚拟机,同时它又是女娲,它成功地繁殖了framework的核心system_server进程。

Zygote创建Java世界的步骤:

  1. 第一天:创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
  2. 第二天:调用startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
  3. 第三天:通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。然而在这个世界刚开创的时候,什么东西都没有。
  4. 第四天:调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。同时Zygote调用preloadClasses和preloadResources,为Java世界添砖加瓦。
  5. 第五天:Zygote觉得自己工作压力太大,便通过调用startSystemServer分裂一个子进程system_server来为Java世界服务。
  6. 第六天:Zygote完成了Java世界的初创工作,它已经很满足了。下一步该做的就是调用runSelectLoopMode后,便沉沉地睡去了。
  7.  以后的日子:Zygote随时守护在我们的周围,当接收到子孙后代的请求时,它会随时醒来,为它们工作。
  8. 有一天,他的孩子SystemServer发送了个请求,Zygote苏醒,Zygote调用ZygoteConnection的runOnce函数。在runOnce方法中Zygote分裂了一个子进程(App进程),然后在调用handleChildProc方法在子进程中进行处理。
  9. 然后继续沉睡,等待请求进行下一次分裂。

Android Framework源码-PMS随记_暮冬一十四的博客-CSDN博客

部分参考:深入理解Android卷I---深入理解zygote

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值