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 ...
随机推荐
- oc:定时删除ES日志数据释放空间
修改方法: 1.直接编辑修改 查看当前logging-curator配置,了解当前定时删除大的策略. oc edit configmap/logging-curator 打开后,可以直接编辑保存. 2 ...
- Orcle如何获取当前时间
Oracle获取当月所有日期: SELECT TRUNC(SYSDATE, 'MM') + ROWNUM - 1 FROM DUAL CONNECT BYROWNUM <= TO_NUMBER( ...
- Docker Compose安装Registry后配置WebUI与客户端
场景 Docker 私服Registry简介与使用Docker-Compose安装Registry: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...
- MySQL 字符串分隔成行&子串统计
利用help_topic表把字符串转换成行(分隔符号',') ),) as `id` FROM mysql.`help_topic`; 统计字符串每个子串出现次数(分隔符号',') ),) AS `s ...
- ABAP分享四 选择屏幕下拉菜单简单实现示例
PARAMETERS p_carri2 LIKE spfli-carrid AS LISTBOX VISIBLE LENGTH 20 ...
- OPENGL 坐标轴转换
坐标轴 平移 旋转 缩放 重置坐标轴 矩阵操作 示例 1.坐标轴 OpenGL 使用的右手坐标系,从正面看原点,逆时针旋转被认为是正旋转. x轴:从左到右 y轴:从底部向上 z轴:从屏幕背向朝向前方 ...
- 请求*.html后缀无法返回json数据的问题
在springmvc中请求*.html不可以返回json数据. 修改web.xml,添加url拦截格式.
- InnoDB On-Disk Structures(三)--Tablespaces (转载)
转载.节选于 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html This section covers topics rel ...
- kubernets学习笔记
K8s CI :持续集成CD :持续交付 D --DeliveryCD :持续部署 D --Deployment Kubernetes Cluster: Masters: (3-host 做高可用)A ...
- [专题总结]初探插头dp
彻彻底底写到自闭的一个专题. 就是大型分类讨论,压行+宏定义很有优势. 常用滚动数组+哈希表+位运算.当然还有轮廓线. Formula 1: 经过所有格子的哈密顿回路数. 每个非障碍点必须有且仅有2个 ...