MediaServer源码分析(一)

MediaServer中包括了系统中的许多重要的Server:

同时,分析MediaServer对于理解Android中的IPC机制能够提供较好的帮助。Android系统基本上可以看做是一个基于Binder机制的C/S架构,对于Binder机制的理解相对比较复杂,如果能够通过具体的例子入手会比较容易理解。

Android的通信体制架构

Android的通信机制基本上可以看做是Client、Server和ServiceManager三者之间的交互:

Server首先要注册一些Service到ServiceManager,在这里Server是ServiceManager的客户端;如果某个Client要使用Service,则首先到ServiceManager中获得该Service的相关信息,所有Client是ServiceManager的客户端;Client得到Service信息,然后和该Service所在的Server进程建立通信之后使用Service,在这里Client是Server的客户端。 在这些交互的过程中,Android系统都是使用的Binder来进行通信。MediaServer入口函数

MS是一个可执行程序,它的入口函数是main函数,所在文件位置:frameworks\base\media\mediaserver\main_mediaserver.cpp 代码如下:

int main(int argc, char** argv){sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm = defaultServiceManager();ALOGI(“ServiceManager: %p”, sm.get());AudioFlinger::instantiate();MediaPlayerService::instantiate();CameraService::instantiate();AudioPolicyService::instantiate();ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();}

可以看到,在main函数中,

ProcessState类的分析

文件位置:frameworks\base\libs\binder\ProcessState.cpp self方法:在main函数中,我们调用了self方法得到了一个ProcessState实例,下面我们来看看这个方法

sp<ProcessState> ProcessState::self(){if (gProcess != NULL) return gProcess;//提供原子操作AutoMutex _l(gProcessMutex);if (gProcess == NULL) gProcess = new ProcessState;return gProcess;}

可以看到,不出所料,ProcessState使用的就是单例模式。 接下来我们来看一看ProcessState的构造函数:

ProcessState::ProcessState(): mDriverFD(open_driver()), mVMStart(MAP_FAILED), mManagesContexts(false), mBinderContextCheckFunc(NULL), mBinderContextUserData(NULL), mThreadPoolStarted(false), mThreadPoolSeq(1){if (mDriverFD >= 0) {!defined(HAVE_WIN32_IPC)// mmap the binder, 提供一个虚拟放入地址内存空间块去接收事务mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);if (mVMStart == MAP_FAILED) {// *sigh*ALOGE(“Using /dev/binder failed: unable to mmap transaction memory.\n”);close(mDriverFD);mDriverFD = -1;}#elsemDriverFD = -1;#endif}LOG_ALWAYS_FATAL_IF(mDriverFD < 0, “Binder driver could not be opened. Terminating.”);}

可以看到,在构造函数中首先调用了open_driver函数并将返回值赋给了mDriverFD,让我们来看看这个函数:

static int open_driver(){int fd = open(“/dev/binder”, O_RDWR);if (fd >= 0) {fcntl(fd, F_SETFD, FD_CLOEXEC);int vers;status_t result = ioctl(fd, BINDER_VERSION, &vers);if (result == -1) {ALOGE(“Binder ioctl to obtain version failed: %s”, strerror(errno));close(fd);fd = -1;}if (result != 0 || vers != BINDER_CURRENT_PROTOCOL_VERSION) {ALOGE(“Binder driver protocol does not match user space protocol!”);close(fd);fd = -1;}size_t maxThreads = 15;result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);if (result == -1) {ALOGE(“Binder ioctl to set max threads failed: %s”, strerror(errno));}} else {ALOGW(“Opening ‘/dev/binder’ failed: %s\n”, strerror(errno));}return fd;}

可以看到open_driver函数主要是打开了/dev/binder这个设备并返回了这个设备的fd。

接下来我继续回到构造函数中,在mDriverFD中保存了这个设备的fd,接着我们又对其他的成员变量做了一些初始化,然后调用mmap函数为Binder设备开辟一块内存由于接收数据。

总结一下,我们的ProcessState类的任务:

defaultServiceManager函数分析

文件位置:frameworks\base\libs\binder\IServiceManager.cpp

sp<IServiceManager> defaultServiceManager(){if (gDefaultServiceManager != NULL) return gDefaultServiceManager;{AutoMutex _l(gDefaultServiceManagerLock);if (gDefaultServiceManager == NULL) {gDefaultServiceManager = interface_cast<IServiceManager>(ProcessState::self()->getContextObject(NULL));}}return gDefaultServiceManager;}那风再温柔。太深的流连便成了一种羁绊,

MediaServer源码分析(一)

相关文章:

你感兴趣的文章:

标签云: