从AMS与Zygote通信理解Android系统的启动过程

无意中看到一个有意思的问题:AMS与Zygote进程通信为什么用Socket而不是Binder?

如下图:

可以看到,在Launcher启动其他APP的过程中,AMS发送创建进程的请求和Zygote进程fork新进程,都是用的Socket方式。

那么为什么用socket而不是用Binder方式了?

网上有很多说法。这个问题的答案本身没有多大意义,Socket也好,Binder也好,功能实现,没有bug就行了。Socke可以优化,Binder也可以优化,不一定哪种方式就绝对的好。不过,分析不同的说法的理论依据,倒是可以增长见识。这些说法是否靠谱,有待研究。

说法一:Binder驱动加载是早于init进程的

如下图:

这种说法的依据是,Binder驱动属于内核层,Android系统启动时,先加载内核,然后才创建init进程。

说法二:init进程先创建ServiceManager进程,AMS,WMS,PMS等等都注册在ServiceManager进程中。

如下图:

init进程确实是先创建ServiceManager进程,然后再创建Zygote进程的,如下图:

说法三:Linux中fork进程不推荐fork一个多线程的进程

确实有这种说法,但这个不一定就是使用Socket而不使用Binder的原因。

相关推荐
ℳ₯㎕ddzོꦿ࿐几秒前
零基础教程:在 Linux 上通过 Docker 快速部署 Dify
linux·运维·docker·dify
学海_无涯_苦作舟2 分钟前
RabbitMQ Java Client源码解析——ConnectionFactory和Connection
linux·运维·服务器
是阿威啊3 分钟前
【第三站】本地虚拟机部署hive集群
linux·数据仓库·hive·hadoop·分布式
Kapaseker7 分钟前
面试官最爱问的 Android 数据传递问题
android·kotlin
和光同尘202315 分钟前
一文讲透CentOS下安装部署使用MYSQL
linux·运维·数据库·数据仓库·mysql·centos·database
0.0雨15 分钟前
设置集群的SSH免密登陆
linux·服务器·ssh
胖咕噜的稞达鸭16 分钟前
【Linux系统编程】解密环境变量与进程地址空间
linux·运维·chrome
峰顶听歌的鲸鱼17 分钟前
17.docker:监控及日志
linux·运维·docker·容器·云计算
一颗青果20 分钟前
Linux下的线程
linux·运维·服务器
wdfk_prog22 分钟前
[Linux]学习笔记系列 -- [fs]fs_context
linux·笔记·学习