一.MediaPlayerService简介
1.Media Service的启动
Media进程定义:
service media /system/bin/mediaserver
class main
user media
group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc
ioprio rt 4
servicemanager 进程定义:
service servicemanager /system/bin/servicemanager
class core
user system
group system
Media中有很多Native Service(AudioFlinger MediaPlayerService CameraService AudioPolicyService等),整个Android(native或者framework)的Service都需要加入servicemanager中进行统一管理。
那么Media Process 与ServiceManager Process是如何进行通信的呢——Binder.通过Media Process中使用binder进行完成IPC过程,学习Binder的概念和使用方法。
2.MediaPlayer的文件
MediaPlayer是从MediaPlayer.java开始的,应用如果想播放音乐,先要new 一个MediaPlayer,并设置其相关的参数。先列出主要的代码文件,他们都在frameworks里面:
Java层代码:base/media/java/android/media/MediaPlayer.java
Jni层代码:
base/media/jni/android_media_MediaPlayer.cpp
本地代码:
av/media/libmedia/mediaplayer.cpp
./av/media/libmedia/IMediaPlayer.cpp
MediaPlayerService:
av/media/libmediaplayerservice/MediaPlayerService.cpp
二.分析MediaPlayer的Binder机制
\frameworks\av\media\mediaserver\ main_mediaserver.cpp:
1 . ProcessState对象创建
当前进程的状态属性,对象创建:
sp<ProcessState> ProcessState::self()
{
Mutex::Autolock _l(gProcessMutex);
if (gProcess != NULL) {
return gProcess;
}
gProcess = new ProcessState;
return gProcess;
}
ProcessState构造函数:
ProcessState::ProcessState()
: mDriverFD(open_driver()) //打开binder驱动设备
, mVMStart(MAP_FAILED)
, mManagesContexts(false)
, mBinderContextCheckFunc(NULL)
, mBinderContextUserData(NULL)
, mThreadPoolStarted(false)
, mThreadPoolSeq(1)
{
if (mDriverFD >= 0) {
//将binder的fd映射到当前进程虚拟空间地址中 与binder进行交互
mVMStart = mmap(0, BINDER_VM_SIZE, PROT_READ,
MAP_PRIVATE | MAP_NORESERVE, mDriverFD, 0);
}
}
打开binder设备:
static int open_driver()
{
//打开binder设备驱动
int fd = open("/dev/binder", O_RDWR);
if (fd >= 0) {
//bidner最大支持线程数
size_t maxThreads = 15;
result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads);
}
return fd;
}
ProcessState对象创建过程所做的事:
打开/dev/binder设备,得到binder设备的fd;
将bidner设备fd映射到当前进程虚拟地址空间建立交互的通道;
2. IServiceManager对象创建
sp<IServiceManager> sm = defaultServiceManager();
为什么需要一个IServiceManager对象呢,这个类是个抽象提供接口
class IServiceManager : public IInterface
{
virtual sp<IBinder> getService( const String16& name) const = 0;
virtual status_t addService( const String16& name,
const sp<IBinder>& service,
bool allowIsolated = false) = 0;
……
};
通过IServiceManager派生对象操作将Service