Skip to content

Releases: Xposed-Modules-Repo/io.github.yigenhuobah.cloudmusictool

2.4.3

Choose a tag to compare

@yigenhuobah yigenhuobah released this 25 Oct 09:49

修复

  • 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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 25 Oct 06:50

深度代码评审第三轮:调度/管线重构与热路径性能;附带 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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 24 Oct 09:46

深度代码评审第二轮修复(协议/并发/性能)。

修复

  • 回传协议边界真强制: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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 23 Oct 20:02

底栏导航回归 + 适配网易云音乐 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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 23 Oct 14:15

云音乐工具箱 2.3.0(versionCode 9),适配网易云音乐 9.6.08。

新增

  • 隐藏桌面图标:主设置页「其他」分组新增开关。桌面入口改由 activity-alias 承载,隐藏只禁用 alias,MainActivity 保留 LSPosed MODULE_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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 22 Oct 17:11

云音乐工具箱 2.2.0(versionCode 8),适配网易云音乐 9.6.08。

新增

  • 诊断页:逐功能显示 编号 标题 · registered · hit N · skip 原因,无数据 —;页首显示回写时间,页尾提供刷新与复制诊断信息。
  • 关于页:模块版本、目标应用、源码、四模块互链(当前模块标注「(当前)」)、免责声明与 MIT 许可证;链接可点击打开。
  • 异常横幅:目标版本不匹配,或已启用且明确失败功能数 ≥ 2 时显示;不新增第五种状态卡状态。

变更

  • 导航重构:移除 4 Tab 底栏,改为单 Activity + MaterialToolbar + FrameLayout;主页面为设置页,首页定制、实验、诊断、关于为二级页,返回保留主页面滚动位置。
  • 状态卡:只保留「正在连接框架… / 未激活 / 框架已连接 / 已激活」四态;删除「目标版本未适配」第五态。
  • 功能重编号:33 项统一为 AD-01AD-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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 22 Oct 16:21

云音乐工具箱 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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 20 Oct 14:37

云音乐工具箱 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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 20 Oct 14:27

云音乐工具箱 2.0.0(versionCode 5),适配网易云音乐 9.6.08。

架构升级

  • Profile / MountSpec / MountResolver:133 个挂载点集中到 Profile9608,支持多候选类名、参数/返回类型校验、DexKit 结构/锚点兜底。
  • 版本门禁:改为 versionCode + ProfileRegistry;未适配版本按 allowUnsupported best-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

Choose a tag to compare

@yigenhuobah yigenhuobah released this 20 Oct 13:30

云音乐工具箱 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。