Binder进程间通信系统第三篇-----Binder进程间通信之 MediaServer 简析
发布日期:2021-05-07 13:27:20 浏览次数:12 分类:精选文章

本文共 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系统的功能扩展提供了强大的支持。

上一篇:Android 修改属性权限小技巧
下一篇:Binder进程间通信系统第五篇-----Binder进程间通信实例

发表评论

最新留言

很好
[***.229.124.182]2025年04月09日 10时47分46秒