1.AudioFlinger启动流程
在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 mediadrm
ioprio rt 4
当init进程启动后,会去启动mediaServer服务。MediaServer服务启动后,会call到main_mediaserver.cpp的main函数,main函数会去初始化各种service
InitializeIcuOrDie();
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
ResourceManagerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
SoundTriggerHwService::instantiate();
RadioService::instantiate();
registerExtensions();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
这里我们比较关心的是AudioFlinger和AudioPolicyService,在AudioFlinger.cpp和AudioPolicyService.cpp没有对应的instantiate()函数实现,而是直接call到BinderService.h的instantiate函数:
static void instantiate() { publish(); }
BinderService.h的publish函数,主要是将service注册到ServiceManager中:
static status_t publish(bool allowIsolated = false) {
sp<IServiceManager> sm(defaultServiceManager());
return sm->addService(
String16(SERVICE::getServiceName()),
new SERVICE(), allowIsolated);
}
2.AudioFlinger中Binder通讯流程
1)AudioFlingerClient和AudioPolicyServiceClient的定义
在AudioSystem.h中,有定义主要的两个Client,分别是AudioFlingerClient和AudioPolicyServiceClient。
根据AudioFlingerClient的定义:
class AudioFlingerClient: public IBinder::DeathRecipient, public BnAudioFlingerClient
AudioFlingerClient是BnAudioFlingerClient的实现类,当用IAudioFlingerClient进行Binder通讯时,通过BpAudioFlingerClient,最终在Binder Server端会call到BnAudioFlingerClient即AudioFlingerClient。
根据AudioPolicyServiceClient的定义: