Android Audio 代码路径详解
整体架构图
┌─────────────────────────────────────────────────────────────┐
│ 应用层 (Applications) │
├─────────────────────────────────────────────────────────────┤
│ Java Media Framework (android.media.*) │
├─────────────────────────────────────────────────────────────┤
│ JNI 桥接层 (android_media_*) │
├─────────────────────────────────────────────────────────────┤
│ C++ Media Framework (libmedia, libaudioclient) │
├─────────────────────────────────────────────────────────────┤
│ 音频服务层 (AudioFlinger, AudioPolicyService) │
├─────────────────────────────────────────────────────────────┤
│ Audio HAL (Hardware Abstraction Layer) │
├─────────────────────────────────────────────────────────────┤
│ Linux 内核 (ALSA, tinyalsa, sound driver) │
└─────────────────────────────────────────────────────────────┘
详细代码路径说明
1. Java Framework 层 (应用API)
路径: frameworks/base/media/java/android/media/
| 文件/目录 | 说明 |
|---|---|
AudioTrack.java | 音频播放主类,管理PCM数据播放 |
AudioRecord.java | 音频录制主类,管理PCM数据采集 |
AudioManager.java | 音频系统管理,音量、设备、焦点控制 |
AudioSystem.java | 音频系统属性设置和查询 |
AudioAttributes.java | 音频属性定义(用途、内容类型等) |
AudioDeviceInfo.java | 音频设备信息 |
AudioFormat.java | 音频格式定义(编码、采样率等) |
AudioPlaybackConfiguration.java | 播放配置管理 |
AudioRecordingConfiguration.java | 录制配置管理 |
示例调用:
// 应用层代码
AudioTrack track = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(44100)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
.build())
.build();
track.play();
2. JNI 桥接层
路径: frameworks/base/core/jni/
| 文件 | 对应的Java类 | 功能 |
|---|---|---|
android_media_AudioTrack.cpp | AudioTrack | 连接Java AudioTrack和C++ AudioTrack |
android_media_AudioRecord.cpp | AudioRecord | 连接Java AudioRecord和C++ AudioRecord |
android_media_AudioSystem.cpp | AudioSystem | 系统音频属性JNI |
android_media_AudioManager.cpp | AudioManager | 音频管理JNI |
android_media_AudioDeviceAttributes.cpp | AudioDeviceInfo | 设备信息JNI |
关键代码流:
Java AudioTrack.write()
→ android_media_AudioTrack.cpp 的 write()
→ C++ AudioTrack::write()
3. Native Client 层 (C++ API)
路径: frameworks/av/media/libaudioclient/
| 文件 | 功能 |
|---|---|
AudioTrack.cpp | C++ AudioTrack实现,应用直接调用 |
AudioRecord.cpp | C++ AudioRecord实现 |
AudioSystem.cpp | C++ AudioSystem实现 |
AudioEffect.cpp | 音频效果处理 |
MonoPipe.cpp/Pipe.cpp | 音频管道工具 |
特点:
- 提供C++接口给Native应用
- 通过Binder与AudioFlinger通信
- 实现音频数据缓冲和传输
4. 核心服务层 (AudioFlinger)
路径: frameworks/av/services/audioflinger/
audioflinger/
├── AudioFlinger.h/cpp # 主服务入口,管理所有音频线程
├── Threads.h/cpp # 音频线程基类和派生类
│ ├── PlaybackThread # 播放线程基类
│ ├── MixerThread # 混音播放线程
│ ├── DirectOutputThread # 直接输出线程
│ ├── OffloadThread # 硬件解码线程
│ ├── DuplicatingThread # 复制线程(录音/A2DP)
│ └── RecordThread # 录制线程
├── Tracks.h/cpp # 音频轨道管理
├── AudioMixer.h/cpp # 混音器实现
├── Effects.h/cpp # 音频效果框架
├── StateQueue.h/cpp # 状态队列
├── FastCapture.h/cpp # 快速录制
├── FastMixer.h/cpp # 快速混音
└── AudioHwDevice.h/cpp # 音频硬件设备封装
线程类型对比:
| 线程类型 | 用途 | 延迟特性 |
|---|---|---|
MixerThread | 普通音频混音 | 标准延迟 (~50ms) |
FastMixer | 低延迟音频 | 低延迟 (<20ms) |
DirectOutputThread | 独占输出(如通话) | 低延迟 |
OffloadThread | 硬件解码输出 | 低功耗 |
DuplicatingThread | 多路输出(录音) | 标准延迟 |
5. 策略服务层 (AudioPolicyService)
路径: frameworks/av/services/audiopolicy/
audiopolicy/
├── AudioPolicyService.h/cpp # 策略服务入口
├── managerdefault/ # 默认策略实现
│ ├── AudioPolicyManager.h/cpp
│ └── AudioPolicyManagerDefault.cpp
├── engine/ # 策略引擎
│ ├── Interface/ # 引擎接口
│ ├── common/ # 公共组件
│ ├── config/ # 配置管理
│ └── default/ # 默认引擎
├── common/ # 公共工具
├── service/ # 服务管理
└── Engine.h/cpp # 策略引擎基类
主要功能:
- 设备选择策略
- 音量曲线管理
- 音频焦点管理
- 策略配置文件解析
- 动态策略切换
6. Audio HAL 接口定义
路径: hardware/libhardware/include/hardware/
| 文件 | 功能 |
|---|---|
audio.h | 主音频HAL接口定义 |
audio_policy.h | 音频策略HAL接口 |
audio_effects.h | 音频效果HAL接口 |
关键结构体:
// 音频HAL主要接口
struct audio_hw_device {
struct hw_device_t common;
// 必须实现的函数
int (*open_output_stream)(...);
int (*close_output_stream)(...);
int (*open_input_stream)(...);
int (*close_input_stream)(...);
// 音频控制函数
int (*set_parameters)(...);
char* (*get_parameters)(...);
// 更多功能...
};
7. 厂商HAL实现路径
路径示例:
# Qualcomm平台
hardware/qcom/audio/
├── hal/ # HAL实现
├── legacy/ # 旧版HAL
└── post_proc/ # 后处理
# 设备特定
device/<vendor>/<device>/audio/
├── hal/ # 设备特定HAL
└── configs/ # 音频配置文件
8. 系统定义和配置文件
路径: system/media/audio/include/system/
| 文件 | 内容 |
|---|---|
audio.h | 音频系统核心定义(C API) |
audio-base.h | 基础音频类型定义 |
audio_effect.h | 音频效果定义 |
audio_policy.h | 音频策略定义 |
路径: system/media/audio_utils/include/
| 文件 | 功能 |
|---|---|
audio_utils/ | 音频工具库 |
fifo/ | FIFO缓冲区实现 |
format/ | 格式转换工具 |
9. 音频效果框架
路径: frameworks/av/media/libeffects/
libeffects/
├── factory/ # 效果工厂
│ └── EffectsFactory.c
├── lvm/ # Loudness Maximizer
│ ├── lib/ # 库文件
│ └── bundle/ # 效果包
├── preprocessing/ # 预处理效果
│ ├── Include/ # 头文件
│ └── src/ # 源码
└── libs/ # 效果库
└── reverb/ # 混响效果
10. 音频工具和测试
路径: frameworks/av/media/libaudioclient/tests/
| 测试文件 | 测试内容 |
|---|---|
AudioTrackTests.cpp | AudioTrack功能测试 |
AudioRecordTests.cpp | AudioRecord功能测试 |
AudioEffectTests.cpp | 音频效果测试 |
路径: frameworks/av/media/mtp/
| 工具 | 功能 |
|---|---|
audioserver | 音频服务进程 |
media.log | 音频日志工具 |
关键配置文件路径
1. 音频策略配置
# 通用配置
/system/etc/audio_policy_configuration.xml
/system/etc/audio_policy_volumes.xml
/system/etc/audio_policy_volumes_drc.xml
# 设备特定配置
/vendor/etc/audio_policy_configuration.xml
/vendor/etc/audio_effects.xml
2. 效果配置文件
/system/etc/audio_effects.conf
/vendor/etc/audio_effects.conf
/data/misc/audio_effects/ # 用户效果配置
编译系统配置
路径: frameworks/av/services/audioflinger/Android.bp
cc_library_shared {
name: "libaudioflinger",
srcs: [
"AudioFlinger.cpp",
"Threads.cpp",
"Tracks.cpp",
// ...
],
shared_libs: [
"libaudioclient",
"libmedia",
"libcutils",
// ...
],
// ...
}
调试和日志
1. 日志标签
# 常用日志过滤
adb logcat -s AudioFlinger
adb logcat -s AudioPolicyManager
adb logcat -s AudioTrack
adb logcat -s AudioRecord
adb logcat -s audio_hw_primary
adb logcat -s audio_policy
2. 调试工具
# 音频调试工具
tinymix # 混音器控制
tinyplay # 音频播放
tinycap # 音频录制
alsa_amixer # ALSA混音器
alsa_aplay # ALSA播放
alsa_arecord # ALSA录制
# 系统工具
dumpsys media.audio_flinger # AudioFlinger状态
dumpsys media.audio_policy # AudioPolicy状态
dumpsys audio # 音频系统状态
代码流程示例
音频播放完整流程:
1. App → AudioTrack.java (Java)
2. AudioTrack.write() → android_media_AudioTrack.cpp (JNI)
3. android_media_AudioTrack_write() → AudioTrack.cpp (C++)
4. AudioTrack::obtainBuffer() → AudioTrack::write() (libaudioclient)
5. AudioTrack::createTrackI() → IAudioFlinger.createTrack() (Binder IPC)
6. AudioFlinger.createTrack() (services/audioflinger)
7. AudioFlinger::PlaybackThread::createTrack_l()
8. AudioFlinger::MixerThread::prepareTracks_l()
9. AudioFlinger::AudioMixer::process()
10. PlaybackThread::threadLoop_write()
11. AudioStreamOut::write() (HAL)
12. audio_hw_device::out_write() (厂商HAL)
13. tinyalsa/ALSA驱动写入
常见问题定位路径
| 问题类型 | 建议查看路径 |
|---|---|
| 无声/杂音 | AudioFlinger Threads.cpp, HAL实现 |
| 音频延迟 | FastMixer.cpp, audio_hw.cpp |
| 设备切换失败 | AudioPolicyManager.cpp, 策略配置 |
| 音量问题 | AudioPolicyManager音量曲线, audio_policy_volumes.xml |
| 录音问题 | RecordThread.cpp, 输入设备配置 |
| 音效失效 | Effects.cpp, audio_effects.conf |
这个代码路径结构反映了Android音频系统的模块化设计,每个层级都有明确的职责边界,便于维护和扩展。

5864

被折叠的 条评论
为什么被折叠?



