2018-09-15之MediaServer小记

无意中阅读到了mediaserver这个本地服务的代码。其模块主要路径为源码根目录下:

./frameworks/av/media/mediaserver/

而其内包含有mediaserver服务的main入口,即C++文件:

./frameworks/av/media/mediaserver/main_mediaserver.cpp

该文件内容为:

#define LOG_TAG "mediaserver"

//#define LOG_NDEBUG 0

#include

#include

#include

#include

#include "RegisterExtensions.h"

// from LOCAL_C_INCLUDES

#include "IcuUtils.h"

#include "MediaPlayerService.h"

#include "ResourceManagerService.h"

using namespace android;

int main(int argc __unused, char **argv __unused)

{

    signal(SIGPIPE, SIG_IGN);

    sp proc(ProcessState::self());

    sp sm(defaultServiceManager());

    ALOGI("ServiceManager: %p", sm.get());

    InitializeIcuOrDie();

    MediaPlayerService::instantiate();

    ResourceManagerService::instantiate();

    registerExtensions();

    ProcessState::self()->startThreadPool();

    IPCThreadState::self()->joinThreadPool();

}

通过上述内容发现,main函数内,调用到了这几句话:

    sp proc(ProcessState::self());

    sp sm(defaultServiceManager());

    ALOGI("ServiceManager: %p", sm.get());

    ……

    ProcessState::self()->startThreadPool();

    IPCThreadState::self()->joinThreadPool();

这几句代码在了解Binder的实现机制的时候看到过,其作用就是mediaserver作为服务的进程载体,并且启动线程来监控通过binder驱动transition动作过来的服务请求,即接收消息,大致是这么个意思。

其中,ProcessState:self()的作用是:

1.      打开/dev/binder设备,这就相当于与内核的binder驱动建立了交互的通道。

2.      对于返回的fd使用mmap,这样binder驱动就会分配一块内存用来传递数据。

3.      由于ProcessState具有唯一性,因此一个进程只能打开设备一次。

其中,defaultServiceManager()函数返回一个IserviceManager的对象。通过这个对象,我们就能和远程的ServiceManager进程建立交互连接了。

该记之目的,即是理解到,native的服务进程就是如上承载了其上各种服务的进程载体的作用,并且以进程的方式对应到binder驱动中负责消息的通讯。

另外,通过mediaserver模块下的mk文件:

./frameworks/av/media/mediaserver/Android.mk

内容如下:

LOCAL_PATH:= $(call my-dir)

ifneq ($(BOARD_USE_CUSTOM_MEDIASERVEREXTENSIONS),true)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := register.cpp

LOCAL_MODULE := libregistermsext

LOCAL_MODULE_TAGS := optional

LOCAL_CFLAGS := -Werror -Wall

include $(BUILD_STATIC_LIBRARY)

endif

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \

        main_mediaserver.cpp

LOCAL_SHARED_LIBRARIES := \

        libresourcemanagerservice \

        liblog \

        libmediaplayerservice \

        libutils \

        libbinder \

        libicuuc \

        [email protected] \

LOCAL_STATIC_LIBRARIES := \

        libicuandroid_utils \

        libregistermsext

LOCAL_C_INCLUDES := \

        frameworks/av/media/libmediaplayerservice \

        frameworks/av/services/mediaresourcemanager \

LOCAL_MODULE:= mediaserver

LOCAL_32_BIT_ONLY := true

LOCAL_INIT_RC := mediaserver.rc

LOCAL_CFLAGS := -Werror -Wall

include $(BUILD_EXECUTABLE)

其内同时引入了‘libmediaplayerservice’、‘mediaresourcemanager’的模块代码,即mediaserver服务进程至少提供了mediaplayer和mediaresourcemanager两类服务。

最后附上一张时序图:

2018-09-15之MediaServer小记_第1张图片
mediaserver启动时序图

你可能感兴趣的:(2018-09-15之MediaServer小记)