android binder 进程间通信机制4-Service Manager
Service Manager 是Binder进程间通信的核心组件之一:
它扮演者Binder进程间通信上下文(Context Manager)的角色
负责管理系统中的Service组件
向Client组件提供获取代理对象的服务
一、Service Manager的启动
1、ServiceManager是由init负责启动的,启动脚本在system/core/rootdir/init.rc中。
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
关键字service,表明ServiceManager是以服务形式启动的
关键字user,指明以systemm身份运行
关键字critical, 指明是系统的关键服务。
关键字onrestart, 指明serviceManager重启后需要重启那些进程。
2、serviceManager的代码路径:framworks/native/cmds/servicemanager
入口函数为service_manager.c的main 函数。
流程大致如下:
binder_open:打开dev/binder设备并映射到进程的地址空间,会触发调用binder驱动程序的binder_open和binder_mmap,为其构造binder_proc结构体。
binder_become_context_manager:通过ioctl系统调用,使用BINDER_SET_CONTEXT_MGR协议,与Binder驱动程序通信,ioctl调用会触发调用binder_ioctl调用,其中为ServiceManager进程创建了当前线程的binder_thread机构体。然后会在全局变量binder_context_mgr_node中保存该进程的binder_node,同时在binder_context_mgr_uid中保存当前进程的有效用户ID,这样就表明了ServiceManager的管理者身份。
binder_loop: 在第二步为ServiceManager进程生成binder_thread机构体时,将它的状态设置为了完成当前操作立刻返回(BINDER_LOOPER_STATE_NEED_RETURN),这样的标志会使ServiceManager的Binder线程设置为没有做好进程间通信的准备,从而不接收进程间通信的请求。binder_loop会先通过BINDER_WRITE_READ发送BC_ENTER_LOOP协议,告知Binder驱动程序,ServiceManager的主线程已可以接收进程间通信请求了。之后binder_loop会使用BINDER_WRITE_READ不间断检测是否有待处理的请求,如果有则交由binder_parse解析命令并处理。Binder驱动程序内部对应的处理BINDER_WRITE_READ的函数为:binder_thread_write和binder_thread_read。
二、ServiceManager代理对象的获取
ServiceManager代理对象类型为BpServiceManager,它用来描述一个实现了IServiceManage接口的Client组件。
实现结构可参考Client组件的实现原理图,将其中的XXXX替换为ServiceManager即可。
不同之处在于,一般Service代理对象的获取为Client发起请求,Binder驱动程序返回一个句柄值,根据该句柄值创建一个Binder代理对象。而ServiceManager的句柄值恒定为0,所以省去了与Binder驱动程序交互的过程。
获取代理的调用为defaultServiceManager(),在IServiceManager.cpp中实现。
其过程为:
1、获取ServiceManager进程的ProcessState对象,可通过ProcessState.self()实现
2、在构造ProcessState的过程中会打开dev/binder设备并映射到Client进程,该过程活得了用于传递通信数据的内核缓冲区。
3、调用ProcessState的函数getContextObject,获取Binder代理对象BpBinder,此处handle为0.
4、使用interface_cast,在其中将BpBinder包装成BpServiceManager。并返回该对象的接口IServiceManager的强引用sp<IServiceManager>。
android binder 进程间通信机制4-Service Manager的更多相关文章
- android binder 进程间通信机制1-binder 驱动程序
以下内容只大概列个提纲,若要明白其中细节,还请看源码: 申明:本人菜鸟,希望得到大神指点一二,余心足已 binder 设备:/dev/binder binder 进程间通信涉及的四个角色: Clien ...
- android binder 进程间通信机制5-Service注册和代理对象的获取
ServiceManager,其实也是一个Service,不过它的Server端实现并未使用Binder库的结构实现,而是直接打开binder/dev进行通信的,不具有普遍性. 下面以MediaSer ...
- android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口
Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口 在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理. 一 ...
- android binder 进程间通信机制3-Binder 对象生死
以下概述Binder通信过程中涉及到的四个对象:Binder本地对象.Binder实体对象.Binder引用对象.Binder代理对象的生死. 1.Binder通信的交互过程 1.Client 进程发 ...
- android binder 进程间通信机制2 - Binder进程间通信库实现原理
1.Service组件 使用模板类BnInterface描述,称为Binder本地对象,对应于Binder驱动程序中的Binder实体对象 实现原理图如下:
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...
随机推荐
- RBAC-权限管理设计
1.RBAC(Role-Based Access Control)——基于角色的访问控制.简单来说每个角色有不同的权限,通过对用户赋予不同角色来赋予其对应权限. 2.RBAC0:最基本的用户角色多对多 ...
- strcmp函数和memcmp函数的用法区别及联系
前言: C语言中有很多东西容易搞混,最近笔者就遇到了一个问题.这里做个记录.就是memcmp和strcmp两者的用法,这里做个对比: 功能对比: A memcmp: 函数原型: int memcmp( ...
- 中移动物联手机端APP软件
https://open.iot.10086.cn/doc/book/device-develop/multpro/sdk-doc-tool/APP.html
- vue-element-admin在install的时候关于sass的错误信息
vue-element-admin在install的是报关于sass的错误信息 今天使用vue-element-admin给自己弄的一个微信小程序编写一个后台管理系统的时候,报关于sass的错误,下载 ...
- WebShell代码分析溯源(四)
WebShell代码分析溯源(四) 一.一句话变形马样本 <?php @$_++;$__=("`"^"?").(":"^"} ...
- python高阶函数——返回函数(闭包)
首先,来看一个一般意义的求和: >>> def cal_sum(*args): ... sum = 0 ... for i in args: ... sum = sum + i .. ...
- .Net Core 使用 NPOI 导入Excel
由于之前在网上查阅一些资料发现总是不能编译通过,不能正常使用,现把能正常使用的代码贴出: /// <summary> /// Excel导入帮助类 /// </summary> ...
- 熔断器Hystrix及服务监控Dashboard
服务雪崩效应 当一个请求依赖多个服务的时候: 正常情况下的访问 : 但是,当请求的服务中出现无法访问.异常.超时等问题时(图中的I),那么用户的请求将会被阻塞. 如果多个用户的请求中,都存在无法访问的 ...
- 有了AOE,妈妈再也不用担心我的模型管理!
前言 越来越多的业务会用到AI相关的技术,大多数的AI模型是部署在云端使用的,毕竟服务端计算更快,管理也更容易.随着终端设备性能提升,在终端使用 AI 模型有了更大的价值,可以更好满足业务对响应实时性 ...
- HTTP Error 500.19 - Internal Server Error 无法读取配置文件
将Code移动文件夹就报以下错误,http error 500.19 - internal server error. 项目文件下.vs=>config=>applicationhost. ...