AudioServer 笔记

4 阅读4分钟

在 Android 系统中,audioserver 是一个至关重要的核心进程,可以把它理解为整个音频系统的“总指挥所”或“大管家”。它独立负责管理和协调设备上所有与音频相关的活动,确保各种声音能有序、高效地播放和录制。

从 Android 6.0 开始,audioserver 就从原来功能繁杂的 mediaserver 进程中被拆分出来,成为了一个独立的进程。

📜 从 “大总管” 到 “专家”:架构演进

早期 Android(7.0 及以前),audioserver 的职能与 Camera 等服务共同运行在一个庞大的 mediaserver 进程中。这样做虽然简单,但“牵一发而动全身”,一旦音频模块出错,整个媒体系统都可能崩溃。

因此,从 Android 8.0 开始,Google 通过 Project Treble 项目推动了这项重要的架构拆分。将 audioserver 独立出来,带来了显著的好处:

  • 提升稳定性:音频服务的崩溃被隔离在 audioserver 内,不会波及 Camera 等其他媒体功能。
  • 增强安全性:独立的进程意味着可以实施更严格、细粒度的权限控制,比如独立的 SELinux 策略。
  • 模块化更新:这使得音频模块可以独立于系统进行更新,为后续音频硬件抽象层的升级奠定了基础。

🧠 核心灵魂:AudioFlinger 与 AudioPolicyService

audioserver 进程本身只是一个“容器”,其核心功能由内部两个关键服务协同完成:AudioFlingerAudioPolicyService

特性AudioFlinger (执行者)AudioPolicyService (决策者)
核心角色底层音频数据的实际处理者和搬运工音频策略的制定者和管理者
主要职责• 音频数据混音
• 音频设备的实际读写
• 管理音频线程和缓冲区
• 音频路由决策
• 音量策略管理
• 音频焦点管理
• 监听设备事件
简单比喻军队中坚决执行命令的“士兵”。运筹帷幄的“指挥官”。
交互方式被动执行来自上层的指令。制定规则并指令 AudioFlinger 执行。

它们典型的协作流程如下:

  1. 用户插入耳机,系统检测到硬件变化。
  2. AudioPolicyService 作为“决策者”监听到事件,根据策略决定将音频输出切换到耳机。
  3. AudioPolicyService 将“切换到耳机”的指令下达给“执行者” AudioFlinger
  4. AudioFlinger 执行指令,与底层 HAL 交互,将音频数据流无缝路由到耳机输出。

在整个过程中,AudioFlingerAudioPolicyService 都作为 Binder 服务注册在 ServiceManager 中。当应用(如音乐播放器)通过 AudioTrack 接口发起播放请求时,这一请求会通过 Binder IPC 机制最终传递到 audioserver 进程中的 AudioFlinger 进行处理。

此外,还有一个位于 SystemServer 进程中的 AudioService (Java 层),它负责处理来自 AudioManager 的系统级音频请求,并与 audioserver 中的原生服务交互,共同构成完整的音频服务框架。

🚀 启动过程:从 init 进程开始

audioserver 由 Android 系统的第一个进程——init 进程负责启动。其核心步骤包括:

  1. 解析脚本init 进程解析 audioserver.rc 脚本文件。
  2. 配置服务:根据脚本配置,创建 audioserver 进程,并指定其运行的用户组、权限等。
  3. 执行入口:执行 /system/bin/audioserver 程序,入口函数是 main_audioserver.cppmain()
  4. 启动核心:在 main() 函数中,依次实例化 AudioFlingerAudioPolicyService 两大核心服务,并将它们注册到 ServiceManager 中。

注意:独立的音频硬件抽象层服务(如 android.hardware.audio@2.0-service)则由 hwservicemanager 负责启动和管理。audioserver 在需要时会通过 HIDL 接口与之通信。

🔒 安全与权限

audioserver 作为一个高权限系统进程,运行在独立的 audioserver 用户下,并通过 SELinux 策略进行严格的访问控制。例如,相关策略文件(如 audioserver.te)会详细定义其权限,如允许与蓝牙、相机等服务通信,或访问特定的音频设备文件。

💎 总结

总而言之,audioserver 是 Android 音频系统的基石。它以独立进程的形式,将 AudioFlinger(执行者)和 AudioPolicyService(决策者)两大核心服务完美结合,为上层应用提供了稳定、高效且策略清晰的音频服务。