登录

去注册

登录

注册

去登录

注册

每日一问 | Activity启动流程中,大部分都是用Binder通讯,为啥跟Zygote通信的时候要用socket呢?

xiaoyang   2019-11-30 20:49   收藏

RT,挺有意思的问题,为什么呢?

这是星球里面一位朋友的提问,想加入可以点这里

9
  1. zygote 比 service manager 先启动;从这个意义上,他没有 service manager 可以注册,所以没法用 binder
  2. 因为他们两个都是 init 进程启动的,就算先启动 service manager,也不能保存 zygote 起来的时候 service manger 就已经初始化好了(这就需要额外的同步,太麻烦)
  3. 这个 socket 的所有者是 root,group 是 system,只有系统权限的用户才能读写,这又多了一个安全保障(注意,这个 socket 是 Unix 域 socket,不是 internet 域 socket)
回复
4

Zygote是通过fork生成进程的,而多线程是不允许使用fork,可能造成死锁,同时Binder又是多线程的,所以就干脆不用Binder转而使用socket了

回复
1

因为zygote 没有启动binder啊,为啥不启动binder呢,因为zygote是android系统的受精卵进程。必须保证单线程,因为linux 使用fork函数创建一个进程时,如果进程中存在多个线程时 由于copy on write 机制,可能会死锁。

回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定