在 RK3588 上彻底禁用 HDMI 音频输出:从临时调试到 AOSP 源码固化
适用平台 :Rockchip RK3588 / OK3588
Android 版本 :Android 10+(Audio Policy v7.0)
关键词 :audio_policy_configuration.xml、HDMI 音频禁用、AOSP 编译、vendor 分区、RK3588
背景
在基于 Rockchip RK3588 的嵌入式设备(如数字标牌、工控一体机)中,一个常见需求是:
视频通过 HDMI 输出到显示器,但音频必须强制从板载喇叭播放,完全不走 HDMI。
然而,默认 Android 系统会将 HDMI 视为合法的音频输出设备。一旦插入 HDMI 线,媒体音、通知音等会自动"切换"到 HDMI,导致喇叭无声------即使用户根本没有接音响。
本文记录了从手动调试验证 到AOSP 源码固化的完整过程,并总结了在 Rockchip 平台上容易踩的坑。
第一步:定位问题根源
Android 的音频路由策略由 /vendor/etc/audio_policy_configuration.xml 控制(注意:不是 /system/etc/)。
通过 adb 查看设备上的配置:
bash
adb shell cat /vendor/etc/audio_policy_configuration.xml
发现其中包含以下关键定义:
xml
<!-- HDMI 输出设备声明 -->
<devicePort tagName="HDMI Out" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink"/>
<!-- HDMI 专用输出通道 -->
<mixPort name="hdmi" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT">
<profile format="AUDIO_FORMAT_PCM_16_BIT" ... />
<profile format="AUDIO_FORMAT_IEC61937" ... />
</mixPort>
<!-- 路由规则:primary output 和 hdmi 都可输出到 HDMI Out -->
<route type="mix" sink="HDMI Out" sources="primary output,hdmi"/>
这三处配置共同导致系统认为 HDMI 是一个有效的音频输出路径。
第二步:手动修改验证(快速原型)
为快速验证方案,采用"拉-改-推"方式:
bash
adb root
adb remount
adb pull /vendor/etc/audio_policy_configuration.xml
编辑文件,删除以下三部分:
<mixPort name="hdmi" ...><devicePort tagName="HDMI Out" ...><route ... sink="HDMI Out" ...>
保存后推回设备并重启音频服务:
bash
adb push audio_policy_configuration.xml /vendor/etc/
adb shell setprop ctl.restart audioserver
✅ 测试结果:
- 插拔 HDMI 线,声音始终从 Speaker 出
- 媒体、通知、铃声全部正常
- 视频输出不受影响
结论:方案有效!
第三步:固化到 AOSP 源码
既然手动修改可行,下一步是将改动写入 AOSP 源码,确保每次编译都包含此配置。
1. 找到正确的源码路径
对于 OK3588,音频策略文件通常位于:
device/rockchip/common/audio_policy_configuration.xml
将手动验证成功的 XML 内容替换至此。
2. 确保 copy rule 正确
在设备的 .mk 文件中(如 device/rockchip/rk3588/rk3588.mk),必须包含:
makefile
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \
否则,AOSP 不会将该文件打包进 vendor.img。
3. 编译并生成镜像
bash
source build/envsetup.sh
lunch your_ok3588_product-userdebug
make -j$(nproc) updateimg
注意:RK3588 推荐生成
update.img,而非仅刷vendor.img。
第四步:刷机与验证(关键!)
❌ 常见错误:仅用 fastboot flash vendor
在 Rockchip 平台上,标准 fastboot 无法可靠更新 vendor 分区。即使命令返回成功,设备启动时仍可能加载原始分区。
✅ 正确做法 :
使用官方 upgrade_tool 刷写 update.img:
- 进入 Loader 模式(短接 Flash 引脚或 adb reboot loader)
- 加载
parameter.txt和out/target/product/rk3588/update.img - 点击 "Run" 完成全量更新
验证是否生效
刷机后立即检查文件一致性:
bash
# 设备端 MD5
adb shell md5sum /vendor/etc/audio_policy_configuration.xml
# 本地源码 MD5
md5sum device/rockchip/rk3588/audio/audio_policy_configuration.xml
两者必须一致。
再重启音频服务:
bash
adb shell setprop ctl.restart audioserver
最后播放媒体测试声音输出设备。
经验总结
| 问题 | 解决方案 |
|---|---|
| HDMI 自动抢走音频 | 删除 policy 中的 HDMI Out 声明、mixPort 和 route |
| AOSP 修改不生效 | 检查 PRODUCT_COPY_FILES 是否指向正确路径 |
| 刷机后配置未更新 | 使用 update.img + upgrade_tool,避免依赖 fastboot |
| 音频服务未加载新策略 | 手动重启 audioserver |
| 多个同名配置文件冲突 | 检查 vendor/rockchip/common/etc/ 是否存在覆盖文件 |
补充说明
- 保留
HDMIIn:配置中的<item>HDMIIn</item>是音频输入(如 ARC 回传),不影响输出,无需删除。 - 不影响视频:仅禁用音频输出,HDMI 视频显示完全正常。
- 编码与换行符 :确保 XML 文件为 UTF-8 无 BOM ,换行符为 LF,避免解析失败。
结语
看似简单的"禁用 HDMI 音频",实则涉及 Android 音频架构、AOSP 构建系统、Rockchip 平台特性三大层面。只有打通从策略配置 → 源码集成 → 镜像生成 → 设备刷写的全链路,才能实现稳定可靠的交付。
希望本文能帮助正在调试 RK3588 音频的你少走弯路。如有疑问,欢迎留言交流!