Android 为什么AMS通知Zygote进程fork是用Socket通信

前言

UNIX上C++程序设计守则3

准则3:多线程程序里不准使用fork

总结

Binder通讯是需要多线程操作的,代理对象对Binder的调用是在Binder线程,需要再通过Handler调用主线程来操作。

比如AMS与应用进程通讯,AMS的本地代理IApplicationThread通过调用ScheduleLaunchActivity,调用到的应用进程ApplicationThread的ScheduleLaunchActivity是在Binder线程,需要再把参数封装为一个ActivityClientRecord,sendMessage发送给H类(主线程Handler,ActivityThread内部类

可能父进程(如zygote)binder线程有锁,然后子进程的主线程一直在等其子线程(从父进程拷贝过来的子进程)的资源,但是其实父进程的子进程并没有被拷贝过来,造成死锁,所以fork不允许存在多线程。而非常巧的是Binder通讯偏偏就是多线程,所以干脆父进程(Zgote)这个时候就不使用binder线程

参考

Android Zygote进程是如何fork一个APP进程的 - mingfeng002 - 博客园

Android Framework层学习——为什么SystemServer进程与Zygote进程通讯采用Socket而不是Binder_Kyrie_Wangyz的博客-CSDN博客_zygote为什么用socket

你可能感兴趣的:(android)