一、回顾上文讲到,init进程启动的主要子进程包括
sh
adbd:android调试桥
servicemanager:重要,负责管理系统服务
vold:Volume Dameon,用于挂载/管理USB存储或SD卡设备
palymp3:输出启动音
(zygote的启动其实还在后面很远)
二、Linux内核采用了丰富的进程间通信机制,如Pipe(管道)、Signal(信号)、消息队列(Message)、共享内存(Share Memory),但是android系统没有采用这些传统的进程个间通信机制,而是采用Binder。
Binder通信模型包括4大核心元素:Service(进程)、Client(进程)、ServiceManager(进程)、Binder(驱动+数据结构)
ServiceManager进程同时运行多个ServiceManager组件,这些组件联系着Service组件和Client组件,借助于Binder实现运行在Service进程和Client进程中的组件之间的通信。
一个Service进程可能同时运行多个Service组件,这些组件被注册到ServiceManager组件中。
一个Client进程也可能同时运行多个Client组件,这些组件将通过ServiceManager组件找到相关服务。
4者之间的关系见下图:
Client进程、Service进程、Service Manager进程都是运行在用户空间,Binder驱动则运行在内核空间。Service Manager和Binder驱动程序是系统负责提供的,Service和Client程序则由用户具体实现。
Client进程、Service进程、Service Manager进程都是用过系统调用“open/mmap/ioctl”来访问设备文件“/dev/binder”来实现与Binder驱动交互的。
三、Binder驱动程序在内核里实现,具体的实现方法在本文不做介绍。下面介绍一下Binder驱动暴露给用户调用方法——Binder进程间通信库
在Android应用程序框架层中,为了方便实现进程间调用,Android将Binder驱动程序相关的操作封装成了一个库——Binder库。
在Binder库中,Service组件和Client组件分别用模板类BnInterface和BpInterface来描述,这两个模板类的定义可以在 根/frameworks/native/include/binder/IInterface.h中找到,如下:
template<typename INTERFACE>
class BnInterface : public INTERFACE, public BBinder
{
public:
virtual sp<IInterface> queryLocalInterface(const String16& _descriptor);
virtual const String16& getInterfaceDescriptor() const;
protected:
virtual IBinder* onAsBinder();
};
template<typename INTERFACE>
class BpInterface : public INTERFACE, public BpRefBase
{
public:
BpInterface(const sp<IBinder>& remote);
protected:
virtual IBinder* onAsBinder();
};