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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容