就是學習筆記,當然參考過網上資料,不一定準確,只是記錄。
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。