2018-09-15之MediaServer小記

無意中閱讀到了mediaserver這個本地服務(wù)的代碼。其模塊主要路徑為源碼根目錄下:

./frameworks/av/media/mediaserver/

而其內(nèi)包含有mediaserver服務(wù)的main入口,即C++文件:

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

該文件內(nèi)容為:

#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();

}

通過上述內(nèi)容發(fā)現(xiàn),main函數(shù)內(nèi),調(diào)用到了這幾句話:

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

? ? sp<IServiceManager> sm(defaultServiceManager());

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

? ? ……

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

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

這幾句代碼在了解Binder的實(shí)現(xiàn)機(jī)制的時候看到過,其作用就是mediaserver作為服務(wù)的進(jìn)程載體,并且啟動線程來監(jiān)控通過binder驅(qū)動transition動作過來的服務(wù)請求,即接收消息,大致是這么個意思。

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

1.??????打開/dev/binder設(shè)備,這就相當(dāng)于與內(nèi)核的binder驅(qū)動建立了交互的通道。

2.??????對于返回的fd使用mmap,這樣binder驅(qū)動就會分配一塊內(nèi)存用來傳遞數(shù)據(jù)。

3.??????由于ProcessState具有唯一性,因此一個進(jìn)程只能打開設(shè)備一次。

其中,defaultServiceManager()函數(shù)返回一個IserviceManager的對象。通過這個對象,我們就能和遠(yuǎn)程的ServiceManager進(jìn)程建立交互連接了。

該記之目的,即是理解到,native的服務(wù)進(jìn)程就是如上承載了其上各種服務(wù)的進(jìn)程載體的作用,并且以進(jìn)程的方式對應(yīng)到binder驅(qū)動中負(fù)責(zé)消息的通訊。

另外,通過mediaserver模塊下的mk文件:

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

內(nèi)容如下:

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)

其內(nèi)同時引入了‘libmediaplayerservice’、‘mediaresourcemanager’的模塊代碼,即mediaserver服務(wù)進(jìn)程至少提供了mediaplayer和mediaresourcemanager兩類服務(wù)。

最后附上一張時序圖:

mediaserver啟動時序圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容