您的位置:首页 > 移动开发 > Android开发

Android启动过程研究(三:servicemanager进程与Binder通信机制)

2016-06-23 10:49 736 查看
一、回顾上文讲到,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();
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 源码