这是我参与「第四届青训营 」笔记创作活动的第1天。
什么是zygote进程
Zygote是Android系统中的进程,由用户空间的第一个进程Init进程启动的,是Android系统运行的第一个AndroidRuntime进程,同时也是打通Native和Java的桥梁。
zygote进程的作用
创建SystemServer进程;是用于管理整个Java framework层,包含ActivityManager,PowerManager等各种系统服务;孵化其他应用程序进程(由于systemserver进程中运行了各类系统服务,不能直接fork到子进程,故单独使用zygote进程完成fork操作);
什么是SystemServer进程
SystemServer进程是Android系统的核心之一,大部分Android提供的服务都在该进程中,SystemServer中运行的进程有六十多种,主要包括:ActivityManagerService(AMS),WindowManagerService(WMS),PackagManagerService(PMS)等;这些系统服务都是以一个线程的方式存在Systemserver进程中。
Binder通信
1.首先 Binder 驱动在内核空间创建一个数据接收缓存区;
2.接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系;
3.发送方进程通过系统调用 copy_from_user() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。
zygote进程与AMSsystemServer进程之间不使用Binder通信
由于 UNIX上C++程序设计守则3——准则3:多线程程序里不准使用fork,原因是很可能造成死锁,而Binder通信需要多线程操作: 代理对象对Binder的调用是在Binder线程,需要再通过Handler调用主线程来操作。
比如AMS与应用进程通讯,AMS的本地代理IApplicationThread通过调用ScheduleLaunchActivity,调用到的应用进程ApplicationThread的ScheduleLaunchActivity是在Binder线程,需要再把参数封装为一个ActivityClientRecord,sendMessage发送给H类(主线程Handler,ActivityThread内部类)。故执行fork操作的zygote进程不使用Binder通信。
参考文章
Android Framework层学习——为什么SystemServer进程与Zygote进程通讯采用Socket而不是Binder