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 现在有两个互不兼容的版本:

版本驱动文件适用设备
Legacylibv4a_re.so2020 年以前发布的设备(HIDL 音频 HAL)
AIDLlibv4a_aidl.so出厂即 Android 15+ 的设备

N9860 是 2020 年的机器,必须用 Legacy 版。 之前我误装 AIDL 版,直接报版本锁,就是这个原因。

快速判断命令:

adb shell ps -A | grep "audio.*aidl"

有输出 → AIDL;没输出 → Legacy。

二、需要下载的两个文件

  1. App 本体:ViPER4Android-2.1.0.apk

    • 地址:https://github.com/likelikeslike/ViPER4Android/releases
  2. Legacy 驱动模块:ViPER4Android-RE-v2.1.0-dsp-e09f088.zip

    • 地址:https://github.com/oodavidsinoo/viperfx_re/releases
    • 注意:文件名带 AIDL 的是 AIDL 版,别下错
    • 文件名里的 dsp-e09f088 表示用了最新 DSP 编译,不影响使用

三、安装步骤

  1. 把 APK 和 zip 传到手机(adb push 或 USB 复制到 Download 目录)
  2. 安装 APK
  3. 打开 KernelSU Manager → Modules → 点 + 选择 zip 刷入
  4. 重启手机
  5. 打开 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 就白装了——两个是互斥的。

六、验证生效

  1. 回到 ViPER4Android App,确认 Master 开关已打开
  2. 把输出增益拉到 +8dB 左右
  3. 放一首歌听一下
  4. 关掉 Master 再听——音量明显掉回去
  5. 重新打开,音量回来

有 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 隔离是第三道。全趟过去,也就四步安装的事。