创建mediaserver,以及mediaserver中运行的几个service。
1.文件frameworks/base/media/mediaserver/main_mediaserver.cpp
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate(); // 创建AudioFlinger对象, 服务名为"media.audio_flinger"
MediaPlayerService::instantiate(); // 创建MediaPlayerService对象,服务名为"media.player"
CameraService::instantiate(); // 创建CameraService对象, 服务名为"media.camera"
AudioPolicyService::instantiate(); // 创建AudioPolicyService对象,服务名为"media.audio_policy"
ProcessState::self()->startThreadPool(); // 创建线程,线程名为"Binder Thread #%d"格式,d为数字编码,例如"Binder Thread #1"
IPCThreadState::self()->joinThreadPool(); // 把上面的线程加入Binder管理,用于IPC进程间通信。
}
PoolThread继承自Thread,是一个线程类。
进程Binder最大可以支持15个线程,在open_driver()函数中设置了BINDER_SET_MAX_THREADS最大线程数。
代码位于frameworks/base/libs/binder/ProcessState.cpp文件:
#if defined(HAVE_ANDROID_OS)
size_t maxThreads = 15;
result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
if (result == -1) {
LOGE("Binder ioctl to set max threads failed: %s", strerror(errno));
}
#endif
2.以下是生成mediaserver对应的mk文件,编译生成可执行文件mediaserver
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
main_mediaserver.cpp
LOCAL_SHARED_LIBRARIES := \
libaudioflinger \
libcameraservice \
libmediaplayerservice \
libutils \
libbinder
base := $(LOCAL_PATH)/../..
LOCAL_C_INCLUDES := \
$(base)/services/audioflinger \
$(base)/services/camera/libcameraservice \
$(base)/media/libmediaplayerservice
LOCAL_MODULE:= mediaserver // mediaserver是一个可执行程序
include $(BUILD_EXECUTABLE)