就是学习笔记,当然参考过网上资料,不一定准确,只是记录。
AudioFlinger属于Android的Native层。所以,它会按照自己的特定方式去决定如何启动。像AudioFlinger就是由Linux来间接创建的。
在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 MediaPlayerService::instantiate(); //启动MediaPlayerService CameraService::instantiate(); //启动CameraService AudioPolicyService::instantiate(); //启动AudioPolicyService ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); }
这个main函数会启动和音频media相关的Native层服务。我们来看看这个文件的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)/../.. #定义一下base变量,他是一个路径,供下面使用 LOCAL_C_INCLUDES := \ #本次编译需要的头文件路径 $(base)/services/audioflinger \ $(base)/services/camera/libcameraservice \ $(base)/media/libmediaplayerservice LOCAL_MODULE:= mediaserver #生成模块的名字 include $(BUILD_EXECUTABLE)
因为AudioFlinger的源码在libaudioflinger库中,所以必须在编译的时候依赖这个库。当然,其他的服务也要以来其他的库。
当系统启动的时候,init进程会加载init.rc,在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 ioprio rt 4
这样就启动了mediaserver,从而启动了AndroidFlinger。