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;

// 列举所有服务


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值