从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的原因。

相关推荐
我是小灰灰吖4 分钟前
Qt 6.9.3 Ubuntu 22.04 虚拟键盘显示问题全记录与解决方案
linux·qt·ubuntu
Mortalbreeze6 分钟前
深入理解TCP协议(一):TCP报文格式详解
linux·服务器·网络·tcp/ip
三言老师17 分钟前
K8s 集群 LocalPV 静态 PV 资源手动创建实操
linux·运维·服务器·kubernetes
恋猫de小郭21 分钟前
社区版 Dart macros?一个可以解决 JSON 序列化的Fluter “宏编程”第三方包
android·前端·flutter
mmsx21 分钟前
Android Design 项目集合
android
一直在努力学习的菜鸟27 分钟前
Rocky Linux 8.10 编译安装 PostgreSQL 17.11
linux·运维
Doraemomo42 分钟前
Linux编程-进程的执行和退出
linux·运维·服务器
lengjingzju1 小时前
编译与调试完全指南—第5章 GDB调试详解
linux
艾伦_耶格宇1 小时前
【ELK】-5 kibana和filebeat
linux·运维·ubuntu·elk
DevHub1 小时前
电视盒子刷 Armbian 教程:30 元旧盒子变 NAS 跑 Docker,200+ 机型可刷
linux·嵌入式硬件·docker·容器·开源·电视盒子