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. oc:定时删除ES日志数据释放空间

    修改方法: 1.直接编辑修改 查看当前logging-curator配置,了解当前定时删除大的策略. oc edit configmap/logging-curator 打开后,可以直接编辑保存. 2 ...

  2. Orcle如何获取当前时间

    Oracle获取当月所有日期: SELECT TRUNC(SYSDATE, 'MM') + ROWNUM - 1 FROM DUAL CONNECT BYROWNUM <= TO_NUMBER( ...

  3. Docker Compose安装Registry后配置WebUI与客户端

    场景 Docker 私服Registry简介与使用Docker-Compose安装Registry: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  4. MySQL 字符串分隔成行&子串统计

    利用help_topic表把字符串转换成行(分隔符号',') ),) as `id` FROM mysql.`help_topic`; 统计字符串每个子串出现次数(分隔符号',') ),) AS `s ...

  5. ABAP分享四 选择屏幕下拉菜单简单实现示例

    PARAMETERS p_carri2 LIKE spfli-carrid                    AS LISTBOX VISIBLE LENGTH 20                ...

  6. OPENGL 坐标轴转换

    坐标轴 平移 旋转 缩放 重置坐标轴 矩阵操作 示例 1.坐标轴  OpenGL 使用的右手坐标系,从正面看原点,逆时针旋转被认为是正旋转. x轴:从左到右 y轴:从底部向上 z轴:从屏幕背向朝向前方 ...

  7. 请求*.html后缀无法返回json数据的问题

    在springmvc中请求*.html不可以返回json数据. 修改web.xml,添加url拦截格式.

  8. InnoDB On-Disk Structures(三)--Tablespaces (转载)

    转载.节选于 https://dev.mysql.com/doc/refman/8.0/en/innodb-tablespace.html This section covers topics rel ...

  9. kubernets学习笔记

    K8s CI :持续集成CD :持续交付 D --DeliveryCD :持续部署 D --Deployment Kubernetes Cluster: Masters: (3-host 做高可用)A ...

  10. [专题总结]初探插头dp

    彻彻底底写到自闭的一个专题. 就是大型分类讨论,压行+宏定义很有优势. 常用滚动数组+哈希表+位运算.当然还有轮廓线. Formula 1: 经过所有格子的哈密顿回路数. 每个非障碍点必须有且仅有2个 ...