ViPER4Android 在三星 N9860(UN1CA 3.2.1)上的安装与排错实录
适用环境:三星 Galaxy Note20 Ultra 5G(SM-N9860)· UN1CA 3.2.1 · KernelSU
ViPER4Android 在三星 N9860(UN1CA)上的安装与排错实录
设备:三星 Galaxy Note20 Ultra 5G(SM-N9860,港版) 系统:UN1CA 3.2.1(OneUI 8.0) Root 方案:KernelSU 日期:2026-10-06
前言
ViPER4Android(V4A)是 Android 上最强大的全局音效引擎。这篇记录我在 UN1CA 第三方 ROM 上从零安装、踩坑、排错的全过程,特别是三星机型特有的几个坑。
一、选对版本:Legacy 还是 AIDL?
V4A 现在有两个互不兼容的版本:
| 版本 | 驱动文件 | 适用设备 |
|---|---|---|
| Legacy | libv4a_re.so | 2020 年以前发布的设备(HIDL 音频 HAL) |
| AIDL | libv4a_aidl.so | 出厂即 Android 15+ 的设备 |
N9860 是 2020 年的机器,必须用 Legacy 版。 之前我误装 AIDL 版,直接报版本锁,就是这个原因。
快速判断命令:
adb shell ps -A | grep "audio.*aidl"
有输出 → AIDL;没输出 → Legacy。
二、需要下载的两个文件
App 本体:
ViPER4Android-2.1.0.apk- 地址:https://github.com/likelikeslike/ViPER4Android/releases
Legacy 驱动模块:
ViPER4Android-RE-v2.1.0-dsp-e09f088.zip- 地址:https://github.com/oodavidsinoo/viperfx_re/releases
- 注意:文件名带
AIDL的是 AIDL 版,别下错 - 文件名里的
dsp-e09f088表示用了最新 DSP 编译,不影响使用
三、安装步骤
- 把 APK 和 zip 传到手机(
adb push或 USB 复制到 Download 目录) - 安装 APK
- 打开 KernelSU Manager → Modules → 点
+选择 zip 刷入 - 重启手机
- 打开 ViPER4Android App,点右下角粉色电源按钮(Master 总开关)打开
注意:v2.1.0 起模块自带挂载逻辑,不需要再装 Hybrid-Mount / mountify 之类的前置模块。
四、排错实录:驱动显示"未找到"
我遇到的情况:模块刷完、App 装完,驱动状态显示"未找到驱动"。按以下顺序排查:
4.1 检查 post-fs-data.sh 是否有执行权限
adb shell su -c "ls -l /data/adb/modules/ViPER4Android-RE/post-fs-data.sh"
如果显示 -rw-r--r--(没有 x),修复:
adb shell su -c "chmod +x /data/adb/modules/ViPER4Android-RE/post-fs-data.sh"
然后重启。
4.2 检查脚本是否真的执行了
adb shell su -c "logcat -d | grep v4a_re"
看时间戳是不是本次开机的。如果只有旧日期的日志,说明脚本没跑。
4.3 我遇到的三个脚本 bug
打开脚本内容:
adb shell su -c "cat /data/adb/modules/ViPER4Android-RE/post-fs-data.sh"
Bug 1:早退逻辑
if [ -s /vendor/lib64/soundfx/libv4a_re.so ]; then
exit 0
fi
如果之前有残留的挂载(比如旧 ROM 的),脚本看到文件存在就直接退出,什么都不做。删掉这三行。
Bug 2:vendor 配置从不绑定
脚本只处理 $MODDIR/system/ 下的配置文件,但模块的 vendor 配置在 $MODDIR/vendor/etc/。三星的 audioserver 读的是 /vendor/etc/audio_effects.xml,不绑这个,系统永远看不到 V4A。
在脚本末尾加上:
find "$MODDIR/vendor/etc" -type f \( -name "*audio_effects*.conf" -o -name "*audio_effects*.xml" \) 2>/dev/null | while IFS= read -r CFG; do
[ -n "$CFG" ] || continue
REL="${CFG#$MODDIR/vendor/etc/}"
bind_file "$CFG" "/vendor/etc/$REL"
done
Bug 3:soundfx 路径错误
脚本里写的是 $MODDIR/system/vendor/lib64/soundfx,但实际模块目录结构是 $MODDIR/vendor/lib64/soundfx(没有 system/ 前缀)。把两处 bind_dir 的路径改对:
bind_dir "$MODDIR/vendor/lib64/soundfx" /vendor/lib64/soundfx
bind_dir "$MODDIR/vendor/lib/soundfx" /vendor/lib/soundfx
4.4 为什么不能手动 bind?
我试过手动 mount -o bind,日志显示成功了,但 audioserver 的 dlopen 依然报 not found。
原因:通过 adb shell su 做的 bind 挂载,只在 su 的 mount namespace 里可见,audioserver 跑在另一个 namespace 里,根本看不到。必须让 post-fs-data.sh 在开机阶段执行,那时还在 init 的 namespace,所有进程都能看到。
4.5 修复后的脚本
改完三处后,push 回手机并给执行权限:
adb push post-fs-data-fixed.sh /data/local/tmp/post-fs-data.sh
adb shell su -c "cp /data/local/tmp/post-fs-data.sh /data/adb/modules/ViPER4Android-RE/post-fs-data.sh"
adb shell su -c "chmod 755 /data/adb/modules/ViPER4Android-RE/post-fs-data.sh"
重启手机。
五、三星特有:系统音效二选一
重启后打开 设置 → 声音和振动 → 音质和音效,系统会让你二选一:
- 三星自带(SoundAlive / Dolby)
- v4a
选 v4a。选三星自带的,V4A 就白装了——两个是互斥的。
六、验证生效
- 回到 ViPER4Android App,确认 Master 开关已打开
- 把输出增益拉到 +8dB 左右
- 放一首歌听一下
- 关掉 Master 再听——音量明显掉回去
- 重新打开,音量回来
有 AB 区别就说明 DSP 链路正常工作。
注意:默认所有参数都是 0dB,不做 AB 对比是听不出区别的,这是正常的。
七、日常使用
- App 不需要常驻:音频处理跑在系统
audioserver进程里,App 只是遥控器,调完关掉就行 - Master 状态会保存:重启不丢失
- 蓝牙:如果想让蓝牙耳机也走 V4A,去开发者选项里关闭"蓝牙 A2DP 硬件卸载"(硬件直通会绕过软件效果链)
- 和三星自带音效互斥:系统里选了 v4a,就别再开杜比之类的
八、关键命令速查
# 检查驱动文件
adb shell su -c "ls -Z /vendor/lib64/soundfx/libv4a_re.so"
# 检查配置补丁
adb shell su -c "grep -r v4a /vendor/etc /system/etc 2>/dev/null | grep -v Binary"
# 检查脚本执行日志
adb shell su -c "logcat -d | grep v4a_re"
# 检查 audioserver 加载情况
adb shell su -c "logcat -d | grep -i v4a | tail -15"
# 重启音频服务(免重启手机)
adb shell su -c "pkill audioserver"
总结
这次最大的教训:版本选对 + 脚本修对,剩下的都是体力活。V4A 的 Legacy/AIDL 分叉是第一道坎,三星的 /vendor/etc 读取路径是第二道,mount namespace 隔离是第三道。全趟过去,也就四步安装的事。