Binder源码分析之ServiceManager(原)

本文深入分析了ServiceManager在Android中的启动流程,包括打开Binder设备、ServiceManager如何成为服务管理员,以及详细的服务处理过程,涵盖请求处理和回应客户端的步骤。通过源码解析,揭示了ServiceManager初始化和事务处理的全过程。
摘要由CSDN通过智能技术生成
        ServiceManager作为Native层Service的管理员,有着极其重要的作用,主要表现两个方面:
        1、对于服务端来说,系统所有的服务提供者都需要向ServiceManager注册。
        2、对于客户端来说,所有客户端如果想要获得某个系统服务的代理,必须向ServiceManager申请相应的服务端代理。

        下面从源码分析ServiceManager的启动流程和服务流程。

    @Service_manager.c(frameworks/base/cmds/servicemanager)
    int main(int argc, char **argv) {
        struct binder_state *bs;
        void *svcmgr = BINDER_SERVICE_MANAGER;
        //打开binder设备
        bs = binder_open(128*1024);
        //成为Service manager
        if (binder_become_context_manager(bs)) {
            LOGE("cannot become context manager (%s)\n", strerror(errno));
            return -1;
        }
        svcmgr_handle = svcmgr;
        //在binder_loop中循环检测binder中是否有新的请求
        binder_loop(bs, svcmgr_handler);
        return 0;
    }
        main函数主要有三个功能:
        1、打开Binder设备文件;
        2、告诉Binder驱动程序自己是Binder上下文管理者;
        3、进入一个死循环,充当Service的角色,等待Client的请求。

        下面我们就分别介绍这三个步骤。


一、打开Binder设备

    @binder.c(\frameworks\base\cmds\servicemanager\)
    struct binder_state *binder_open(unsigned mapsize) {
        //创建binder_state结构体并分配内存
        struct binder_state *bs;
        bs = malloc(sizeof(*bs));
        //打开binder设备
        bs->fd = open("/dev/binder", O_RDWR);
        bs->mapsize = mapsize;
        //将binder物理空间映射为ServiceManager可用的虚拟空间
        bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
        //将结构体返回给servicemanager
        return bs;
    }
        上面打开Binder设备的过程其实就是构建一个binder_state结构体对象,然后对其各个成员初始化的过程。我们来看一下binder_state数据结构:
    struct binder_state {
        //文件描述符,这里指的是/dev/binder设备文件描述符
        int fd;
        //把设备文件/dev/binder映射到进程空间的起始地址,这里就是128*1024
        void *mapped;
        //映射的空间大小
        unsigned mapsize;
    };
        这个结构体只有三个成员变量,其中fd是底层binder设备的文件描述符,mapped是ServiceManager得到的虚拟空间地址,这块虚拟空间映射了底层binder的物理地址,而mapsize是这块虚拟空间的大小,也就是128*1024。
        从上面可以看出,打开Binder的过程的过程分为两步:
        1、打开Binder设备;

        2、用Binder的物理地址映射为ServiceManager可用的虚拟地址;


二、ServiceManager成为服务管理员的过程

        在Android中,每个注册的Service,Binder都会给他分配一个唯一的int型的句柄,Client可以用该句柄向ServiceManager请求相应的Service,而负责这个管理任务的正是ServiceManager。也就是说, Service需要先向ServiceManager注册自己,并得到自己的服务句柄,然后Client需要拿这个int型的句柄向Ser
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值