Binder源码分析之ServiceManager(原)
来源:互联网 发布:2016年3月非农数据 编辑:程序博客网 时间:2024/05/21 09:22
ServiceManager作为Native层Service的管理员,有着极其重要的作用,主要表现两个方面:
1、对于服务端来说,系统所有的服务提供者都需要向ServiceManager注册。
2、对于客户端来说,所有客户端如果想要获得某个系统服务的代理,必须向ServiceManager申请相应的服务端代理。
1、打开Binder设备文件;
2、告诉Binder驱动程序自己是Binder上下文管理者;
3、进入一个死循环,充当Service的角色,等待Client的请求。
从上面可以看出,打开Binder的过程的过程分为两步:
1、打开Binder设备;
同时我们注意到,ServiceManager本身也是一个Service,他需要先向Binder注册自己,而且要把自己注册为“管理员”,那么这个注册过程是怎样的呢?我们来看源码:
这一步的入口是binder_loop(): 上面的过程表明了Service_manager进入循环的过程,主要分为三个步骤:
1、先通过发送BC_ENTER_LOOPER消息告诉底层,ServiceManager将要进入循环了;
2、在死循环中读取客户端的请求;
3、处理请求;
上面的第一步是通过向Binder发送BC_ENTER_LOOPER消息实现的,第二步通过BINDER_WRITE_READ可以读取Binder中的数据(请求);第三步需要调用binder_parse去处理客户端的请求,我们主要看一下这个过程。
1、得到一个Service;
2、添加一个Service;
3、列出所有的Service;
下面我们分别看一下这三个功能的实现方式,我们先从add一个Service开始: 从add的过程可以看出,所谓向ServiceManager注册一个服务,其实就是为当前的Service创建svcinfo的结构体,并把该结构体添加到svclist中。
那么我们可以推测,find的过程无非就是去svclist中查找svcinfo的过程: 这个过程确实如我们所料,需要通过find_svc()在svclist中寻找需要的Service并把该Service节点发送给请求的Client。
那么list Service的请求只需要把svclist返回给Client即可:
经过这些过程,ServiceManager就完成了解析数据的过程,下面就需要把相应的数据返回给客户端。
1、对于服务端来说,系统所有的服务提供者都需要向ServiceManager注册。
2、对于客户端来说,所有客户端如果想要获得某个系统服务的代理,必须向ServiceManager申请相应的服务端代理。
下面从源码分析ServiceManager的启动流程和服务流程。
main函数主要有三个功能:1、打开Binder设备文件;
2、告诉Binder驱动程序自己是Binder上下文管理者;
3、进入一个死循环,充当Service的角色,等待Client的请求。
下面我们就分别介绍这三个步骤。
一、打开Binder设备
上面打开Binder设备的过程其实就是构建一个binder_state结构体对象,然后对其各个成员初始化的过程。我们来看一下binder_state数据结构: 这个结构体只有三个成员变量,其中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型的句柄向ServiceManager请求相应的Service,ServiceManager再把相应的Service代理对象发送给Client使用。同时我们注意到,ServiceManager本身也是一个Service,他需要先向Binder注册自己,而且要把自己注册为“管理员”,那么这个注册过程是怎样的呢?我们来看源码:
我们看到,当ServiceManager向Binder驱动发送BINDER_SET_CONTEXT_MGR的消息时,Binder就会把他注册为“管理员”。
三、Service_manager服务过程
3.1、Service_manager的执行流程
经过前面两步的操作,我们不仅打开了Binder,而且把当前的ServiceManager注册成为了管理员,下面要做的就是去承担管理员的职责,也就是接收各种请求。这一步的入口是binder_loop(): 上面的过程表明了Service_manager进入循环的过程,主要分为三个步骤:
1、先通过发送BC_ENTER_LOOPER消息告诉底层,ServiceManager将要进入循环了;
2、在死循环中读取客户端的请求;
3、处理请求;
上面的第一步是通过向Binder发送BC_ENTER_LOOPER消息实现的,第二步通过BINDER_WRITE_READ可以读取Binder中的数据(请求);第三步需要调用binder_parse去处理客户端的请求,我们主要看一下这个过程。
3.2、ServiceManager处理请求并回应客户端的过程
ServiceManager是通过binder_parse()的函数来处理请求的: 这个函数中我们只关心BR_TRANSACTION分支,通过调用func去解析拿到的请求,然后把返回值作为回应通过binder_send_reply()函数返回给客户端。3.2.1、处理请求过程
我们先来看一下请求的处理过程,也就是func()的流程,这里的func来自于调用binder_loop()时的参数: 因此func()就是svcmgr_handler(): 从svcmgr_handler的case分支我们可以看出,作为Service_manager主要完成三个功能:1、得到一个Service;
2、添加一个Service;
3、列出所有的Service;
下面我们分别看一下这三个功能的实现方式,我们先从add一个Service开始: 从add的过程可以看出,所谓向ServiceManager注册一个服务,其实就是为当前的Service创建svcinfo的结构体,并把该结构体添加到svclist中。
那么我们可以推测,find的过程无非就是去svclist中查找svcinfo的过程: 这个过程确实如我们所料,需要通过find_svc()在svclist中寻找需要的Service并把该Service节点发送给请求的Client。
那么list Service的请求只需要把svclist返回给Client即可:
经过这些过程,ServiceManager就完成了解析数据的过程,下面就需要把相应的数据返回给客户端。
3.2.2、回应客户端的过程
在3.2.1中的三个请求处理过程中,特别是get和list Service的请求,最终都需要给客户端相应回应的,我们看到在这两个请求的处理最后,都将相应的回应数据放入了reply的指针中,当从svcmgr_handler()返回后,就把数据带到了binder_parse()中,我们再来回顾一下这里的代码: 在binder_parse()中又调用binder_send_reply()函数完成回应的操作: 在给Binder发送返回值时,构建了data的数据,并把reply放入其中,并标记了数据的大小,最后通过binder_write()函数将数据写到Binder中,而且写的方法仍然是调用ioctl()。经过以上步骤,就完成了一次完整的请求调用过程。
四、总结
我们用两张图来总结ServiceManager提供服务的过程。4.1、ServiceManager初始化流程
4.2、ServiceManager处理事务的流程
原文地址:http://blog.csdn.net/u010961631/article/details/19838637
0 0
- Binder源码分析之ServiceManager(原)
- Binder源码分析之ServiceManager(原)
- Binder源码分析之ServiceManager
- Binder源码分析之驱动层(原)
- Binder源码分析之Java层(原)
- Binder源码分析之Native层(原)
- Binder源码分析之驱动层(原)
- Binder源码分析之Native层(原)
- Binder源码分析之Java层(原)
- android binder --- ServiceManager启动分析
- ServiceManager源码分析
- Android源码(10) --- Binder(4) ServiceManager 启动
- Binder学习之获取ServiceManager对象
- Android Binder机制浅析之ServiceManager
- Android Binder机制浅析之ServiceManager
- Android笔记 - Binder之守护进程servicemanager
- Android笔记 - Binder之servicemanager代理对象
- 五、Android Binder机制浅析之ServiceManager
- 应用层的AIDL用法(原)
- 函数模板深入研究
- Framework中的AIDL(原)
- 【hdu 1711】 Number Sequence KMP模板
- 两种AIDL用法分析(原)
- Binder源码分析之ServiceManager(原)
- Binder源码分析之驱动层(原)
- Binder源码分析之Native层(原)
- 让你的「微信小程序」运行在Chrome浏览器上,让我们使用WebStorm
- Binder源码分析之Java层(原)
- Unity3D 5.3 新版AssetBundle使用方案及策略
- linux 红黑树代码
- Coursera Machine Learning Week 7 - Support Vector Machines
- 痛悟的一天_更新