Repository navigation
Releases: Xposed-Modules-Repo/io.github.yigenhuobah.cloudmusictool
Release list
2.4.3
修复
- Issue #4:9.6.13 顶部频道管理(UI-04)不生效:网易云运行时使用 Tinker
热修 ClassLoader,模块启动时挂载的是 base 副本,导致 UI-04 钩子全部
“registered 但零命中”。现改为在首个Activity#onCreate用运行时
ClassLoader 安装 UI-04 钩子,并补充ArkFragmentV2/arkview.ArkFragment
数据链路覆盖。真机 9.6.13 验证:保留「心动/推荐」时顶部只剩这两个频道。 - EN-01 9.6.13 入口适配(第一层):
fullScreen注入入口整包改名
pc2.*→nb2.*,新增BgInfoParser/BgStore覆盖,避免 9.6.13 上
EN-01 类定位失败。9.6.08 不受影响。
已知问题(本次未修复)
- 9.6.13 上 UI-03 发现页推荐卡片隐藏仍不生效,首页卡片未按配置过滤。
- 9.6.13 上 UI-05 底部导航保留仍不生效,底栏 tab 未按配置裁剪。
- 9.6.13 上 EN-01 我的页自定义背景仍不显示:
MyMusicProxyFragment
类已消失(只剩 MyMusicFragmentV3/V4),页面架构变化,第二层调度点待
重新逆向;9.6.08 不受影响。 - 以上三项已记录,下一版继续处理;如急需可在 Issue 中补充诊断页截图和
网易云版本号。
验证
:app:testDebugUnitTest:166 个用例通过;:app:lintDebug、
:app:assembleRelease通过。- 9.6.13 挂载体检 142/142 OK;真机 25102RKBEC 冷启动验证:保留
「心动/推荐」时顶部只剩这两个频道,清空后恢复全部 6 个。
2.4.2
深度代码评审第三轮:调度/管线重构与热路径性能;附带 Issue #1 修复。
修复
- 「我的」页自定义背景整页透出(Issue #1):根因是宿主
gd()要求背景
图经官方加载器真实加载完成才给内容区设半透明遮罩,模块贴图的本地路径
走不通该链路。现于背景贴图后主动应用官方同款 scrim(0x1AFFFFFF),
清除背景时回调宿主恢复;gd()双签名兼容 9.6.08/9.6.13。已知限制:
网易云 9.6.13 起「我的」页架构调整,EN-01 整条链待下一版适配
(9.6.08 不受影响)。 - 诊断回传改领先+尾沿调度并收敛为共享管线:
TargetProcessPublisher统一
HookState 与 ExperimentState 两套回传(共享执行器/Context 反射缓存/authority),
窗口内状态变化不再丢失,最后一次变化必随尾沿上报——冷启动后诊断页
数分钟级延迟的问题根治;实验通道首事件改为立即发送。 - AbTest 定位并入 HookKit 主管线(获得 Profile 参数消歧/旧名映射;DexKit
兜底待锚点补充后自动生效);EN-01 全部类定位改走 HookKit,失败进入
诊断页(原仅 logcat 可见)。
变更
- HookKit 返回类型校验收紧:skipVoid 现要求精确 void 返回(全仓 26 个
skipVoid 站点已逐一审计确认为 void 后收紧),9 个文件的逐处样板检查
收敛为installVoidByName/installConstFalse中心助手。 - 「我的」页 hook 的反射样板与 sampleSize 手工副本删除;set 型配置与
强开映射解析收敛为PrefsSetCodec/ForceMapCodec单一实现;目标包名
常量收敛到Config.TARGET_PACKAGE。
性能
- MMKV 读取 hook 零分配快路径:mmapID 按实例缓存(每读 1 次反射→0)、
相关性判定改首字符预筛+regionMatches(最坏 240B/读分配→0)、黑名单为空
时连查表都不进。基准前后对照见评审产物。 - hit 限流键与 detail 解耦:被限流的命中不再拼字符串/进锁;限流表
超 512 条自动清空重建,消除长会话无界增长。
验证
:app:testDebugUnitTest:165 个用例通过(2.4.1 为 140);两波七组经
全站点审计门、补丁回放与基准复测验收;Issue #1 附带 3 个新用例。
2.4.1
深度代码评审第二轮修复(协议/并发/性能)。
修复
- 回传协议边界真强制:
StatusProvider落盘前对两种通道按结构白名单整体校验
(根键 / Feature 名 / 字段集 / 条数 ≤800 / 字符串 ≤256 / 总量 ≤64KB),不合拒绝;
退役与真实协议脱节的 reg./hit./skip. 白名单死抽象。 - 「我的」页背景三连修:external 共享副本写入改 tmp+rename 原子替换;
clear()/syncExternal()与导入共用单线程队列 FIFO 串行,消除「清除被在途
导入撤销」「导入报成功但文件已清空」等交错终态;目标进程位图缓存按源文件
指纹失效,换图/清除后即时生效,不再需要强杀网易云。 - PV-03 启动任务黑名单套用核心任务保护名单(与 EX-02 共享同一来源),
用户配错黑名单不会误杀受保护启动任务。 - AbTest 挂载失败进入诊断页(原仅 logcat 可见);删除 EN-01 无消费死坐标。
- JsonFilter 零删除快路径:延迟序列化 + 零删除原引用返回 + 嵌套串廉价预门;
实测 500KB 零命中 18.8ms → 0.19ms(≈98×),过滤语义不变。 - 死代码清理:
VersionGate.shouldProceed(恒真)、DexKitAnchors.of、
ProfileRegistry.clearActive、HookState.markNotFound旧重载、
MineBackgroundStore.calculateInSampleSize包装。
变更
ExperimentFragment改用StatusProvider.readExperiments单一读取入口。
验证
:app:testDebugUnitTest:140 个用例通过(2.4.0 为 123);七组修复经
变异验证、补丁回放与独立基准复测验收。- 真机(网易云音乐 9.6.13 / versionCode 9006013,KernelSU + LSPosed,与第三方模块
共存环境)冷启动验证:136 挂载全部注册、进程稳定无 FATAL、回传协议零拒绝。
注:x86_64 模拟器上宿主防篡改库(libpoison.so)有启动崩溃复现,与本版改动的
关联未证实(真机不重现),待模拟器环境恢复后复查。
2.4.0
底栏导航回归 + 适配网易云音乐 9.6.13(fail-open 版本门禁,versionCode 10)。
新增
- 底栏 4 tab 导航:设置 / 实验 / 诊断 / 关于四个顶层 tab 常驻底栏,切换用
hide/show 保留各 tab 滚动位置;「首页定制」保留为二级页(从设置页进入,
带返回箭头,进入时隐藏底栏,返回后恢复)。首页定制页移除冗余的
「仅本机可见」说明(功能表已有同一描述)。 - 适配网易云音乐 9.6.13(versionCode 9006013):新增
Profile9613挂载点总表,
与Profile9608双档案并存,ProfileRegistry按目标 versionCode 自动选择;
相对 9.6.08 的混淆漂移共 34 个挂载点重定位(按 mount id 的 overrides 表 +
hint 第三参等分片级差异),并新增 Profile 感知的方法名映射(hook 文件写死的
9.6.08 混淆名按活动 Profile 换算成实际方法名)。9.6.08 仍受支持。 - fail-open 版本门禁:未适配/未知版本不再因版本不匹配整体跳过 hook:
active Profile 置空后回退硬编码挂载点 best-effort 安装(与 QuietBox 语义一致),
状态卡/异常横幅提示未适配;移除allow_unsupported_version开关。
变更
- 工程整备:新增
tools/release.sh(一键发版:预检 → 构建 → 校验 → 归档 →
可选 tag / Release / 官方仓同步)、tools/verify-apk.sh(Xposed 元数据 / scope /
R8 keep / Manifest / 版本号 / 签名证书校验)、tools/preflight.sh(JDK 21 + SDK +
单测 + lint 预检)、CI(test + lint);接入 JaCoCo 覆盖率报告;新增 prefs/Feature
一致性与 Hook 注册表等单测;appcompat 1.8.0 / material 1.14.0;构建基线 JDK 21
(Java 字节码仍 17)。 - 移除未使用的
compileOnly io.github.libxposed:annotation:1.0.0依赖:
全部源码零引用,compileOnly 不进入 APK,删除不影响功能与产物。 tools/check-mounts.sh支持双档案:期望 versionCode 取自所选 profile JSON
(9608 / 9613 各自携带),不再硬编码单一版本号。
修复
StatusProvider上报 type 只认 mounts/experiments,未知 type 一律拒绝,
防止绕过 mounts 通道的主进程门禁覆盖主进程快照。- EX-02 启动任务编排改用 installOne 传入的会话级 config 快照,不二次
Config.load。 ConfigStore读取 Set 时空串视为未设置回退默认值,与Config.loadSet一致。- 主界面 tab 切换的刷新挂在事务
runOnCommit之后,落在真正切到的新 tab 上。
验证
:app:testDebugUnitTest:123 个用例通过;:app:lintDebug、
:app:assembleRelease、bash tools/preflight.sh、bash tools/verify-apk.sh通过。- 模拟器(网易云 9.6.13 / versionCode 9006013)运行时:115 registered / 0 skip /
10 mapped,无 FATAL。
APK: cloudmusictool-2.4.0.apk
versionCode: 10
大小: 4,231,517 字节
SHA-256: a378b3eeb5658f12d2d39efc3a1017ea926d345f33ddf865366bcdd27209e7de
2.3.0
云音乐工具箱 2.3.0(versionCode 9),适配网易云音乐 9.6.08。
新增
- 隐藏桌面图标:主设置页「其他」分组新增开关。桌面入口改由
activity-alias承载,隐藏只禁用 alias,MainActivity 保留 LSPosedMODULE_SETTINGS入口,可从 LSPosed 管理器重新打开设置页恢复,不会自锁。状态以系统组件状态为准,外部改动(adb / 清数据)回到本页自动同步。感谢 @Z2549 的 PR #3。
变更
- 主设置页在 EX 分组之后新增「其他」分组,用于不属于 AD/UI/PV/EN/EX 的模块级设置。
验证
:app:testDebugUnitTest:64 个用例通过。:app:lintDebug、:app:assembleRelease通过。- 模拟器 emulator-5554(Android 15 / API 35):2.2.0 → 2.3.0 覆盖升级、隐藏/恢复、DONT_KILL_APP 不杀进程、隐藏态冷启动、外部组件状态同步、无 FATAL,全部通过。
- 真机 25102RKBEC(Android 17 / MIUI / LSPosed 2.2.1):2.2.0 → 2.3.0 覆盖升级、MIUI 桌面图标真实移除与恢复、DONT_KILL_APP 不杀进程、LSPosed 管理器入口可打开设置页、无 FATAL。
- 真机当前网易云为 9.6.10(模块仅适配 9.6.08),设置页会显示版本未适配警告;隐藏桌面图标不依赖宿主版本,不受影响。
- 发布签名证书 SHA-256 与 2.2.0 一致。
APK: cloudmusictool-2.3.0.apk,3,873,662 字节
SHA-256: 9ae6276f2639a6c9935dad0349c9b3d8083d282b807ccff08805e6506c9a1e6a
2.2.0
云音乐工具箱 2.2.0(versionCode 8),适配网易云音乐 9.6.08。
新增
- 诊断页:逐功能显示
编号 标题 · registered · hit N · skip 原因,无数据—;页首显示回写时间,页尾提供刷新与复制诊断信息。 - 关于页:模块版本、目标应用、源码、四模块互链(当前模块标注「(当前)」)、免责声明与 MIT 许可证;链接可点击打开。
- 异常横幅:目标版本不匹配,或已启用且明确失败功能数 ≥ 2 时显示;不新增第五种状态卡状态。
变更
- 导航重构:移除 4 Tab 底栏,改为单 Activity + MaterialToolbar + FrameLayout;主页面为设置页,首页定制、实验、诊断、关于为二级页,返回保留主页面滚动位置。
- 状态卡:只保留「正在连接框架… / 未激活 / 框架已连接 / 已激活」四态;删除「目标版本未适配」第五态。
- 功能重编号:33 项统一为 AD-01
AD-09、UI-01UI-15、PV-01PV-06、EN-01、EX-01EX-02;remote prefs key 不变。 - 默认值:AD/UI 默认开,PV/EN/EX 默认关;UI-15 云村与直播推广改为默认开。
- 构建基线:AGP 8.13.2、compileSdk 37、minSdk 29、targetSdk 36、JDK 17、Gradle 8.13。
- 文案:用户可见文案全部迁入
strings.xml,统一前缀,去除人称与默认值重复描述。
验证
- 57 个单测通过;debug/release 构建、lint 通过。
- 真机 25102RKBEC(Android 17 / LSPosed 2.2.1 / 网易云 9.6.08):模块 App 启动正常,状态卡「已激活」,诊断页显示新编号,关于页四模块互链正常,首页定制 UI-16 设置正常;无 FATAL。
- 2.2.0 之前的条目保留发布时的旧编号。
APK: cloudmusictool-2.2.0.apk,3,868,902 字节
SHA-256: a37e2fdcd78f01ea8005482f0f6ed74b9da9f7653100181eb4b11a920602b163
2.1.0
云音乐工具箱 2.1.0(versionCode 7),适配网易云音乐 9.6.08。
新增
- UI-16 我的页自定义背景(默认关闭):在模块 App「首页定制」选择本地图片,
压缩后存入模块私有目录,并同步一份到
Android/media/<模块包名>/mine_background.jpg。 - 启用后「我的」页强制走原生
MyMusicFragmentV4,复用官方全屏背景链路:
把UserBackgroundInfo.validType注入为 4(FullScreen),gh2/b渲染全屏图,
本模块再把本地图片追加到headerBgContainer。 - 注入点:
Profile#setUserBackgroundInfo/setMineUserBackground、
pc2.e$a#B、pc2.f#g/s。只改渲染决策输入,不读写vip/showEntrance。
验证
- 真机 25102RKBEC(Android 17 / LSPosed 2.2.1 / 网易云 9.6.08):
UI-16 挂载、强制原生 V4、validType=4注入、头部全屏背景均通过。 - 内容卡片保持主题深色,未完全透出;已接受。
- 关闭 UI-16 / RN 分支恢复:已回归通过(2026-10-23)。关闭后重启网易云,
日志出现CloudMusicRNFragment,默认「我的」页恢复、无自定义背景、无崩溃。 - 单测 41 项、release 构建、签名校验通过。
构建
cloudmusictool-2.1.0.apk,versionCode 7,3,910,458 字节。
SHA-256: 0c4d418862ce2c07f6ca0a2e0b7007be8156c2257bc7a05a17bd584ad494258b
完整说明见仓库 CHANGELOG.md。
2.0.1
云音乐工具箱 2.0.1(versionCode 6),适配网易云音乐 9.6.08。
改进
- 「可强开实验」为 22 个 key 增加中文名与一句话说明(如
tabMerge→ “Tab 合并”,home-headframe→ “首页头图”)。 - 新增分组说明:
c通常为对照组,t/t1~t4为不同实验组;具体行为由服务端配置决定。 - 未改变强开/白名单逻辑与默认值。
验证
- 真机实验页已显示中文标题、说明与分组帮助;无崩溃。
- 单测、lint、release 构建通过。
完整说明见仓库 CHANGELOG.md 与 docs/phase2/。
2.0.0
云音乐工具箱 2.0.0(versionCode 5),适配网易云音乐 9.6.08。
架构升级
- Profile / MountSpec / MountResolver:133 个挂载点集中到
Profile9608,支持多候选类名、参数/返回类型校验、DexKit 结构/锚点兜底。 - 版本门禁:改为 versionCode +
ProfileRegistry;未适配版本按allowUnsupportedbest-effort,按功能降级。 - Hook 健康度:
expected = attempted;degraded由 critical 挂载点失败驱动,unavailable为 installed == 0;状态卡/诊断卡显示一致。 - check-mounts v2:从 Profile 自动生成检查项,断言 versionCode、类/方法存在、
method_kind IS NOT NULL、参数/返回类型精确匹配。
行为等价
- 9.6.08 冷启动 110 条
registered与 1.2.0 逐行一致,关键 hit 一致。 - 133 个挂载点
check-mounts全 OK;状态卡104/104、degradedFeatures=0、无 FATAL/ANR。
兼容性
- 仅承诺 9.6.08。新增版本 = 新增 Profile 分片 + 跑 check-mounts,不承诺任意版本自动兼容。
已知限制
- UI-04 仍不支持。
- 部分 UI 类没有可靠的 DexKit 字符串锚点,只能精确类名匹配;类改名需人工补 Profile。
- 1.2.0 的未自然触发项(AD-09/UI-10/UI-12/UI-13/UI-14)状态不变。
- Profile 解析失败会回退硬编码,回退路径的 critical 判定依赖 Profile 是否收录该坐标。
完整验收记录见仓库 docs/phase2/2.0.0-VERIFY.md 与 docs/phase2/2.0.0-REVIEW.md。
1.2.0
云音乐工具箱 1.2.0(versionCode 4),适配网易云音乐 9.6.08。
新增
- 实验页(第 4 个 Tab):只读展示实际命中的 ABTest(key / 分组 / 来源 / 次数),数据由目标进程经 StatusProvider 回写。
- 白名单强开:22 个 curated 体验 key,单 key 选择
c/t/t1/t2/t3/t4;已探测但未收录的 key 可手动「提升为强开」;黑名单 key 显示「禁止强开」。 - 一键恢复默认:清空所有强开配置,重启网易云生效。
安全边界
- 精确白名单 + 黑名单:VIP/付费/版权/音质/试听/订单/地区/青少年/登录/Cookie/鉴权/风控/免流/免广告,以及
boot-、kv-/fh-kv-、wait-task-、cold-start-等前缀。 - 强开只改
abtestgroup,不改status/clientConfig(合成对象除外);启动 AB 只读。 :play进程不写实验观测,避免空快照覆盖主进程数据。- 框架未连接时明确提示「配置未保存」,不会静默写本地。
验证
- 真机观测 200 个实验,source 覆盖 libra / old / startup。
minibarMarquee=t4、aosApiHttps=t4强开日志确认;一键恢复后forceKeys=0,无崩溃。- 32 个单测、lint、release 构建通过。
已知限制
tabMerge在 9.6.08 未被查询,无法用它做 UI 分组变化回归。- 合成 config 的
clientConfig为空 Map,checkExperimentWithParam走默认值;本期不做参数强开。 - 黑名单 UI 展示已真机确认,但未逐项点选全部黑名单 key。
- 仅适配 9.6.08。
完整验证记录见仓库 docs/phase2/1.2.0-VERIFY.md 与 docs/phase2/1.2.0-REVIEW.md。