Android系统可以分为应用层、Framework层、系统运行库层、HAL层、Linux内核层,Audio子系统也是一样的。

 


1.应用层

1.1 职责

处理用户交互,直接调用 Android SDK 提供的音频 API 实现播放、录音、音效控制等功能,应用层是整个音频体系的最上层,厂商可以根据特定需求调用系统接口自己开发音乐播放器软件。

1.2 调用API

播放场景

API

适用场景

特点

MediaPlayer

播放压缩文件(MP3/AAC)

自动解码,高内存占用

AudioTrack

播放 PCM 数据(如实时生成音频)

低层级控制,支持流模式和静态模式

AAudio

低延迟播放(Android O+)

直接与 HAL 交互,延迟 <10ms

SoundPool

短音效(游戏按键音)

预加载,低延迟触发

录音场景

API

适用场景

特点

MediaRecorder

录制压缩文件(AMR/MP4)

自动编码,简单易用

AudioRecord

录制 PCM 数据(如语音处理)

支持实时处理原始数据

1.3​​​​​​示例流程

1.3.1播放音乐

应用调用 MediaPlayer → 解码音频文件 → 通过 AudioTrack 提交 PCM 数据到框架层。

1.3.2录音

应用调用 AudioRecord → 从框架层获取麦克风采集的 PCM 数据。

2.框架层

2.1 职责

框架层包括两部分,一部分是提供音频数据采集(录音)和输出(播放)的接口,另一部分是协调应用层的音频请求,管理策略(如路由、音量、焦点),连接应用层与 Native 层。

2.2 关键组件

 ​​2.2.1音频数据采集和输出

  • MediaPlayer/MediaRecorder:用于播放/录制媒体文件(如 MP3、AAC),封装了编解码和流管理。
  • AudioTrack/AudioRecord:直接操作 PCM 数据的低级 API,适合实时音频流(如 VoIP、音乐合成)。
  • SoundPool:短音频播放(如游戏音效),支持预加载和低延迟触发。
  • AAudio(Android O+):高性能、低延迟的 API,绕过复杂框架层,直接与 HAL 交互。
  • AudioManager:管理音频焦点、音量模式(静音/振动)、设备状态(如耳机插入)。

2.2.2音频策略管理

AudioService:系统服务,管理全局音频策略:

  • 处理音频焦点冲突(如电话打断音乐播放)。
  • 控制音量曲线(不同流类型独立调节)。
  • 监听设备状态(耳机插拔、蓝牙连接)。

AudioSystem:Java 层与 Native 层(如 AudioFlinger)的桥梁,传递音频参数和控制命令。

2.3交互流程 

当应用调用 AudioTrack.write() 时,数据通过 JNI 传递到 Native 层的 AudioFlinger。

2.4代码路径

2.4.1音频采集与输出

  • frameworks/base/media/java/android/media/AudioTrack.java、AudioRecord.java、AudioManager.java
  • frameworks/base/media/java/android/media/audiofx/音效相关类(如均衡器 Equalizer.java)

2.4.2音频策略

  • frameworks/base/services/core/java/com/android/server/audio/

AudioService.java:音频策略和系统服务管理

  • frameworks/base/media/java/android/media/AudioSystem.java

与 Native 层 AudioSystem 交互的桥梁

3.native层

3.1 职责

实现音频数据的混合(Mix)、路由、音效处理,管理硬件资源。

3.2 关键组件

3.2.1AudioFlinger

核心功能:

  • 混音(Mix):将多个音频流(如音乐、系统提示音)混合为单个输出流。
  • 音频效果链:应用全局或流级别的音效(如均衡器、混响)。
  • 资源分配:管理音频缓冲区(DMA 内存)、线程调度(如实时播放线程)。
  • FastMixer:低延迟路径(如 AAudio 使用),绕过部分处理逻辑。

3.2.2AudioPolicyManager

核心功能:

  • 设备路由:根据设备优先级(如耳机 > 扬声器)选择输入/输出设备。
  • 策略决策:例如蓝牙连接时自动切换音频输出,或通话时禁用媒体播放。
  • 音量策略:为不同音频流类型(如音乐、通话)定义独立的音量控制规则

​​​​​​​3.3 示例流程

插入耳机 → AudioPolicyManager 检测到设备变化 → 通知 AudioFlinger 将输出路由到耳机。

​​​​​​​3.4 代码路径

  • AudioFlinger(音频混合与处理核心)

frameworks/av/services/audioflinger/

AudioFlinger.cpp:音频流的创建、混音逻辑

Threads.cpp:音频线程管理(MixerThread、PlaybackThread)

Effects.cpp:音效处理模块

  • AudioPolicy(音频策略管理)

frameworks/av/services/audiopolicy/

managerdefault/:默认策略实现

Engine/:音频策略引擎(设备路由、音量规则)

common/:通用接口定义

  • AAudio 实现

frameworks/av/media/libaaudio/

AAudioService.cpp:AAudio 服务的 Native 实现

4.HAL层

​​​​​​​4.1 职责

抽象硬件差异,提供统一的接口供 Android 系统调用,由芯片厂商实现具体驱动逻辑。

​​​​​​​4.2 关键组件

  • Audio HAL 接口:定义在 audio.h 中(如 open_output_stream(), write())。

厂商实现

高通:hardware/qcom/audio/hal/(实现 PCM 数据传输、音量控制、编解码)。

其他厂商:如 MTK、华为提供各自的 HAL 实现。

  • HAL 扩展

Effects HAL:硬件加速的音效处理(如杜比全景声)。

Sound Trigger HAL:低功耗语音唤醒(如 "Hey Google")。

​​​​​​​4.3示例流程

AudioFlinger 调用 HAL 的 write() → 数据通过 ALSA 驱动写入硬件缓冲区。

​​​​​​​4.4代码路径

  • Audio HAL 接口定义
  • hardware/libhardware/include/hardware/audio.h

HAL 核心接口(如 audio_hw_device、audio_stream_out)

  • HAL 实现示例(参考设计)
  • hardware/qcom/audio/(高通平台示例)

hal/:HAL 实现代码(如 audio_hw.c)

device/generic/car/emulator/audio/(模拟器参考实现)

  • HIDL 接口(Android 8.0+)
  • hardware/interfaces/audio/

core/:Audio HAL 的 HIDL 接口定义(如 IDevicesFactory.hal)

5.驱动/内核层

​​​​​​​ 5.1 职责

管理音频硬件设备(如 DAC/ADC),提供底层驱动支持。

​​​​​​​ 5.2关键组件

  • ALSA 框架(Advanced Linux Sound Architecture):
    1. PCM 接口:传输原始音频数据(如 snd_pcm_writei())。
    2. Mixer 控制:调节硬件参数(增益、声道平衡)。
  • 平台专用驱动
    1. 高通:kernel/techpack/audio/(处理 DSP 交互、低延迟优化)。
    2. 联发科:基于 TinyALSA 的定制驱动

5.3代码路径 

ALSA 驱动(通用音频驱动)

  • kernel/sound/

ALSA 核心驱动代码(如 PCM、Mixer 模块)

平台特定驱动(如高通)

  • kernel/techpack/audio/

高通平台的音频驱动实现(如 DSP 交互)

TinyALSA 工具

  • external/tinyalsa/

tinymix、tinyplay、tinycap 命令行工具源码

5.4调试工具

  • tinymix:查看和修改 Mixer 控件。
  • tinyplay/tinycap:直接播放或录制 PCM 数据,绕过上层框架。

6.硬件层

​​​​​​​6.1 职责

物理设备处理音频信号的输入和输出。

​​​​​​​6.2 关键组件

 输入设备:麦克风、Line-in 接口。

输出设备:扬声器、耳机、蓝牙音频(A2DP)、HDMI。

专用芯片

  1. DSP:处理降噪、回声消除(如 Qualcomm Hexagon)。
  2. Codec 芯片:数模转换(DAC)和模数转换(ADC)。    

6.3数据交互示例

  • 播放音乐:应用 → MediaPlayer → AudioTrack → AudioFlinger(混音) → Audio HAL → ALSA驱动 → DAC → 扬声器
  • 语音通话:麦克风 → ADC → ALSA驱动 → Audio HAL → AudioFlinger → AudioRecord → 电话应用 → 网络传输
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐