美文网首页
2018-09-15之MediaServer小记

2018-09-15之MediaServer小记

作者: Walter_Hu | 来源:发表于2018-09-15 23:02 被阅读21次

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

    ./frameworks/av/media/mediaserver/

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

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

    该文件内容为:

    #define LOG_TAG "mediaserver"

    //#define LOG_NDEBUG 0

    #include <binder/IPCThreadState.h>

    #include <binder/ProcessState.h>

    #include <binder/IServiceManager.h>

    #include <utils/Log.h>

    #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<ProcessState> proc(ProcessState::self());

        sp<IServiceManager> sm(defaultServiceManager());

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

        InitializeIcuOrDie();

        MediaPlayerService::instantiate();

        ResourceManagerService::instantiate();

        registerExtensions();

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

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

    }

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

        sp<ProcessState> proc(ProcessState::self());

        sp<IServiceManager> 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 \

            android.hardware.media.omx@1.0 \

    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两类服务。

    最后附上一张时序图:

    mediaserver启动时序图

    相关文章

      网友评论

          本文标题:2018-09-15之MediaServer小记

          本文链接:https://www.haomeiwen.com/subject/xzztnftx.html