A
droid的bi
der机制研究(C部分)(一)概述a
droid的bi
der机制提供一种进程间通信的方法,使一个进程可以以类似远程过程调用的形式调用另一个进程所提供的功能。bi
der机制在Java环境和CC环境都有提供。a
droid的代码中,与CC的bi
der包括一些类型和接口的定义和实现,相关的代码在下面这几个文件中:java代码:1frameworksbasei
clude II
terfaceh2frameworksbasei
clude Bi
derh3frameworksbasei
clude BpBi
derh4frameworksbasei
clude IBi
der5frameworksbasei
clude Parcelh6frameworksbasei
clude IPCThreadStateh7frameworksbasei
clude ProcessStateh8frameworksbaselibs Bi
dercpp9frameworksbaselibs BpBi
dercpp10frameworksbaselibs II
terfacecpp11frameworksbaselibs IPCThreadStatecpp12frameworksbaselibs Parcelcpp13frameworksbaselibs ProcessStatecpp复制代码为了了解这些类、接口之间的关系以及bi
der的实现机制,最好是结合一个例子来进行研究。我选择的例子是a
droid自带的媒体播放器的实现。其媒体播放器的相关代码在下面这些目录中:frameworksbasei
cludemediaframeworksbasemedia使用startUML的反向工程功能分析上面这些代码,并进行了一定的整理之后,得到下面这幅类图
A
droid的媒体播放功能分成两部分,一部分是媒体播放应用,一部分是媒体播放服务(MediaServer,在系统启动时由i
it所启动,具可参考i
itrc文件)。这两部分分别跑在不同的进程中。媒体播放应用包括Java程序和部分C代码,媒体播放服务是C代码,并且需要调用外部模块ope
core来实现真正的媒体播放。媒体播放应用和媒体播放服务之间需要通过bi
der机制来进行相互调用,这些调用包括:
f(1)媒体播放应用向媒体播放服务发控制指令(2)媒体播放服务向媒体播放应用发事件通知(
otify)媒体播放服务对外提供多个接口,在上面得图中包括其中的2个接口:IMediaService和IMediaPlayer,IMediaService用于创建和管理播放实例,而IMediaplayer接口则是播放接口,用于实现指定媒体文件的播放以及播放过程的控制。
上面的图中还有媒体播放应用向媒体播放服务提供的1个接口:IMediaPlayerClie
t,用于接收
otify。这些接口因为需要跨进程调用,因此需要用到bi
der机制。每个接口包括两部分实现,一部分是接口功能的真正实现(B
I
terface),这部分运行在接口提供进程中;另一部分是接口的proxy(BpI
terface),这部分运行在调用接口的进程中。bi
der的作用就是让这两部分之间建立联系。下图是整个播放器的一个概要说明。
媒体播放器比r