Android进程间通信机制——Binder学习

Binder是Android系统中的一种进程间通信机制,有四个组件组成,分别是:Client、Server、Service Manager和Binder驱动程序。其中,Client,Server,Service Manager运行在用户空间,Binder驱动运行在内核空间。Binder就是这四个组件打起来的一个通信链路。

Binder驱动是Binder机制的核心,最终的交互就是通过Binder驱动。Service Manager负责在用户空间的Binder管理,也就是管理Client和Server。Client和Server就是通常的Client——Server通信模型中的两端,Client负责提供服务接口给上层应用或者其他进程使用,Server则是这些接口功能的真正的实现者。Android系统中的系统Service(ActivityManagerService、WindowManagerService、PowerManagerService等等)都是这种模型架构。对于应用开发者,也可以开发自己的Client,Server。可以通过获得Service Manager服务来管理自己的Server。

Android Binder系统的架构如下图所示。



如图所示,Client,Server包括Service Manager都是通过open和ioctl两个函数与Binder驱动进行通信,然后他们之间的通信就由Binder驱动进行传递,这里的Binder驱动就类似一块共享内存。

Service Manager作为Binder在User空间的管理者,他自己首先注册到Binder驱动,并告诉Binder驱动他是Binder用户空间的管理者,下面简单看下Service Manager如何实现注册并成为管理者。

Service Manager是在init进程中被启动,定义在init.rc中(system/core/rootdir):

<span style="font-size:18px;"><span style="font-size:24px;">service servicemanager /system/bin/servicemanager
    class core
    user system
    group system
    critical
    onrestart restart healthd
    onrestart restart zygote
    onrestart restart media
    onrestart restart surfaceflinger
    onrestart restart drm</span></span>


其源码实现位于(Android M):frameworks/native/cmds/servicemanagerservice_manager.c
<span style="font-size:18px;"><span style="font-size:24px;">int main(int argc, char **argv)
{
    struct binder_state *bs;

    bs = binder_open(128*1024);
    if (!bs) {
        ALOGE("failed to open binder driver\n");
        return -1;
    }

    if (binder_become_context_manager(bs)) {
        ALOGE("cannot become context manager (%s)\n", strerror(errno));
        return -1;
    }

    selinux_enabled = is_selinux_enabled();
    sehandle = selinux_android_service_context_handle();
    selinux_status_open(true);

    if (selinux_enabled > 0) {
        if (sehandle == NULL) {
            ALOGE("SELinux: Failed to acquire sehandle. Aborting.\n");
            abort();
        }

        if (getcon(&service_manager_context) != 0) {
            ALOGE("SELinux: Failed to acquire service_manager context. Aborting.\n");
            abort();
        }
    }

    union selinux_callback cb;
    cb.func_audit = audit_callback;
    selinux_set_callback(SELINUX_CB_AUDIT, cb);
    cb.func_log = selinux_log_callback;
    selinux_set_callback(SELINUX_CB_LOG, cb);

    binder_loop(bs, svcmgr_handler);

    return 0;
}</span></span>
 
这里主要做三件事: 

1、bs = binder_open(128*1024);打开Binder设备。

2、调用binder_become_context_manager(bs),告诉Binder驱动Service Manager是Binder用户空间管理者。

3、调用binder_loop(bs, svcmgr_handler);进入无限循环中,等待“Client”的请求,这里“Client”包括上文中的Binder通信双方Client——Server。


详细的实现细节参见老罗的博文:http://blog.csdn.net/luoshengyang/article/details/6621566


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值