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 ...
随机推荐
- 文件系统之parted 分区
parted分区命令 1.分区表区别 我们 Linux 系统中有两种常见的分区表 MBR 分区表(主引导记录分区表)和 GPT 分区表(GUID 分 区表) MBR 分区表:支持的最大分区是 2TB( ...
- WebShell代码分析溯源(六)
WebShell代码分析溯源 一.一句话变形马样本 <?php call_user_func('assert', $_REQUEST['assert']); ?> 二.代码分析 1.分析代 ...
- How to: Specify a Display Member (for a Lookup Editor, Detail Form Caption, etc.)如何:指定显示成员(用于查找编辑器、详细信息表单标题等)
Each business object used in an XAF application should have a default property. The default property ...
- jQuery随笔记录
DOM遍历 parent()方法返回所选元素的直接父元素.(parent() 只能遍历单个级别的 DOM树) parents()方法获取所选元素的所有祖先 children()所选元素 ...
- JavaScript 自定义html元素鼠标右键菜单
自定义html元素鼠标右键菜单 实现思路 在触发contextmenu事件时,取消默认行为(也就是阻止浏览器显示自带的菜单),获取右键事件对象,来确定鼠标的点击位置,作为显示菜单的left和top值 ...
- [转]为何选择 Flink
本文转自:https://www.ituring.com.cn/book/tupubarticle/23229 第 1 章 为何选择 Flink 人们对某件事的正确理解往往来自基于有效论据的结论.要获 ...
- Android RecyclerView SearchView基本用法1
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/82 背景: 做了很多年的app开发,貌似没见过没有搜索功能 ...
- SQL Server如何通过Page_ID找到对应的表
其实本篇文章算是翻译Finding a table name from a page ID这篇文章,只是不想直接翻译.用自己的理解叙说出来.算是对上一篇博客"SQL Server如何找出一个 ...
- ORDER BY导致索引使用不理想
在MySQL中经常出现未按照理想情况使用索引的情况,今天记录一种Order by语句的使用导致未按预期使用索引的情况. 1. 问题现象 1.1 SQL语句: SELECT DISTINCT p.* ...
- [洛谷P1144][题解]最短路计数
这道题可以用各种算法踩掉,我选择的是SPFA. 因为题目要求计数,所以我们开一个ans数组表示数量. 分两种情况讨论: 一:dis_v>dis_u+1 最短路被更新了,可以直接ans_v=ans ...