无意中阅读到了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两类服务。
最后附上一张时序图: