android上的多媒体服务是有一个叫做 mediaserver 的服务进程提供的。这个进程通过 binder 的进程间通信方式来完成其他进程(如音乐播放器)的请求。
mediaserver服务器进程的实现代码在 /frameworks/base/media/mediaserver 目录下,代码很小。
该目录下的Android.mk 文件:
LOCAL_PATH: = $( call my- dir) include $( CLEAR_VARS) LOCAL_SRC_FILES: = / main_mediaserver. cpp LOCAL_SHARED_LIBRARIES : = / libaudioflinger / libcameraservice / libmediaplayerservice / libutils / libbinder base : = $( LOCAL_PATH) / . . / . . LOCAL_C_INCLUDES : = / $( base) / libs/ audioflinger / $( base) / camera/ libcameraservice / $( base) / media/ libmediaplayerservice LOCAL_MODULE: = mediaserver include $( BUILD_EXECUTABLE) |
最后编译出来的是mediaserver ,这个进程可以在模拟器或设备系统中的 /system/sbin/ 目录下找到。
服务器进程的实现源码:
// System headers required for setgroups, etc. # include < sys/ types. h> # include < unistd. h> # include < grp. h> # include < binder/ IPCThreadState. h> # include < binder/ ProcessState. h> # include < binder/ IServiceManager. h> # include < utils/ Log . h> # include < AudioFlinger. h> # include < CameraService. h> # include < MediaPlayerService. h> # include < AudioPolicyService. h> # include < private / android_filesystem_config. h> using namespace android; int main( int argc, char * * argv) { sp< ProcessState> proc( ProcessState: : self( ) ) ; // 进程状态 sp< IServiceManager> sm = defaultServiceManager( ) ; // 服务器管理器 LOGI( "ServiceManager: %p" , sm. get( ) ) ; AudioFlinger: : instantiate( ) ; // addService -- "media.audio_flinger" MediaPlayerService: : instantiate( ) ; // addService -- "media.player" CameraService: : instantiate( ) ; // addService -- "media." AudioPolicyService: : instantiate( ) ; // addService -- "media.audio_policy" ProcessState: : self( ) - > startThreadPool( ) ; // IPCThreadState: : self( ) - > joinThreadPool( ) ; // } |
[1]
也就是说,在启动系统的时候,mediaserver 会启动,这样也会随之添加了服 务: media.audio_flinger, media.player, media.camera, media.audio_policy 。
这些服务会响应来自上层的MediaPlayer 的服务请求,主要有声音播放,多 媒体文件的播放,摄像头操作,音频管理等。
[2]
在以上main() 函数中, defaultServiceManager() 函数获取到当前的服务管理器 (IServiceManager) 。
//IServiceManager类是一个接口,主要定义的接口函数有:
virtual sp< IBinder> getService( const String16& name) const = 0;
// 获取某个服务(若该服务不存在,则阻塞几秒钟)
virtual sp< IBinder> checkService( const String16& name) const = 0;
// 检查某个服务(若服务不存在,不阻塞)
virtual status_t addService( const String16& name, const sp< IBinder> & service) = 0;
// 添加一个服务
virtual Vector < String16> listServices( ) = 0;
// 列举所有服务