IPC指进程间通信,安卓系统的每一个application都是由一些activity和service组成的。而activity和service可能在不同的进程中运行,因此他们有进行进程间通信的需求。
为什么选择binder机制?
传统的linux的进程间通信方式有pipe(管道)、signal(信号)、trace(跟踪)、shared memory(共享内存)等方式,但是因为这些方式有的存在约束(只能在父进程与子进程之间通信)、有的数据多次拷贝存在效率问题、有的安全性不够,因此安卓系统中采用了基于OpenBinder的Binder机制。
binder机制原理
对于不同的进程,用户空间是不可共享的,而内核空间是可以共享的,所以安卓是通过可以共享的内核空间进行进程间通信。
Binder其实是提供了远程过程调用功能,client端得到了server端的一个远程接口,接口中的方法与server端的方法一 一对应,client端通过调用远程接口中的方法来与server端进行通信。它们之间传递的数据为Parcel格式。Parcel是一个可以包含数据或者对象引用的容器。
binder机制架构
Binder机制采用C/S架构,主要包含client组件、server组件、service manager组件以及binder驱动程序。其中client组件、server组件、service manager组件运行在用户空间,而binder驱动程序在内核空间。client组件通过在service manager组件上查看server组件注册的服务从而使用它们。
service manager分析
service manager是一个守护进程,在安卓系统启动之后,就运行起来,管理系统的service。
下面是service manager的主函数
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024);
if (binder_become_context_manager(bs)) {
LOGE("cannot become context manager (%s)\n", strerror(errno));
return -1;
}
svcmgr_handle = svcmgr;
binder_loop(bs, svcmgr_handler);
return 0;
}
主函数中,主要是进行了/dev/binder驱动程序的打开,通知binder自己变成了context_manager(如果失败也返回结果),以及不断查看binder,看是否有请求需要处理。