多媒体和网络在Android中占有举足轻重的地位,网络的重要性不必说,后有文分析。这里主要是面向消费者的多媒体,包括音频、视频、图片、动画等。可谓是传媒和各种算法的宠儿,同时在流媒体中还涉及到网络,因此多媒体与网络的交互将是研究的重点。
还是利用源头分析法,从init进程开始,init.rc中启动mediaserver
service media /system/bin/mediaserver
class main
user media
group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc mediadrm
ioprio rt 4
其源码在framework/av/media/mediaserver/main_mediaserver.cpp
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
registerExtensions();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
这是一个native层的服务,利用的binder IPC,与netd、vold等unix socket IPC大有不同,值得分析。
sp<ProcessState> ProcessState::self()
{
Mutex::Autolock _l(gProcessMutex);
if (gProcess != NULL) {
return gProcess;
}
gProcess = new ProcessState;
return gProcess;
}
首先获得一个进程的ProcessState实例,根据代码这个实例具有单例的特征。继续其构造函数:
ProcessState::ProcessState()
: mDriverFD(open_driver())
, mVMStart(MAP_FAILED)
, mManagesContexts(false)
, mBinderContextCheckFunc(NULL)
, mBinderContextUserData(NULL)
, mThreadPoolStarted(