v3.5.0
ColorOS Live Lyrics Bridge v3.5.0
v3.5.0 把 v4 外部歌词协议补到可在长歌词场景稳定运行的形态:Bridge 与 Provider 各自新增并对齐了大小限制常量,Provider 侧加入逐行截短重试,LyricInfoContract 支持纯逐字歌词走完整流水线;这一版本同时收紧 BridgePayloadGate 的去重窗口并把 LockscreenLyricsModule 的渲染/时序逻辑拆到独立类,便于后续按层迭代。
Bridge
LyricInfoContract.parse现在接受 lyric 字段为空、rawLyric 含时间戳的 payload:纯逐字歌词会被视为合法 lyric 进入流水线,原始 rawLyric 仍按字渲染路径使用,避免 Provider 主动把逐字降级成逐行后丢字。external-lyric-protocol新增大小限制常量MAX_LYRIC_FIELD_CHARS = 1_500_000、MAX_TOTAL_LYRIC_CHARS = 3_000_000、MAX_METADATA_FIELD_CHARS = 16_384、MAX_PARCEL_BYTES = 512 KiB,与 Provider 端ExternalLyricV4Protocol同名常量镜像;Bridge 端按字符、Provider 端按 Parcel 字节校验,数字差异由两端的度量单位差异解释,并显式写在常量注释中。- 新增独立的
LyricTimingTuningConstants与render/子包,把渲染与时序调整从LockscreenLyricsModule拆出;模块类体不再直接承载逐字进度、扫光、首句清理与时序微调逻辑,便于单独 review 与单元测试。 - 文本匹配、清理与核心 adapter 配合协议层变更同步更新:
LyricTextMatchPolicy、LyricTextSanitizer、LyricsCoreAdapter与ExternalLyricIngress调整接收侧数据形态与默认值。 app/build.gradle.kts开启testOptions.unitTests.isReturnDefaultValues = true,方便本地单元测试在不依赖 Android 桩时通过运行。- Bridge 端 README 中英文版同步更新 Provider 安装与常见问题说明。
LyricProvider
share/extensions-android中SystemUiBroadcastSender新增submitWithLyricLineFallback:当标准submit流程因 payload 超大被 SystemUI 拒收(且行级降级后仍超限),会调用LyricLineTruncator对三个 lyric extras 做一次有界、按字节预算的中间行截短并重试;retry 时会以调用方传入的原始 lyric/rwLyric/translationLyric 为输入,避免在已降级字符串上重复裁剪。MAX_PARCEL_BYTES改为引用ExternalLyricV4Protocol.MAX_PARCEL_BYTES,统一阈值来源。share/extensions-kt新增LrcTimeFormatter、TrackKeyBuilder、LyricLineTruncator、WordTimeNormalizer、ProviderDiagnostics等桥接辅助类,分别承担时间格式化、track key 计算、行截短预算、逐字时间归一化与 Provider 端诊断输出;现有BridgeEventGates.BridgePayloadGate由单 key 改为ArrayDeque<Entry>的多键 LRU,默认保留最近 8 条 30 秒窗口内的 key,支持按 key 主动 forget,避免跨曲目共用同一去重 slot。- QQ 音乐、网易云音乐、Apple Music、Spotify、汽水音乐与酷狗音乐 Provider 的
SaltLyricBridge同步切换到submitWithLyricLineFallback:当lyric为空但rawLyric含时间标签时仍把rawLyric作为lyric兜底,并把TrackKeyBuilder/WordTimeNormalizer/LrcTimeFormatter等辅助接入主流程;QQ 音乐与 Spotify 同时把增强 LRC 与纯 LRC 分别装入rawLyric/lyric,避免时间信息丢失。 - 酷狗音乐 Provider 移除
KuGouOriginalMediaMetadataPolicy,原职责并入KuGouOriginalLyricCandidatePolicy:取消"临时车机歌词元数据"覆盖专辑封面路径,恢复真实专辑封面,并修复同曲不同标题版本互相切换时偶发的"暂无歌词"或歌曲信息串用。 share/krckit、share/qrckit、share/yrckit中的 KRC/QRC/YRC parser 与语言识别器微调:保持现有 API,仅修正对部分边界(极短行、空逐字、单次消费)解析的稳定性;QQ QRC 翻译对齐仍使用共享扩展层的有界一对一匹配,不退回逐行findClosest。- 新增与本次改动配套的单测:
ProviderDiagnosticsTest、ExternalLyricV4ProtocolSizeLimitsTest、LrcTimeFormatterTest、LyricLineTruncatorTest、TrackKeyBuilderTest、WordTimeNormalizerTest、YrcParserTest及更新后的BridgeEventGatesTest。
本次有内部版本更新的 Provider:网易云音乐 1.1.6、QQ 音乐 1.1.6、Apple Music 1.1.4、Spotify 1.1.6、汽水音乐 1.2.6、酷狗音乐 1.1.9。Poweramp 与 LX Music 本次没有 Provider 侧改动,但 Release 工作流仍会构建它们的 APK 以保持 ZIP bundle 完整。
升级说明
- 请将 Bridge 与正在使用的 Provider 从本次 Release 一起更新;升级后重启设备,或至少重启 SystemUI 与对应播放器进程。
- 如果你使用的 Provider 在 v3.5.0 之前曾因歌词过大被 SystemUI 拒绝,现在会自动通过逐行截短重试一次;如仍失败,请导出 LSPosed 日志并按
[BRIDGE_GATE]、[SystemUiBroadcastSender]、[LyricLineTruncator]、[ProviderDiagnostics]关键字定位日志。 - AOD 首次 attach、prime、槽高、官方行缩放与低刷新切换路径继续沿用 v3.3.0 起的已验证基线,本次未引入新的 AOD 可见性、透明度、尺寸或 readiness 门控。
验证
- Bridge:
testDebugUnitTest、assembleDebug、lintDebug、LSPosed metadata 校验与git diff --check通过。 - LyricProvider:根项目
testDebugUnitTest通过;新增的协议大小限制、桥接工具类与 Parser 单测全部覆盖;BridgePayloadGate LRU 行为已通过更新后的BridgeEventGatesTest覆盖。 - Provider 发布包通过 Bridge workflow 同一 tag(
v3.5.0)一次性构建:Bridge 主 APK + 8 个 Provider APK +LyricProvider-v3.5.0.zip一起上传到 GitHub Release 与 LSPosed 仓库。
Release 资产
ColorOS-Live-Lyrics-Bridge-v3.5.0.apkLyricProvider-QQMusic-v3.5.0.apkLyricProvider-163Music-v3.5.0.apkLyricProvider-AppleMusic-v3.5.0.apkLyricProvider-Poweramp-v3.5.0.apkLyricProvider-Spotify-v3.5.0.apkLyricProvider-QiShui-v3.5.0.apkLyricProvider-KuGou-v3.5.0.apkLyricProvider-LXMusic-v3.5.0.apkLyricProvider-v3.5.0.zip
Provider 为独立 LSPosed 模块,只需安装自己使用的播放器对应 APK。汽水音乐用户仍需在 LSP 管理器中为汽水音乐启用"还原内联钩子",并按管理器提示处理 libart.so。
