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的更多相关文章

  1. android binder 进程间通信机制1-binder 驱动程序

    以下内容只大概列个提纲,若要明白其中细节,还请看源码: 申明:本人菜鸟,希望得到大神指点一二,余心足已 binder 设备:/dev/binder binder 进程间通信涉及的四个角色: Clien ...

  2. android binder 进程间通信机制5-Service注册和代理对象的获取

    ServiceManager,其实也是一个Service,不过它的Server端实现并未使用Binder库的结构实现,而是直接打开binder/dev进行通信的,不具有普遍性. 下面以MediaSer ...

  3. android binder 进程间通信机制6-Binder进程间通信机制的JAVA接口

    Binder间进程通信的JAVA层接口,主要是通过JNI方法来调用Binder库的C/C++接口 在JAVA层,将Service组件称为JAVA服务,Service组件的代理称为JAVA服务代理. 一 ...

  4. android binder 进程间通信机制3-Binder 对象生死

    以下概述Binder通信过程中涉及到的四个对象:Binder本地对象.Binder实体对象.Binder引用对象.Binder代理对象的生死. 1.Binder通信的交互过程 1.Client 进程发 ...

  5. android binder 进程间通信机制2 - Binder进程间通信库实现原理

    1.Service组件 使用模板类BnInterface描述,称为Binder本地对象,对应于Binder驱动程序中的Binder实体对象 实现原理图如下:

  6. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...

  7. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信 ...

  8. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  9. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

随机推荐

  1. RBAC-权限管理设计

    1.RBAC(Role-Based Access Control)——基于角色的访问控制.简单来说每个角色有不同的权限,通过对用户赋予不同角色来赋予其对应权限. 2.RBAC0:最基本的用户角色多对多 ...

  2. strcmp函数和memcmp函数的用法区别及联系

    前言: C语言中有很多东西容易搞混,最近笔者就遇到了一个问题.这里做个记录.就是memcmp和strcmp两者的用法,这里做个对比: 功能对比: A memcmp: 函数原型: int memcmp( ...

  3. 中移动物联手机端APP软件

    https://open.iot.10086.cn/doc/book/device-develop/multpro/sdk-doc-tool/APP.html

  4. vue-element-admin在install的时候关于sass的错误信息

    vue-element-admin在install的是报关于sass的错误信息 今天使用vue-element-admin给自己弄的一个微信小程序编写一个后台管理系统的时候,报关于sass的错误,下载 ...

  5. WebShell代码分析溯源(四)

    WebShell代码分析溯源(四) 一.一句话变形马样本 <?php @$_++;$__=("`"^"?").(":"^"} ...

  6. python高阶函数——返回函数(闭包)

    首先,来看一个一般意义的求和: >>> def cal_sum(*args): ... sum = 0 ... for i in args: ... sum = sum + i .. ...

  7. .Net Core 使用 NPOI 导入Excel

    由于之前在网上查阅一些资料发现总是不能编译通过,不能正常使用,现把能正常使用的代码贴出: /// <summary> /// Excel导入帮助类 /// </summary> ...

  8. 熔断器Hystrix及服务监控Dashboard

    服务雪崩效应 当一个请求依赖多个服务的时候: 正常情况下的访问 : 但是,当请求的服务中出现无法访问.异常.超时等问题时(图中的I),那么用户的请求将会被阻塞. 如果多个用户的请求中,都存在无法访问的 ...

  9. 有了AOE,妈妈再也不用担心我的模型管理!

    前言 越来越多的业务会用到AI相关的技术,大多数的AI模型是部署在云端使用的,毕竟服务端计算更快,管理也更容易.随着终端设备性能提升,在终端使用 AI 模型有了更大的价值,可以更好满足业务对响应实时性 ...

  10. HTTP Error 500.19 - Internal Server Error 无法读取配置文件

    将Code移动文件夹就报以下错误,http error 500.19 - internal server error. 项目文件下.vs=>config=>applicationhost. ...