无需 Root 即可为 Android 系统声音添加实时全局 EQ 效果的开源项目。
灵感来源于 HubeRSoundX (HXAudio),核心原理一致但完全独立实现并开源。 由于项目是vibe的,急需人才开发实用的UI……
Android 从 API 28 (Android 9) 起提供了 DynamicsProcessing 类,它是 AudioEffect 框架中最强大的多频段音频处理器,内置 4 个独立处理阶段:
输入
|
PreEQ (前级均衡器 — 目前进度)
|
MBC (多频段压缩器 — 未使用)
|
PostEQ (后级均衡器 — 未使用)
|
Limiter(限幅器 — 未使用)
|
输出
关键之处在于构造 DynamicsProcessing 时传入 audioSession = 0:
DynamicsProcessing(0, 0, config)
// ↑ ↑
// priority │
// audioSession = 0 → 全局输出混音器audioSession = 0 是 Android AudioFlinger 的全局输出混音器会话 ID。任何 App 创建的 AudioEffect 只要绑定到这个会话,就可以影响所有经过 AudioFlinger 混音器的音频流。这是 Android 框架层的公开 API 特性,不是漏洞,也无需任何高级权限。
因为 AudioEffect (及其子类如 Equalizer, DynamicsProcessing, BassBoost 等) 是 Android 的公开 API。从 API 1 开始,任何 App 都可以向音频会话创建效果器。audioSession = 0 虽然被标记为 deprecated(Google 官方不建议用于全局输出),但在所有 API 等级(28~37)上均可正常使用,仅输出一条 deprecation warning。
唯一需要的权限是 MODIFY_AUDIO_SETTINGS——这是一个 normal-level 权限(安装时自动授予,无需运行时请求)。
以下场景无法被全局 audio session 0 拦截,因为音频走的是硬件直通路径,绕过 AudioFlinger:
| 场景 | 原因 |
|---|---|
| 通话(Telephony) | 走独立通话音频路径(HAL 层) |
| Audio Offload 播放 | 硬件 DSP 直接解码,不经过混音器 |
| AAudio/OpenSL ES 独占模式 | 直接与 HAL 通信,绕开软件混音器 |
| 部分 USB DAC 直出 | 直接输出路径跳过效果链 |
- 语言: Kotlin
- UI: Jetpack Compose + Material 3
- 音频处理:
android.media.audiofx.DynamicsProcessing(API 28+) - 持久化: DataStore Preferences
- 前台服务:
foregroundServiceType="mediaPlayback"(Android 14+) - 最低支持: Android 9 (API 28)
- 目标 SDK: Android 16 (API 36)
┌────────────────────────────────────────────────┐
│ AudioEffectService (前台服务) │
│ ├─ AudioEngine │
│ │ └─ DynamicsProcessing (session=0) │
│ │ └─ PreEQ × 10 频段 │
│ ├─ StateFlow<AudioEffectState> │
│ └─ SettingsRepository (DataStore) │
└──────────────┬─────────────────────────────────┘
│ Binder + collect()
▼
┌────────────────────────────────────────────────┐
│ MainActivity + Compose UI │
│ ├─ EqualizerGraph (Canvas 频响曲线) │
│ ├─ EqualizerPanel (10 频段滑块) │
│ └─ PresetSelector (预设切换) │
└────────────────────────────────────────────────┘
com/example/TestFilter/
├── MainActivity.kt # Activity,绑定 Service,管理交互
├── audio/
│ ├── AudioEngine.kt # DynamicsProcessing 封装,EQ 控制
│ ├── AudioEffectService.kt # 前台服务,生命周期管理 + StateFlow
│ └── AudioEffectState.kt # 状态数据类
├── data/
│ ├── PresetRepository.kt # 预设曲线定义(可扩展)
│ └── SettingsRepository.kt # DataStore 持久化
├── receiver/
│ └── BootReceiver.kt # 开机广播(TODO)
└── ui/
├── MainScreen.kt # 主界面组合
└── components/
├── EqualizerGraph.kt # Canvas 频响曲线绘制
├── EqualizerPanel.kt # 10 频段垂直滑块
└── PresetSelector.kt # FilterChip 预设选择
用户拖动 EQ 滑块
→ onBandChanged(index, value)
→ AudioEffectService.updateBands(bands)
→ AudioEngine.setBandGains(bands)
→ DynamicsProcessing.setPreEqBandByChannelIndex(ch, i, EqBand)
→ SettingsRepository.saveBands(bands) // DataStore 持久化
用户选择预设
→ onPresetSelected(name)
→ PresetRepository.getPreset(name).bands
→ AudioEffectService.updateBands(bands)
→ AudioEffectService.updatePreset(name)
此处省略环境安装步骤……
git clone https://github.com/Redroadsl/TestFilter.git
cd TestFilter
./gradlew assembleDebug生成的 APK 位于 app/build/outputs/apk/debug/
- 安装 APK 到 Android 9+ 设备
- 首次打开会请求通知权限(Android 13+ 必需,因为前台服务需要通知)
- 点击顶部开关 → 服务启动,通知栏显示"音频滤镜已启用"
- 调整 EQ 滑块或选择预设 → 效果实时生效
- 即使退出 App,服务仍在后台运行,效果持续
- 再次打开 App 可关闭滤镜或继续调整
| 预设 | 说明 |
|---|---|
| Flat | 所有频段 0dB,无效果 |
| 突出低音 | 提升 63~500Hz 低频段 |
| 突出高音 | 提升 4k~16kHz 高频段 |
在 PresetRepository.kt 中可随意添加自定义预设。
- 基于
DynamicsProcessing的 10 段全局 EQ - 前台服务持久运行
- 预设系统(可扩展)
- DataStore 设置持久化
- MBC 多频段压缩器支持
- Limiter 限幅器支持
- 频响曲线预设的导入/导出
- 蓝牙设备自动检测与预设切换
- 开机自启(
BOOT_COMPLETED)
- HubeRSoundX (HXAudio) — 项目灵感来源
- Android
android.media.audiofx框架 - DeepSeek V4 Flash
- OpenCode
GNU GPL v3