就是学习笔记,当然参考过网上资料,不一定准确,只是记录。
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。