android上的多媒体服务是有一个叫做mediaserver的服务进程提供的。这个进程通过binder的进程间通信方式来完成其他进程(如音乐播放器)的请求。 mediaserver服务器进程的实现代码在/frameworks/base/media/mediaserver目录下,代码很小。 该目录下的Android.mk文件: 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)/libs/audioflinger \ $(base)/camera/libcameraservice \ $(base)/media/libmediaplayerservice LOCAL_MODULE:= mediaserver include $(BUILD_EXECUTABLE) 最后编译出来的是mediaserver,这个进程可以在模拟器或设备系统中的/system/sbin/目录下找到。 服务器进程的实现源码: // System headers required for setgroups, etc. #include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> #include <utils/Log.h> #include <AudioFlinger.h> #include <CameraService.h> #include <MediaPlayerService.h> #include <AudioPolicyService.h> #include <private/android_filesystem_config.h> using namespace android; int main(int argc, char** argv) { sp<ProcessState> proc(ProcessState::self()); // 进程状态 sp<IServiceManager> sm = defaultServiceManager(); // 服务器管理器 LOGI("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); // addService -- "media.audio_flinger" MediaPlayerService::instantiate(); // addService -- "media.player" CameraService::instantiate(); // addService -- "media." AudioPolicyService::instantiate(); // addService -- "media.audio_policy" ProcessState::self()->startThreadPool(); // IPCThreadState::self()->joinThreadPool(); // } [1] 也就是说,在启动系统的时候,mediaserver会启动,这样也会随之添加了服 务:media.audio_flinger, media.player, media.camera, media.audio_policy。 这些服务会响应来自上层的MediaPlayer的服务请求,主要有声音播放,多 媒体文件的播放,摄像头操作,音频管理等。 [2] 在以上main()函数中, defaultServiceManager()函数获取到当前的服务管理器(IServiceManager)。 //IServiceManager类是一个接口,主要定义的接口函数有: virtual sp<IBinder> getService( const String16& name) const = 0; // 获取某个服务(若该服务不存在,则阻塞几秒钟) virtual sp<IBinder> checkService( const String16& name) const = 0; // 检查某个服务(若服务不存在,不阻塞) virtual status_t addService( const String16& name, const sp<IBinder>& service) = 0; // 添加一个服务 virtual Vector<String16> listServices() = 0; // 列举所有服务