安卓binder机制探索

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组件注册的服务从而使用它们。


安卓binder机制探索_第1张图片
binder的C/S架构示意图


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,看是否有请求需要处理。

你可能感兴趣的:(安卓binder机制探索)