Android audio启动过程
一、Android系统启动
Android系统的启动流程
init进程对应的main函数 system/core/init/init.cpp
int SecondStageMain(int argc, char** argv) {
// ......
LoadBootScripts(am, sm);
// ......
}
// LoadBootScripts()
static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {
Parser parser = CreateParser(action_manager, service_list);
std::string bootscript = GetProperty("ro.boot.init_rc", "");
if (bootscript.empty()) {
parser.ParseConfig("/system/etc/init/hw/init.rc");
if (!parser.ParseConfig("/system/etc/init")) {
late_import_paths.emplace_back("/system/etc/init");
}
// late_import is available only in Q and earlier release. As we don't
// have system_ext in those versions, skip late_import for system_ext.
parser.ParseConfig("/system_ext/etc/init");
if (!parser.ParseConfig("/vendor/etc/init")) {
late_import_paths.emplace_back("/vendor/etc/init");
}
if (!parser.ParseConfig("/odm/etc/init")) {
late_import_paths.emplace_back("/odm/etc/init");
}
if (!parser.ParseConfig("/product/etc/init")) {
late_import_paths.emplace_back("/product/etc/init");
}
} else {
parser.ParseConfig(bootscript);
}
}
LoadBootScrips()函数中,会首先加载init.rc文件,然后会加载/system/etc/init/、/product/etc/init/、/odm/etc/init/、/vendor/etc/init目录下的
rc文件。而audioserver.rc位于/system/etc/init 目录下
二、启动入口:audioserver启动
启动audioserver进程
frameworks/av/media/audioserver/audioserver.rc
service audioserver /system/bin/audioserver
class core
user audioserver #
# media gid needed for /dev/fm (radio) and for /data/misc/media (tee)
group audio camera drmrpc media mediadrm net_bt net_bt_admin net_bw_acct wakelock #
capabilities BLOCK_SUSPEND
ioprio rt 4
task_profiles ProcessCapacityHigh HighPerformance
onrestart restart vendor.audio-hal
onrestart restart vendor.audio-hal-4-0-msd
onrestart restart audio_proxy_service
# Keep the original service names for backward compatibility
onrestart restart vendor.audio-hal-2-0
onrestart restart audio-hal-2-0
on property:vts.native_server.on=1
stop audioserver
on property:vts.native_server.on=0
start audioserver
audioserver的入口函数为main_audioserver.cpp,去创建audioflinger和audiopolicy的实例
AudioFlinger作用:负责对接Hal层,实现播放,混音,音效处理等功能操作
AudioPolicyService作用:管理输入输出设备状态,音频播放策略,音量控制,向Hal层设置参数
frameworks\av\media\audioserver\main_audioserver.cpp
int main(int argc __unused, char **argv) {
// ......
// doLogtrue
if (doLog && (childPid = fork()) != 0) {
// ......
} else {
// all other services
if (doLog) {
prctl(PR_SET_PDEATHSIG, SIGKILL); // if parent media.log dies before me, kill me also
setpgid(0, 0); // but if I die first, don't kill my parent
}
android::hardware::configureRpcThreadpool(4, false /*callerWillJoin*/);
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
AudioPolicyService::instantiate();
// AAudioService should only be used in OC-MR1 and later.
// And only enable the AAudioService if the system MMAP policy explicitly allows it.
// This prevents a client from misusing AAudioService when it is not supported.
aaudio_policy_t mmapPolicy = property_get_int32(AAUDIO_PROP_MMAP_POLICY,
AAUDIO_POLICY_NEVER);
if (mmapPolicy == AAUDIO_POLICY_AUTO || mmapPolicy == AAUDIO_POLICY_ALWAYS) {
AAudioService::instantiate();
}
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
}
main_audioserver.cpp里面主要的业务:
① 启动AudioFlinger
② 启动AudioPolicyService
③ 如果支持AAudio,则启动AAudioService
④ 创建线程池并将当前线程加入线程池
三、AudioFlinger初始化流程
audioflinger的初始化(几乎什么实质的操作都没有)
frameworks/av/services/audioflinger/AudioFlinger.cpp
void AudioFlinger::instantiate() {
sp<IServiceManager> sm(defaultServiceManager());
sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME),
new AudioFlingerServerAdapter(new AudioFlinger()), false,
IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
}
sm是带sp的(sp)强引用类型的指针,第一次调用AudioFlinger模块的时候,会调用它的AudioFlinger::onFirstRef()函数
AudioFlinger::AudioFlinger()
//
......
{
// ......
// halaudio
mDevicesFactoryHal = DevicesFactoryHalInterface::create();
// hal
mEffectsFactoryHal = EffectsFactoryHalInterface::create();
}
void AudioFlinger::onFirstRef()
{
Mutex::Autolock _l(mLock);
// ......
mMode = AUDIO_MODE_NORMAL;
gAudioFlinger = this; // we are already refcounted, store into atomic pointer.
// hal
mDevicesFactoryHalCallback = new DevicesFactoryHalCallbackImpl;
mDevicesFactoryHal->setCallbackOnce(mDevicesFactoryHalCallback);
}
四、AudioPolicyService初始化流程
AudioPolicyService::AudioPolicyService()
: BnAudioPolicyService(),
mAudioPolicyManager(NULL),
mAudioPolicyClient(NULL),
mPhoneState(AUDIO_MODE_INVALID),
mCaptureStateNotifier(false),
mCreateAudioPolicyManager(createAudioPolicyManager),
mDestroyAudioPolicyManager(destroyAudioPolicyManager) {
}
void AudioPolicyService::onFirstRef()
{
{
Mutex::Autolock _l(mLock);
// start audio commands thread
// AudioCommandThreadaudio
mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
// start output activity command thread
// audio
mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
// AudioPolicyClientAudioFlingerAudioPolicyService
mAudioPolicyClient = new AudioPolicyClient(this);
// Android SAudioPolicyManager
loadAudioPolicyManager();
// AudioPolicyManager
mAudioPolicyManager = mCreateAudioPolicyManager(mAudioPolicyClient);
}
// load audio processing modules
//
sp<AudioPolicyEffects> audioPolicyEffects = new AudioPolicyEffects();
sp<UidPolicy> uidPolicy = new UidPolicy(this);
sp<SensorPrivacyPolicy> sensorPrivacyPolicy = new SensorPrivacyPolicy(this);
{
Mutex::Autolock _l(mLock);
mAudioPolicyEffects = audioPolicyEffects;
mUidPolicy = uidPolicy;
mSensorPrivacyPolicy = sensorPrivacyPolicy;
}
uidPolicy->registerSelf();
sensorPrivacyPolicy->registerSelf();
}
创建了三个AudioCommandThread线程(分别用于播放tone音,执行audio命令,执行输出命令)
创建了三个类mAudioPolicyClient, mAudioPolicyManager(策略管理), mAudioPolicyEffects(音效设置)三个类
AudioPolicy的管理主要在AudioPolicyManager里面,接下来看AudioPolicyManager
AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
: AudioPolicyManager(clientInterface, false /*forTesting*/)
{
loadConfig();
}
status_t AudioPolicyManager::initialize() {
{
// engine
auto engLib = EngineLibrary::load(
"libaudiopolicyengine" + getConfig().getEngineLibraryNameSuffix() + ".so");
if (!engLib) {
ALOGE("%s: Failed to load the engine library", __FUNCTION__);
return NO_INIT;
}
// Engine
mEngine = engLib->createEngine();
if (mEngine == nullptr) {
ALOGE("%s: Failed to instantiate the APM engine", __FUNCTION__);
return NO_INIT;
}
}
// APM
mEngine->setObserver(this);
//
status_t status = mEngine->initCheck();
if (status != NO_ERROR) {
LOG_FATAL("Policy engine not initialized(err=%d)", status);
return status;
}
// productStrategy
mCommunnicationStrategy = mEngine->getProductStrategyForAttributes(
mEngine->getAttributesForStreamType(AUDIO_STREAM_VOICE_CALL));
//
onNewAudioModulesAvailableInt(nullptr /*newDevices*/);
// make sure default device is reachable
if (mDefaultOutputDevice == 0 || !mAvailableOutputDevices.contains(mDefaultOutputDevice)) {
ALOGE_IF(mDefaultOutputDevice != 0, "Default device %s is unreachable",
mDefaultOutputDevice->toString().c_str());
status = NO_INIT;
}
// If microphones address is empty, set it according to device type
for (size_t i = 0; i < mAvailableInputDevices.size(); i++) {
if (mAvailableInputDevices[i]->address().empty()) {
if (mAvailableInputDevices[i]->type() == AUDIO_DEVICE_IN_BUILTIN_MIC) {
mAvailableInputDevices[i]->setAddress(AUDIO_BOTTOM_MICROPHONE_ADDRESS);
} else if (mAvailableInputDevices[i]->type() == AUDIO_DEVICE_IN_BACK_MIC) {
mAvailableInputDevices[i]->setAddress(AUDIO_BACK_MICROPHONE_ADDRESS);
}
}
}
ALOGW_IF(mPrimaryOutput == nullptr, "The policy configuration does not declare a primary output");
// Silence ALOGV statements
property_set("log.tag." LOG_TAG, "D");
//
updateDevicesAndOutputs();
return status;
}
AudioPolicyManager初始化主要依赖于loadConfig()和initialize()函数:
loadConfig()用来加载音频配置文件(audio_policy_configuration.xml),Android为每种音频接口定义了对应的硬件抽象层,优先加载/vendor/etc/audio_policy.conf配置文件, 如果该配置文件不存在, 则加载/system/etc/audio_policy.conf配置文件。AudioPolicyManager加载完所有音频接口后,就知道了系统支持的所有音频接口参数,可以为音频输出提供决策。同时也加载audio_volumes.xml,初始化各种音频流对应的音量调节点
initialize()主要实现加载音频engine库、创建Engine对象;调用IAudioFlinger,通过mDevicesFactoryHal添加hal库初始化,然后添加到全局变量中(audio module模块包括:primary、A2DP、USB、remote_submix、hearing_aid)
五、总结
audioserver启动会加载AudioFlinger和AudioPolicyService两个服务,这两个服务会加载配置文件,解析音频输入、输出硬件信息,并且加载HIDL/AIDL,建立与hardware的通信连接,至此audioserver启动完成。