無意中閱讀到了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ù)。
最后附上一張時序圖:
