目录
[1. 简述](#1. 简述)
[2. 初始化](#2. 初始化)
[4. 内部核心类](#4. 内部核心类)
[4.1 AudioFlinger 类](#4.1 AudioFlinger 类)
[4.2 Thread 类体系](#4.2 Thread 类体系)
[4.3 Track 类体系](#4.3 Track 类体系)
[5. 核心流程分析](#5. 核心流程分析)
[5.1 创建 Track (createTrack)](#5.1 创建 Track (createTrack))
[5.2 回放线程循环 (MixerThread::threadLoop)](#5.2 回放线程循环 (MixerThread::threadLoop))
[5.3 序列图 (UML)](#5.3 序列图 (UML))
[6. 总结](#6. 总结)
1. 简述
AudioFlinger,简称AF,它 是 Android 音频系统的核心服务,承载着音频混(Mixing)、 音频路由(Routing)以及管理音频输出输入流(Stream)等关键职责,是承上启下的关键角色。它位于 Native 层,作为 AudioSystem 的一部分,向上接收来自 Application/ Framework (如 AudioTrack, AudioRecord) 的请求,向下通过 Audio HAL (Hardware Abstraction Layer) 驱动硬件,如图1所示:
- 向上:为应用层(如 AudioTrack/AudioRecord)提供统一的音频数据读写接口;
- 向下:通过 HAL 层(Audio HAL)与底层硬件(声卡、DSP、Codec)交互;
- 横向:与 AudioPolicyService(APS) 协同完成路由决策、设备切换、音量策略等。

图1 AudioFlinger在音频系统中位置
2. 初始化
AudioFlinger与AudioPolicyService同在main_audioserver.cpp被初始化,是audioserver进程的一部分,下面是初始化代码:
cpp
int main(int argc __unused, char argv)
{
......
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
AudioFlinger::instantiate();
AudioPolicyService::instantiate();
......
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
3.对外接口
AudioFlinger 属于 Server 端,对外的client和HAL有:
Client: AudioTrack, AudioRecord, AudioSystem, AudioPolicyService
Server: AudioFlinger (Binder Service)
HAL: StreamHalInterface, AudioHwDevice
AF对上层提供Binder服务,从 Android 12/13 开始,为了将Binder服务与具体业务实现分离,通过 Delegate 接口定义核心功能契约,所以AudioFlinger继承于IAudioFlinger 接口,而不是直接继承于BnAudioFlingerService,如图2所示:

图2 AudioFlinger中增加Delegate代理
4. 内部核心类
AudioFlinger 内部主要由几种核心组件构成:
- Binder Interface: IAudioFlinger 接口实现,处理 IPC 调用。
- Threads: 管理不同输出/输入流的线程 (PlayBackThread, RecordThread)。
- Tracks: 代表一个音频流的数据源 (Track, RecordTrack)。
- Effects: 音频效果管理。
- PatchPanel: 处理音频补丁(Audio Patch),实现复杂的路由功能。
AudioFlinger 的代码结构主要围绕 AudioFlinger, Thread, Track 三个层级展开。
4.1 AudioFlinger 类
AudioFlinger 是整个服务的入口,继承自 BnAudioFlinger,实现了 IAudioFlinger 接口。
负责创建和管理 PlaybackThread 和 RecordThread。
负责响应 createTrack、openOutput 等系统调用。

图3
4.2 Thread 类体系
如图3所示,ThreadBase 是所有音频工作线程的基类。
PlaybackThread: 负责音频播放。
MixerThread: 最常用的回放线程,负责将多个 Track 的音频数据混合(Mix)后写入 HAL。支持 FastMixer 以实现低延迟播放。
DirectOutputThread: 直接输出线程,不经过软件混音,通常用于 HDMI 透传或高保真音乐播放。
OffloadThread: 卸载线程,将解码和混音工作交给 DSP/硬件处理。
MmapThread: 配合 AAudio 使用,实现 mmap 方式的低延迟数据传输。
RecordThread: 负责音频录制,从 HAL 读取数据并分发给 RecordTrack。
4.3 Track 类体系
TrackBase 是音频流数据的抽象基类。
Track: 对应 AudioTrack,存在于 PlaybackThread 中。它管理着共享内存(SharedBuffer),Client 端往里写数据,Thread 从里读数据。
RecordTrack: 对应 AudioRecord,存在于 RecordThread 中。

图4 AudioTrack与AudioFlinger里的track

图5 AudioRecord与AudioFlinger里的Track
5. 核心流程分析
5.1 创建 Track (createTrack)
这是播放流程的起点。
-
客户端 AudioTrack 调用 AudioSystem::getOutputForAttr。
-
AudioPolicyService 根据策略(路由、采样率等)返回一个 Output Handle(对应 AudioFlinger 中的一个 Thread ID)。
-
客户端调用 AudioFlinger::createTrack,传入 Output Handle。
-
AudioFlinger 根据 Handle 找到对应的 PlaybackThread。
-
调用 PlaybackThread::createTrack_l 创建服务端 Track 对象。
-
返回 IAudioTrack 句柄给客户端。
5.2 回放线程循环 (MixerThread::threadLoop)
MixerThread 运行一个死循环 threadLoop:
-
processConfigEvents: 处理配置变更(如采样率变化、路由变化)。
-
prepareTracks_l: 遍历所有 Track。
检查 Track 状态(Active/Stopped/Paused)。
获取 Track 的 Buffer 数据。
判断是否需要混音。
-
threadLoop_mix: 使用 AudioMixer 将所有 Active Track 的数据混合到一个临时的 Sink Buffer 中。
-
threadLoop_write: 将混合后的数据写入 AudioStreamOut (HAL)。
对于低延迟场景,MixerThread 会创建 FastMixer 线程。普通 Track 由 MixerThread 处理,设置了 FAST 标志的 Track 会被 FastMixer 抢占式调度处理,直接写入 HAL 或通过 Pipe 写入。
5.3 序列图 (UML)
以下展示了 createTrack 和 write (播放) 的简要时序。

图6 createtrack时序
6. 总结
AudioFlinger 是 Android 音频架构中承上启下的枢纽。通过多线程模型(Mixer, Direct, Record等),它高效地管理着系统中的并发音频流。通过共享内存机制,它实现了 Client 与 Server 间的高效数据传输。理解 AudioFlinger 的关键在于掌握 ThreadLoop 的调度机制以及 Track 的生命周期管理。