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中找到,如下:
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(); };
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories