MediaServer简单分析

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;

// 列举所有服务

你可能感兴趣的:(String,service,服务器,Module,Path,include)