博客
关于我
Binder进程间通信系统第三篇-----Binder进程间通信之 MediaServer 简析
阅读量:339 次
发布时间:2019-03-04

本文共 2748 字,大约阅读时间需要 9 分钟。

Android MediaServer 之 ServiceManager 简析

一 MediaServer 之 Server端

1.1 步骤一

在Android系统中,MediaServer作为ServiceManager的客户端,其Server进程需要先向ServiceManager注册服务。具体来说,Server进程通过调用defaultServiceManager()函数获取IServiceManager接口的实例。这个函数的核心作用是创建并返回一个BpBinder对象,这个BpBinder对象作为ServiceManager的代理,负责管理系统中的各种服务。

1.2 步骤二

1.2.1 defaultServiceManager()分析

defaultServiceManager()函数通过调用ProcessState::self()->getContextObject(NULL)获取一个BpBinder对象。BpBinder是Android系统中与Binder通信相关的代理类,其主要职责是将客户端的请求转发给Binder设备。通过interface_cast函数,将BpBinder强制转换为IServiceManager接口,得到一个可以与ServiceManager交互的代理对象。

1.2.2 BpBinder 与 IServiceManager简析

1.2.2.1 BBinder简析

BBinder和BpBinder都是从IBinder类派生而来的,BBinder是Binder设备的本地代理,用于处理Binder设备本身的通信需求。而BpBinder是客户端用来与Server进程交互的代理类,p即Proxy的意思,表示BpBinder是对BBinder的代理。

1.2.2.2 IServiceManager简析

IServiceManager接口定义了ServiceManager所提供的业务逻辑,包括注册服务、查询服务、添加服务等功能。ServiceManager通过Binder机制管理系统中的各种服务,Client进程需要通过ServiceManager获取服务信息并与服务进程建立通信通路。

1.2.2.2.1 定义业务逻辑

通过DECLARE_META_INTERFACE和IMPLEMENT_META_INTERFACE宏,ServiceManager接口将业务逻辑与通信挂钩紧密结合。IServiceManager接口定义了几个关键方法,用于管理服务的生命周期和与客户端的交互。

1.2.2.2.2 业务与通信挂钩

ServiceManager通过Binder机制实现服务的动态注册和发现。客户端可以通过IServiceManager的getService方法获取所需服务的BpBinder对象,并通过interface_cast将其转换为具体的服务接口,完成与服务进程的通信。

1.3 步骤三

在MediaServer的Server端,通信的工作交给BpBinder处理。具体来说,BpBinder通过transact()方法与Binder设备进行通信。transact()方法将请求打包成Parcel数据,并通过IPCThreadState进行处理,完成与Binder设备的交互。

1.3.1 将通信的工作交给 BpBinder

在MediaPlayerService的instantiate()方法中,通过调用defaultServiceManager()获取ServiceManager代理,并调用addService方法将MediaPlayerService注册到ServiceManager中。这个过程将请求数据打包成Parcel,包含接口令、服务名称、服务实例等信息,然后通过BpBinder的transact方法提交到Binder设备。

1.3.2 BpBinder->transact()分析

BpBinder的transact方法通过调用IPCThreadState::self()->transact()完成与Binder设备的通信。IPCThreadState类负责管理进程间的通信,包括线程本地存储空间和Binder设备的交互。

1.3.3 分析 IPCThreadState

IPCThreadState是进程间通信的核心类,负责管理线程本地存储空间和Binder设备的交互。transact方法通过writeTransactionData和waitForResponse完成数据的传输和响应的等待。

二 MediaServer 之 Client端

在Client端,想要使用MediaServer的服务,需要先通过ServiceManager获取相应的服务信息。具体来说,Client进程通过调用getService方法获取BpBinder对象,并通过interface_cast将其转换为具体的MediaPlayerService接口,完成与服务进程的通信。

2.1 查询 ServiceManager

通过调用ServiceManager的getService方法,Client进程可以获取对应的BpBinder对象。这个过程可能需要多次尝试,因为ServiceManager上可能尚未注册对应的服务。在这种情况下,Client进程需要等待直到服务注册完成。

2.2 获取 MediaPlayerService

在IMediaDeathNotifier类中,通过getMediaPlayerService方法获取MediaPlayerService的BpBinder对象。该方法首先获取ServiceManager代理,然后循环调用getService方法直到成功获取到BpBinder对象。成功获取后,将BpBinder对象通过interface_cast转换为MediaPlayerService接口,完成与服务进程的通信。

三 MediaServer 之 ServiceManager 简析

ServiceManager是Android系统中管理系统服务的核心组件。它通过Binder机制实现服务的动态注册、发现和管理。ServiceManager的Server进程向ServiceManager注册服务,Client进程通过ServiceManager获取服务信息并与服务进程建立通信通路。

通过以上分析可以看出,ServiceManager在Android系统中的重要性。它不仅管理着系统中的各种服务,还通过Binder机制实现了进程间的通信与交互,为Android系统的功能扩展提供了强大的支持。

转载地址:http://bqme.baihongyu.com/

你可能感兴趣的文章
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
查看>>
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
查看>>
C语言的数值溢出问题(上)
查看>>
函数指针的典型应用-计算函数的定积分(矩形法思想)
查看>>
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
查看>>
用 wxPython 打印你的 App
查看>>
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
查看>>
android:使用audiotrack 类播放wav文件
查看>>
聊聊我的五一小假期
查看>>
CSS position属性static/relative/absolute/fixed/sticky用法总结
查看>>
LeetCode:28. 实现 strStr()——————简单
查看>>
Lionheart万汇:布林线双底形态分析技巧
查看>>
数据库三个级别封锁协议
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
Java求逆波兰表达式的结果(栈)
查看>>
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
查看>>
SLAM学习笔记-求解视觉SLAM问题
查看>>
普歌-允异团队-HashMap面试题
查看>>
还在一个一个手动安装虚拟机吗?Cobbler自动部署装机一键最小化安装打把游戏就好了
查看>>
程序员应该知道的97件事
查看>>