Android源码分析--MediaServer源码分析(一)

MediaServer中包括了系统中的许多重要的Server:AudioFlinger:音频系统中的核心服务AudioPolicyService:音频系统中关于音频策略的重要服务MediaPlayerService:多媒体系统中的重要服务CameraService:有关照相和摄像的重要服务同时,分析MediaServer对于理解Android中的IPC机制能够提供较好的帮助。Android
摘要由CSDN通过智能技术生成

MediaServer中包括了系统中的许多重要的Server:

  • AudioFlinger:音频系统中的核心服务
  • AudioPolicyService:音频系统中关于音频策略的重要服务
  • MediaPlayerService:多媒体系统中的重要服务
  • CameraService:有关照相和摄像的重要服务

同时,分析MediaServer对于理解Android中的IPC机制能够提供较好的帮助。Android系统基本上可以看做是一个基于Binder机制的C/S架构,对于Binder机制的理解相对比较复杂,如果能够通过具体的例子入手会比较容易理解。

Android的通信体制架构

Android的通信机制基本上可以看做是Client、Server和ServiceManager三者之间的交互:

  1. Server首先要注册一些Service到ServiceManager,在这里Server是ServiceManager的客户端;
  2. 如果某个Client要使用Service,则首先到ServiceManager中获得该Service的相关信息,所有Client是ServiceManager的客户端;
  3. Client得到Service信息,然后和该Service所在的Server进程建立通信之后使用Service,在这里Client是Server的客户端。
    在这些交互的过程中,Android系统都是使用的Binder来进行通信。

MediaServer入口函数

MS是一个可执行程序,它的入口函数是main函数,所在文件位置:frameworks\base\media\mediaserver\main_mediaserver.cpp
代码如下:

int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    ALOGI("ServiceManager: %p", sm.get());
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate();
    AudioPolicyService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

可以看到,在main函数中,

  1. 我们首先获得了一个ProcessState的实例,由self方法我们可以猜得到该类使用了单例模式;
  2. 接下来我们调用了defaultServiceManager方法获得IServiceManager实例;
  3. 接下来进行了几个重要服务的初始化工作;
  4. 调用startThreadPool方法和joinThreadPool方法。

ProcessState类的分析

文件位置:frameworks\base\libs\binder\ProcessState.cpp
self方法:在main函数中,我们调用了self方法得到了一个ProcessState实例,下面我们来看看这个方法

sp<ProcessState> ProcessState::self()
{
    if (gProcess != NULL) return gProcess;
    //提供原子操作
    AutoMutex _l(gProcessMutex);
    if (gProcess == NULL) gProcess = new ProcessState;
    return gProcess;
}

可以看到,不出所料,ProcessState使用的就是单例模式。
接下来我们来看一看ProcessState的构造函数:

ProcessState::ProcessState()
    : mDriverFD(open_driver())
    , mVMStart(MAP_FAILED)
    , mManagesContexts(false)
    , mBinderContextCheckFunc(NULL)
    , mBinderContextUserData(NULL)
    , mThreadPoolStarted(false)
    , mThreadPoolSeq(1)
{
    if (mDriverFD >= 0) {
        // XXX Ideally, there should be a specific define for whether we
        // have mmap (or whether we could possibly have the kernel module
        // availabla).
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值