28、Android版本演进:各版本AudioFlinger变化、Treble化改造影响、新特性演进路线、未来趋势
做音频系统这么多年,我亲眼看着AudioFlinger从一个“能出声就行”的模块,慢慢长成了今天这个庞然大物。说实话,每次Google大版本更新,我最先翻的就是frameworks/av/services/audioflinger/目录下的改动。今天咱们就聊聊,这些年AudioFlinger到底经历了什么。
一、Android 4.x ~ 5.x:AudioFlinger的“蛮荒时代”
早期的AudioFlinger,说白了就是个简单的混音器。我记得当时做项目,最头疼的就是多路音频同时播放时的卡顿问题。
- 混音策略:纯软件混音,CPU占用率居高不下
- 线程模型:单线程处理所有音频数据
- 延迟表现:输出延迟通常在100ms以上
- 路由管理:通过
AudioPolicyService硬编码策略
那时候的代码结构很直白——AudioFlinger.cpp一个文件就塞了七八千行。你想想看,所有逻辑揉在一起,改个音量曲线都得小心翼翼。
二、Android 6.x ~ 7.x:低延迟与多线程改造
Android 6.0引入了低延迟音频路径,这是个里程碑。Google终于意识到,音频延迟不解决,音乐创作类App永远没法在Android上好好跑。
核心变化:
- 引入
FastMixer和FastCapture线程,专门处理低延迟路径 - 普通混音走
MixerThread,低延迟走FastThread,两条路径并行 - 新增
AudioTrack::start()的同步机制,减少启动延迟
我在项目中遇到过一个问题:FastMixer跑起来后,普通混音线程反而被饿死了。后来查了半天,发现是线程优先级设置不合理。嗯,这里要注意——FastThread的优先级必须高于普通MixerThread,但也不能高到把UI线程卡死。
三、Android 8.x ~ 9.x:Treble化改造——伤筋动骨
Android 8.0的Treble项目,对AudioFlinger来说是一次“拆骨重造”。说白了,就是把音频HAL层从framework里彻底剥离出去。
为什么会这样?因为以前OEM厂商改HAL代码,经常把framework层也带偏了。Treble之后,AudioFlinger通过HIDL接口与HAL通信,两边各自独立升级。
| 改造前 | 改造后 |
|---|---|
AudioFlinger直接调用hw_module_t | AudioFlinger通过IDevicesFactory获取HAL服务 |
| HAL代码编译进system.img | HAL代码独立为vendor.img |
| 修改HAL需要重新刷机 | HAL可以OTA单独更新 |
| 接口不稳定,厂商随意改 | HIDL接口版本化,向后兼容 |
避坑指南:我曾经在Treble化迁移时踩过一个坑——HIDL接口的版本号没对齐。AudioFlinger请求v2.0,但HAL实现的是v1.3,结果服务死活起不来。后来我养成了习惯:每次升级先检查hardware/interfaces/audio/下的版本号。
四、Android 10 ~ 11:AAudio与AudioFlinger的“双轨制”
Android 10正式推出了AAudio,这是个原生音频API,不走AudioFlinger的传统路径。你可能会问:那AudioFlinger是不是要废了?
其实不是。AAudio在底层仍然依赖AudioFlinger的混音和路由能力,只是绕过了Java层的AudioTrack封装。说白了,AAudio是给NDK开发者的一条“快车道”。
- AAudio路径:App → AAudio → MMAP/SharedMemory → AudioFlinger → HAL
- 传统路径:App → Java AudioTrack → JNI → AudioFlinger → HAL
我个人习惯在需要极低延迟的场景(比如游戏、实时音频处理)用AAudio,普通音乐播放还是走传统路径更稳定。
五、Android 12 ~ 14:空间音频与多设备协同
近几年的版本,AudioFlinger开始往“空间化”和“多设备”方向演进。
Android 12引入了音频空间化(Spatial Audio)的支持。AudioFlinger新增了Spatializer模块,负责将立体声音频映射到多声道空间。我记得第一次测试时,耳机里传来环绕声效果,说实话挺震撼的。
Android 13强化了多设备音频路由。比如你戴着蓝牙耳机,同时用音箱放音乐——AudioFlinger可以分别管理两条输出流,互不干扰。这背后是AudioPolicyManager的全面重写。
Android 14进一步优化了音频焦点管理。以前多个App抢音频焦点时,策略很粗暴——后一个盖掉前一个。现在AudioFlinger支持“混音共存”,比如导航语音和音乐可以同时播放,只是各自调整音量。
六、未来趋势:AI驱动与硬件加速
站在今天看未来,我觉得AudioFlinger有几个方向值得关注:
- AI降噪与增强:Google已经在Pixel设备上试水了,未来AudioFlinger可能会集成轻量级AI模型,在混音阶段做实时降噪
- 硬件加速混音:DSP卸载会越来越普遍。AudioFlinger会把部分混音任务交给DSP,减少AP主核的负载
- 统一音频框架:AAudio和传统AudioTrack的差异会越来越小,最终可能合并成一套API
- 跨设备音频流转:手机、平板、手表之间的音频无缝切换,AudioFlinger需要支持更灵活的设备发现和同步机制
我的建议:如果你现在开始研究AudioFlinger,重点关注ThreadBase和PlaybackThread的继承关系。这个类体系从Android 4.x延续至今,理解了它,你就抓住了AudioFlinger的“骨架”。
七、知识体系总览
下面这张图,是我梳理的AudioFlinger版本演进核心脉络。你可以把它当作一张“地图”,以后看代码时知道自己在哪个位置。
从这张图可以清楚看到,AudioFlinger的演进不是推倒重来,而是在原有架构上不断“打补丁”和“加模块”。每个版本解决一个核心痛点——延迟、解耦、空间化、多设备。未来,AI和硬件加速会是新的增长点。
公众号:蓝海资料掘金营,微信deep3321