Skip to content

Releases

v6.13.1

Choose a tag to compare

@firesahc firesahc released this 13 Oct 11:02

新增功能

  • 修改模式支持调整文字大小 (2703370) (a04b755) (4f6cd60) #16
    • engine:WireValues、ModifyEffect、ModifyApplier 同构扩展 modTextSize(绝对 px,默认 -1f 未修改),AppliedState 捕获基线并 compare-before-restore,与 modAlpha 同范式。
    • wire:RuleRecord(含 origTextSize、构造器、JSON mod_text_size / orig_text_size、Parcel 尾部追加 + dataAvail 守卫)、TypeAdapter、ViewSnapshot、Factory、Draft 同步扩展;老备份/老 parcel 缺省未修改。
    • 编辑器:字号区以原字号为 100% 作 50%~200% 滑块,仅 TextView 且非 AutoSize 时可见;保存换算绝对 px;详情页/列表展示同步。

修复

  • parcel 回读丢失 origTextSize (157068d):尾部追加时误用局部变量承接,字段恒为缺省值。改为直接赋值。由设备 parcel 用例捕获(JVM 单测走 TypeAdapter 路径,天然覆盖不到)。
  • 数字框手输回写滑块映射 (7cc7134):四个数字框(宽/高/alpha/字号)手输曾静默无响应。现输入全程零干预,仅 IME DONE 或失焦提交一次:解析、钳制、拨滑块、走统一映射;空/非法回显当前值;saveCurrent 先 clearFocus 刷出 pending 输入。

测试与基础设施

  • 覆盖文字大小读写与应用基线 (b7ac715):effect 相等、JSON/Parcel 往返与老数据缺省、applier 基线。
  • 慢设备前台确认与超时加固 (b7d2136):dumpsys 折行容忍、foregroundFirst 顺序、超时透传、idle 超时记 infra、新用例进矩阵、亮屏与装机取证。

v6.13.0

Choose a tag to compare

@firesahc firesahc released this 04 Oct 17:52

✨ 新功能

新增「忽略深度」规则选项 #15

针对部分应用界面层级动态变化、导致原有 depth 路径定位失效的问题,新增 「忽略深度」 开关。

开启后,规则将跳过原有的 depth 双锚匹配,仅使用 Resource Name(资源名称) 进行定位,从而提高动态布局场景下的规则命中率。

  • 默认关闭,现有规则行为保持不变
  • 仅在规则存在 Resource Name 且不是 Repeatable 规则时提供该选项
  • 原有 depth 数据仍会保留,关闭开关后即可恢复原来的双锚匹配
  • 由于仅依赖资源名称,界面中存在多个相同资源 ID 的元素时可能出现误命中,请谨慎使用

⚡ 性能优化

优化 Resource Name 单锚匹配

修复旧规则在 Resource Name 匹配失败时可能进行两次 getIdentifier + findViewById 全树遍历的问题。

现在改为:

单次查找 → 可见性检查 → 结构检查 → 失败诊断

成功匹配和失败诊断复用同一个查找结果,在保持原有匹配语义及 fail-closed 行为不变的情况下减少重复遍历。

减少 Matcher 中的重复计算

优化规则匹配过程中对 depth、itemPath 以及结构化匹配字段的重复获取和数组复制。

同时优化失败日志生成过程,避免对同一规则反复调用 getter 和创建数组副本。

优化规则槽位查找

RuleRepository 在查找目标规则时,将目标 RuleSlotKey 从循环内部提取到循环外,避免重复构造及数组复制。

原有重复槽位的 last-wins 行为保持不变。

优化 IPC 规则快照体积

IPC 规则快照改用紧凑 JSON 序列化:

  • 快照不再使用 Pretty JSON,降低传输数据体积
  • 保留持久化 JSON 的可读格式
  • 缓解规则数量较多时接近 8 MiB 快照上限的问题
  • JSON 解析保持兼容,传输校验机制不变

🛡️ 兼容性与稳定性

ignoreDepth 数据向后兼容

新增规则字段不会破坏已有规则:

  • JSON 使用 ignore_depth 字段保存
  • 旧 JSON 缺少该字段时默认 false
  • Parcelable 数据采用尾部追加方式保存
  • 旧 Parcelable 数据读取时缺少该字段同样默认 false
  • 新增字段不会改变原有规则槽位身份

同时增加了相关 JSON、Parcelable、规则槽位及 Matcher 测试,确保 true/false 状态能够完整往返。

🏗️ 架构与工程改进

编辑器与运行时进一步解耦

新增 RuntimeRulePort,编辑器不再直接依赖具体的 RuleLifecycleManager / ViewController 实现。

预览、属性修改以及粒子遮罩等运行时操作统一通过 Activity 级 Runtime Session 完成,并保证同一 Session 内的应用与撤销操作使用一致的运行时拥有者。

分离备份/恢复工作流

规则备份与恢复逻辑独立为 backup 模块,与 control 权威控制层解耦。

同时将包名校验能力下沉至公共 util 层,减少模块之间的实现级依赖。

隔离 Xposed 平台适配

将隐藏的 PackageManager 访问以及 ContextWrapper 的 Xposed fallback 从通用工具中抽离至 platform/xposed。

普通 Android 工具类不再直接依赖 Xposed API,Xposed 平台能力集中在注入/平台适配层装配。

新增架构边界自动检查

新增架构边界验证脚本,并接入 CI。

CI 现在会自动检查:

  • Editor 不得直接依赖 Runtime 实现
  • Control 不得反向依赖 Editor 工作流
  • Backup 不得依赖 Control 实现
  • Engine 不得依赖 Xposed
  • Xposed API 依赖仅允许存在于 inject/** 和 platform/xposed/**

进一步降低后续重构导致架构边界回退的风险。

v6.12.1

Choose a tag to compare

@firesahc firesahc released this 21 Sep 11:05

✨ 核心更新

修复编辑器配置重建时的状态竞争问题

修复 EditorOrchestrator 在配置变化与布局观察回调交错发生时,可能使用旧的 Activity 现场配置覆盖最新配置事件的问题。

本次调整包括:

  • 新增当前 Activity 对应的最近一次配置事件快照。
  • CONFIG_CHANGED 事件产生的配置快照现在作为重建目标,具有更高优先级。
  • DecorView 的 layout observer 仅负责通知布局事实,不再直接使用现场配置覆盖事件配置。
  • 排队执行的重建回调会在真正执行时重新解析当前 Activity 的最新配置快照,避免回调排队期间产生的配置时序竞争。
  • Activity 会话切换时主动清除旧配置快照,避免前一个 Activity 的配置状态污染新的编辑会话。
  • 保留 observer generation 原有职责,仅用于管理观察者生命周期,不再承担配置事件的语义排序。

这使得配置变化、旋转、布局回调以及异步重建同时发生时,编辑器的配置状态更加一致。

🧪 设备测试与 CI 稳定性改进

去除测试宿主对 su 的非必要依赖

修复设备 instrumentation 测试在部分 CI / userdebug 模拟器环境中因为不存在 su,导致整个测试矩阵无法启动的问题。

调整内容:

  • debug 测试宿主 Activity 改为 android:exported="true",允许通过 adb shell am start 直接启动。
  • 测试宿主启动从:
adb shell su -c "am start -W -n ..."

调整为:

adb shell am start -W -n ...
  • instrumentation 执行与普通 ADB 操作不再强制依赖 su。
  • su 仅保留给确实需要特权的操作,例如 /data/misc/godmode/ 日志目录相关操作。
  • 增加环境能力探测,使 shell / su 能力能够在测试日志中明确记录,但不会因为可选的 su 能力缺失而直接阻断普通测试。

改进设备日志目录处理

设备测试不再将 /data/misc/godmode/ 的“预先存在”作为硬性启动条件。

现在测试脚本会:

  1. 首先检查日志目录是否已经存在。
  2. 不存在时尝试创建。
  3. 如果当前环境无法提供该目录,则记录警告并允许非持久化日志相关测试继续执行。
  4. 只有启用 -RequirePersistentLog 时,才将日志环境作为强制门禁。

这样可以区分“产品测试失败”和“当前测试设备没有提供所需特权环境”。

区分基础设施失败与断言失败

测试脚本现在明确区分:

  • Infrastructure failures:测试宿主没有成功启动、测试超时、设备/测试环境中断等。
  • Assertion failures:测试已经实际运行,并且代码行为/断言不符合预期。

同时:

  • 测试超时现在被归类为基础设施失败。
  • 基础设施失败继续支持自动重试。
  • 已经产生明确测试执行结果的情况下,不再因为同时存在前台化异常而错误覆盖真正的断言结果。
  • 最终失败报告分别列出基础设施失败与断言失败,提高设备测试问题定位效率。

增强稳定化检查

verify-stabilization.ps1 新增对测试脚本中 su -c 使用方式的静态检查:

  • am
  • dumpsys
  • echo
  • test
  • ls
  • input
  • cmd

等不需要特权的命令不得被强制包装进 su。

这样可以避免以后再次引入“CI 环境缺少 su 导致整个测试体系失效”的问题。

v6.12.0

Choose a tag to compare

@firesahc firesahc released this 21 Sep 06:49

一、编辑器工具栏:微信兼容与配置架构(本轮主线)

  • (fd153e5) feat(editor):添加横屏双区工具栏与旋转重建——竖屏单卡拆双组、新增 layout-land 横向双列与小尺寸、旋转经 onConfigurationChanged 重建面板。#14
  • (5770ef8) fix(editor):修复微信工具栏不显示及样式异常——GmResources 新增 createUiContext(包上下文→宿主配置快照→GmPanelTheme)与 module-first 分类 catch,面板切统一入口、清退 injectInto/syncConfiguration,布局去致命引用、样式程序化回填,涟漪独立实例+mask 有界化+主题中性灰,配套门禁与覆盖单测。#10
  • (72ae453) fix(editor):修复横屏面板配置重建——引入不可变 ActivityConfigurationSnapshot(engine 层、零 Android 依赖),GmResources 收敛为配置作用域 UiContext,重建收归 EditorOrchestrator 统一协调。
  • (8b953c1) fix(editor):同题 follow-up——新增 ActivityConfigurationSnapshotMapper 边界适配器,删除旧面板动画/延迟回调,补充生产资源入口与设备 instrumentation 测试。
  • (b5c0cfa) refactor(editor):通过编辑器端口传递工具栏偏好——移除对 RuleEditorClient 单例隐藏读取,改由编排器显式注入 IRuleEditor,测试可用 fake。
  • (d4bb491) fix(resources):收窄配置化资源降级边界——降级链按阶段拆分并仅对兼容异常 fallback,样式汇总日志改为可读名且诚实声明口径。

二、测试证据体系

  • (85f8897) test(ipc):Xposed 入口 fork 安全红线(门禁级单测)。
  • (bf34f73) test(editor):配置重建与投影边界——复用现有前台 Activity 与 RESUMED 监视,覆盖横竖屏重建、重复事件收敛、observer 合并、隐藏面板门控、会话关闭、panel/mask 计数。
  • (65c4c9c) test(instrumentation):前台测试矩阵——App instrumentation 从 7 法扩展为 16 法逐方法用例,harness 强制 RESUMED 确认,Gradle 结果扫描限定避免误读旧结果。
  • (210cb85) docs(architecture):补充配置快照边界与测试证据——CONFIG_CHANGED 唯一语义来源、DecorView observer 安全网职责、快照最小投影声明,同步测试数量台账。

三、IPC 职责门面收归(architecture-boundary 落地链)

  • (1ea2308) 抽取 ServiceConnection 连接核;(7b0add2) 抽取 LogBridge 并同步门禁口径;(3c15287) 编辑写入主干收归 RuleEditorClient;(fdeb6ce) 抽取 ImageStore 并迁移图片 FD 调用方;(7701614) 读观察维护收归门面并降级 Client 为垫片;(320f2ef) 门面真单例 cutover 断旧组装回流;(e736c99) 删除 Client 并迁移剩余调用到职责门面;(f88c94b) mutation 终态日志迁入 RuleEditorClient。
  • (f7cc20c) fix(ipc):租约 owner 统一经延迟 getter。

四、生命周期通道收敛

  • (e68de03) refactor(lifecycle):收敛生命周期与规则发布为单一显式通道;(110747c) refactor(lifecycle):收敛 RESUME 唯一源并回归快照单写点。
  • (80c8d45) fix(ipc):fork 期延迟 Handler 与 Binder 桩创建。

五、注入层解耦(Xposed 反向依赖清除)

  • (8a33bfe) refactor(runtime):断开注入层与运行时双向循环依赖;(bb3abe1) refactor(recycler):端口化 Recycler 绑定链路;(b40a192) refactor(inject):Recycler 绑定 Hook 物理迁入 inject 包;(4906ef2) refactor(editor):图片选择 Hook 迁出 Panel,断开 UI 对 Xposed 依赖;(b2e3b89) refactor(editor):交互 Hook 经 EditorInteractionPort 解耦。

六、卫生与文档

  • (1a0af05) refactor(hygiene):删除死代码并收敛运行时比较与日志入口;(f5280b2) refactor(hygiene):Comparator 归 rule 包与图片失败提示回传 Panel。
  • (994cc39) docs(arch):新增架构边界准则并接入导航。

七、其他修复

  • (6de6294) fix(control):空 FD 短路跳过包目录解析。

验证状态(随本段发布)

  • 已知说明:(72ae453) 与 (8b953c1) 标题撞车(后者实为前者 follow-up),阅读时以后者补全为准;panel style done 汇总行中 expected 仅表示声明的 patch 项数,非视觉资源全量。

v6.11.0

Choose a tag to compare

@firesahc firesahc released this 05 Sep 04:48

✨ 新功能(2)

  • (65bbb6b) feat(matcher):单元素失败诊断 — 保持 depth 优先、资源交叉验证、fail-closed 不变,记录首个失败原因(路径/可见性/资源名/结构字段),同规则+同视图状态去重,支持资源锚点失败与缺定位字段诊断。
  • (5bb84cf) feat(ipc):补全 6 类结果码中文诊断 — WRITE_FAILED / STALE / EXPIRED / OWNER_MISMATCH / ALREADY_UNDONE / INVALID 给原因+可执行动作,forResultStatus 补映射,同步更新单测中断言。状态逻辑不动。

🐛 修复(11)

运行时/稳定性:

  • (40352a0) fix(hooks):隔离可选安装与宿主事件返回 — 生命周期/Touch/Key Hook 独立维护安装状态、可独立重试;编辑器与 repeatable 规则逻辑 gate,观察回调异常只记录、保持宿主默认返回。
  • (3c1acdb) fix(recycler):按 ClassLoader 隔离绑定钩子 — notify/bind/recycle 独立安装状态;仅 bind/recycle 成对可用且有 repeatable 规则时走 item 快速路径,保留回收清理与 bindingEpoch 语义。
  • (2ece30a) fix(runtime):仅物理写入后标记布局 — 去掉批量匹配入口对 mSelfTriggeredLayout 的无条件设置;新增包内批量写入回调,ViewController 仅在 applier 真改 View 后通知基线监听,避免 NO_MATCH/异常吞掉后续真实布局。
  • (18e8cc4) fix(runtime):保留异常前的布局写入标记 — 批量应用已有物理写入后异常退出时只清 applying 守卫,保留自身布局标记以覆盖已发生的布局反馈。

编辑器:

  • (4851ab2) fix(editor):丢弃过期 Activity 编辑回调 — 复用 Activity 引用+会话代次,切页/销毁后停旧会话的覆盖层与撤销更新;保存期关闭请求延迟到统一收尾,校验 Activity/DecorView root/目标 View 身份。
  • (1f02a78) fix(editor):保存/取消后保留修改模式并恢复遮罩 — 显式回 MODIFY 模式并恢复当前选中遮罩;saving 期整面板关闭延迟执行;移除提交改视图同一性+选择版本投影,防飞行中切选中被旧索引覆盖。
  • (12c0378) fix(editor):预览经作用域控制器 — PreviewHandler 两方法加 Activity 入参,经 getViewController 解析作用域实例(单例兜底),4 处调用点传 Activity,dismiss 用跟踪引用;无 Activity 时行为不变,避双 applier 互踩。
  • (ca10673) fix(editor):屏蔽遮罩跟随本地乐观应用 — Completion/OnBlockListener 加 onFrontApplied(default 空实现);动画启动处本地应用成功即推进选中与遮罩,提交到达靠 revision 守卫幂等;失败路径纠正遮罩,账本仍只在 onCommitted 处理。
  • (3d55cfb) fix(editor):修改保存遮罩跟随本地应用成功点 — 本地 applyRule 成功后立即 notifySession 刷遮罩,不等后端写入;失败走 finishSaveFailure/abort 纠正。

备份:

  • (d85511e) fix(backup):写出改走 withImagePath,守不可变契约 — 单行替换,copyWith 逐字保留其余 15 字段。
  • (3c1937b) fix:备份解码切严格标准 — decodeRequiredImage 改 decodeFileStrict,与 IPC 写入口对齐,超大图走既有按条目拒绝;clearCache 联动清 BITMAP_CACHE。

♻️ 重构(6,零语义变更)

  • (70fb01d) refactor(rule):切除 AppRules/ActRules 的 Parcelable 残留 — AIDL 层已删对应 parcel,6.10 全走 SharedMemory+JSON,全仓零调用;保留 Map 继承、null 过滤与 Gson 路径。
  • (126192e) refactor:新增 engine Closeables 并收敛静默关闭 — Closeable/PFD/SharedMemory/Os 四重载替代 catch-ignored 空块;迁移 Client/GmGlideModule/Server 共 5 处,删 Server 私有重复。
  • (40e86fa) refactor:业务异常吞没处补分级日志与注释 — 租约回调 4 处补同级注释(该类无 Logger 系既有设计);Hook 热路径与诊断路径补单行注释防刷屏;ImageLoadState 上报回调异常加 w 日志;其余 10 处 verified-keep。
  • (7587d54) refactor(ui):设置页复用 ToolbarPrefsManager 解析 — 删 SettingsFragment 私有 parseHiddenItems,legacy 迁移与读写链不动,格式错多得 w 日志。
  • (b1a8f9e) refactor(ipc):Contract 收纳结果码语义分类 — 新增 isTerminalSuccess/isRetryableTransient/isUncertain 纯静态分类器;Client 替换裸比较,BUSY/REJECTED 提 warning,reconcile 抽四个命名函数。
  • (49e8913) refactor(ui):编辑态收敛为单快照工厂 — 新增不可变 EditModeSnapshot(available/active 唯一派生);QS 点击三读与磁贴谓词、通知切换与观察者共 5 处改读快照。

📝 文档与测试(3)

  • (c1b2760) docs(runtime):记录正交稳定性边界 — Hook gate、编辑器会话、Recycler 配对安装、基线 self-layout 标记的行为约束;明确不改 Direct 匹配、规则格式、IPC 权威合同。
  • (d041a0c) docs:补分工禁区类级注释 — 6 组互补设计(资源访问器/注入器、日志门面/落盘、三处基线与索引、相等语义四套、编辑快照与运行时基线、双备份路径)。纯注释。
  • (dc7812e) test:新增反向 golden 与桩掩码特征测试 — WireBoundaryNegativeTest 锁 SlotKey/基线禁持久化;RuntimeVsDisplayEqualityTest 锁展示变更不驱动运行时 diff;StubMaskingCanaryTest 为 returnDefaultValues 掩码立字据。

v6.10.1

Choose a tag to compare

@firesahc firesahc released this 25 Aug 10:03

热修复版本 · 基于 v6.10.0

🐛 问题修复 (5a97314)

  • 修复更新后持续提示「规则服务合同不匹配」
    • 现象:从旧版本更新至 6.10.0 后,即使完整安装新模块并重启系统,管理端依然反复提示“规则服务合同不匹配”,规则功能无法使用。
    • 根因:服务身份校验所用的构建版本基准被硬编码为固定值 61000,而 6.10.0 起版本号改为按提交计数自动生成(当前为 493+),两者结构性不等——重启无法消除常量与动态值的偏差,提示陷入死循环。
    • 修复:构建身份改为与本构建 versionCode 动态同源。客户端与服务端同装一份 APK 时必然一致;仅当更新后未重启、system_server 仍驻留旧版服务时才会正确触发“请重启系统”提示——该原有保护能力完整保留。
    • 配套:合同测试新增“驻留旧构建拒绝”回归用例;静态门禁锁定动态引用形状,防止硬编码回潮。

⬆️ 升级指引

从 v6.10.0 版本覆盖安装本版 APK 并重启系统即可恢复正常,无需清除数据。

v6.10.0

Choose a tag to compare

@firesahc firesahc released this 25 Aug 09:37

✨ 新功能

  • 编辑器撤销(Undo):引入 system_server 权威撤销账本,规则提交边界内记录有界历史与 lineage,通过 v3 Binder 合同提供幂等 CAS 撤销;修正屏蔽失败回滚与属性提交时序,撤销按钮与晚到回调完全隔离。
  • 规则总览相册:主界面「应用规则」改造为相册式分组预览——每个应用一行(图标 + 名称 + 数量),横向滑动缩略卡片流;点击缩略卡直达详情,长按分组头清空该应用全部规则。
  • 列表长按快速删除:规则列表项支持长按删除(统一确认框 + Snackbar 反馈),首次进入有操作提示;详情页删除同步补上二次确认。
  • 全新 IPC 权威架构(fd-mutate-v2):以 canonical IRuleService 取代旧 Binder 接口,system_server 成为唯一规则权威;规则与图片经单次 mutate 事务携带文件描述符原子提交,混装版本进入 REBOOT_REQUIRED 保护流程,回复丢失只读对账、绝不盲目重放。

🚀 构建与发布

  • 版本标识体系自动化:versionCode 改为构建期取全仓库提交计数(单调递增,免手工维护,永不与门禁脱节);versionName 基线保持纯净 semver,HEAD 恰好落在 v* 标签且工作区干净时判定为发行构建,其余一律自动追加 -dev-<时间戳> 标记;标签与基线不一致时构建期直接报错拒包。
  • APK 文件名同步版本信息:产物命名改为 GodMode-Pro-v{versionName}-{buildType}.apk(如 GodMode-Pro-v6.10.0-debug.apk / GodMode-Pro-v6.10.0-dev-20260825.1618-debug.apk),CI 门禁与本地脚本同步适配。

🐛 问题修复

规则匹配与应用

  • 修复规则“稳定错配同类型首个元素”:现代 App 布局大量复用同一资源 id,原锚定瀑布总是命中遍历序第一个同名视图。现改为 depth 主定位 + res_name 交叉验证的双锚机制;无法确证时宁可漏应用(由全局布局对账兜底重试),绝不错配宿主内容。
  • 修复列表下拉回看时的回弹跳动:GONE 塌缩 × 免 rebind 复用 × 异步重应用叠加导致卡片先全高渲染一帧再塌缩;塌缩改为 attach 同步参与首次布局,中间帧彻底消除。
  • 修复 viewType>0 的规则在复用时误应用到类型不符的卡片,批量路径与复用路径过滤漏斗对齐。
  • 移除类(隐藏)规则不再误接管宿主布局尺寸:只拥有 visibility/alpha/clickable 三项所有权,宿主漂移后重新断言,撤销时 compare-before-restore。
  • 正则匹配增加编译缓存;无效正则降级为永不匹配而非一路上抛崩溃宿主进程。

稳定性与并发

  • 修复模块状态永久卡死:ERROR/DEGRADED 后即使全部层恢复健康也不再恢复,导致所有宿主握手失败、必须重启手机;补全两条故障恢复边并锁定七态转换矩阵。
  • 服务失联即撤销运行时效果:Binder 不可用或连接死亡时立即发布空投影清除已应用效果,规则权威保留在服务端,重连后自动恢复。
  • 服务就绪语义修正:LOADING/ERROR 态不再以“伪空规则集”覆盖客户端已有快照;加载完成后向已注册观察者推送 ready 快照,Binder 重连后订阅幂等恢复。
  • 已删除规则不再“复活”:待处理快照写入登记取消机制,删除与写入锁序保证已删目标不被旧 debounce 写回。
  • RecyclerView 绑定所有权治理:单调 epoch 阻止旧复用回调撤销新绑定;异步图片请求绑定 epoch,迟到的失效图片回调不再覆盖当前 View;收集缓存弱引用化,根除 Fragment 切换后的实例滞留泄漏。
  • RuleManager 单例发布顺序缺陷修复:包名改 final 构造注入,消除跨线程观察到未初始化实例的可能。
  • 损坏数据容错:Parcel 反序列化遇到未知枚举名降级为 null 而非抛异常;超大截图经 SafeBitmapDecoder 采样解码,防 OOM。

界面与交互

  • 修复设置页分类标题右移约 40dp 的错位(androidx.preference 空 icon 占位框所致):四分类标题改为 accent 蓝并与分组图标列精确对齐;总开关拼图图标居中且色阶统一。
  • 统一规则截图覆盖层:创建/修改截图时临时隐藏工具栏、属性面板与高亮遮罩并在 finally 恢复;修改图随单次 FD mutate 提交,失败时不发布预览并显示服务端原因。

其他

  • Hook 安装按能力隔离:核心 Hook 与可选 Hook 独立安装,可选 Hook 失败仅禁用自身,不再向宿主抛出异常。
  • 备份恢复加固:兑现规则数(512 条)与 manifest(4MB)上限,恶意超大备份被拒绝而非驱动海量持久化;导出仅修改克隆数据,不再污染调用方。
  • IPC mutation 收尾语义收紧:成功提交后的重复关闭返回 NO_CHANGE 而非 BUSY;空回复与回复丢失统一进入 UNCERTAIN 只读对账。
  • 文件权限改用 Os.chmod:修复原模拟实现放出全局 rwx 且收紧无效的问题。
  • 日志体系治理:统一管理进程 / 模块 / system_server 三进程日志管线(有界串行队列、崩溃同步落盘)、单条消息与 tag 截断上限、清理业务重复日志、补齐 Binder 生命周期与租约上下文、修复 SharedMemory / 图片临时文件 / 观察者失败路径的资源泄漏。

⚡ 性能优化

  • 引擎热路径零拷贝遍历:bindViewHolder 与全局布局扫描改用弱一致只读视图,每次事件省去一次 O(n) 深拷贝与 synchronized 持锁窗口。
  • 资源矢量化:编辑面板按钮与拼图图标共 27 个多密度 PNG 替换为 VectorDrawable,合并空密度目录,减小 APK 体积。

🔒 安全加固

  • 显式关闭 allowBackup,消除私有规则数据暴露于 adb backup / 云备份的提取面。
  • 备份导入拒绝跨包规则与非法文件路径;服务端补充包范围与受信调用方校验。

🛠 内部改进

  • 架构收敛:RuleRecord 物理拆分为不可变 MatchSpec / RuleEffect / RuleSlotKey(v6.9 扁平 wire 格式完全兼容);RuleServiceServer 生命周期职责拆分(短租约控制器、编辑历史 owner registry、Binder death 隔离);editor/orchestrator 对 inject 层反向依赖归零;IPC 诊断文案收拢至 DiagnosticMessages;版本判断收拢至 PlatformCapabilities。
  • 瘦身清理:移除未接入的平台/厂商探测兼容代码、debug.layout 系统布局边界 Hook、383 行零引用 RuleSnapshot 及全部死资源。
  • 测试资产:新增 CompositeMatcher 匹配结果 golden、ZIP V1 备份布局 golden、撤销合同、FD 往返、租约权限与原子恢复、七态转换矩阵等大量 JVM / 仪器测试。
  • CI 与工程化:构建三套 APK 并运行 API 35 instrumentation 与静态合同门禁;Assume 跳过统计可见化;移除 ripgrep 依赖;instrumentation 统一前台时序并设硬期限;Gradle wrapper 换官方源、行尾规范化。

v6.9.0

Choose a tag to compare

@firesahc firesahc released this 14 Aug 10:02

新增

  • 编辑器交互收敛:移除修改/移除模式的长按拖拽、吸附与取消区,触摸事件仅负责选择目标,规则创建统一由工具栏发起;修改工具栏改为「修改/预览」,属性面板以「取消/保存」提交单个目标,并用代次与 saving 状态隔离重复提交和迟到回调(保持 RuleRecord、AIDL、备份格式与模块拓扑不变)。
  • 独立运行时验收宿主 test-target/:独立 Gradle 工程,固定提供普通 View、margin/alpha、120 项纵向 RecyclerView、两种 item 类型、嵌套横向 RecyclerView、dataset refresh、adapter replacement、快速滚动与 Activity recreate 操作,用于设备侧回归验收。
  • 设备应用器测试宿主与脚本:稳定 ModifyApplierInstrumentedTest,新增 run-engine-instrumentation.ps1 与 run-app-instrumentation.ps1,采用「先启动并等待宿主、再经 root 置前台」的 MIUI/HyperOS 兼容拓扑,避免依赖图片识别与坐标点击。

修复

  • 规则修改后目标无法撤销:在 Activity 生命周期内以弱引用记录规则实际应用的目标,批量撤销优先处理这些目标,避免效果改变匹配字段后无法重新定位;新增 debug-only 测试宿主及 7 项设备回归测试(baseline、宿主属性接管、detach/rebind、Activity 重建、多目标隔离)。
  • 图片失败与迟到结果串写:ImageLoadState 统一 executor、解码、主线程投递与回调失败为 pending 状态,并以请求代次和当前 View 所有者阻止迟到图片串写;规则变更与 Recycler 刷新只失效 matcher cache,保留 applier baseline。
  • Recycler 刷新残留旧效果:内容变更以 runtime diff 为唯一效果变更判断(移除基于 RuleRecord 身份相等的错误早退),展示字段变化仅更新缓存、不触发撤销/重应用;item 每次 bind 前经弱引用 owner 撤销旧效果,recycle 时即使 View 已脱离 Activity 也能恢复。
  • 规则缓存可变状态污染:Binder 输入与查询输出对 ActRules、列表、RuleRecord 及嵌套数组执行深复制;使用内部 runtime comparator 区分展示元数据与匹配/应用字段,不修改 RuleRecord Parcelable 合同。
  • 崩溃恢复进入重启循环:以 UTF-8 完整读写崩溃记录,优先内部缓存并保留外部缓存回退;通过时间标记抑制短时间重复重启,记录或调度失败后交还系统异常处理器。
  • 备份/恢复安全边界:每次备份与恢复分配独立临时目录、失败清理残留;拒绝路径穿越、绝对路径、重复条目及超数量/体积上限的 ZIP 输入;仅允许读取恢复临时目录内的相对图片条目。
  • 备份图片完整性:相同源路径复用同一 ZIP 图片条目,不同源同名文件保留扩展名并递增命名;改用流式复制并检查完整传输,避免截断文件。
  • ZIP 导出元数据对齐:备份文件扩展名、批量导出 MIME 与中英文文案统一为 ZIP;恢复选择器仍按 ZIP 内容解析,兼容 6.8.0 的 .gz 命名备份。
  • 规则页面 UI 稳定性:避免异步备份/删除结果写入已销毁视图、丢弃列表项陈旧预览图片、稳定规则详情预览生命周期(加载代次 + Bitmap 所有权)、修复旋转崩溃(复用 Glide RequestManager、规则状态写入 Fragment arguments)。
  • 图片保存会话生命周期:图片选择结果绑定当前 Activity 与编辑代次,禁止迟到回调覆盖原始基线;保存前固定图片引用,异步完成时再次验证目标身份。
  • 规则快照不可变性:MatchSpec 数组 getter 返回防御性副本,RuleDiff 冻结结果 Map 与内嵌 List,热更新差分不再引用可变来源集合。
  • 重复注册与销毁任务边界:串行化 Hook 注册并去重 EventBus 订阅,避免重复消费生命周期事件;销毁 Activity 时释放布局监听器并拒绝残留的首帧、防抖与全局布局任务。
  • 厂商识别区域规则:使用 Locale.ROOT 规范化 Build.MANUFACTURER,避免默认区域设置改变 Xiaomi、Huawei 等厂商能力判断。

构建与 CI

  • 恢复稳定分支验证门禁:补齐 JVM 与 AndroidTest 依赖,CI 更新至 JDK 17 并执行测试、Debug APK、AndroidTest APK 与 lint;移除未使用的网络与旧存储权限及无意义 ProGuard 壳(不改变规则格式与 IPC ABI)。
  • 移除不稳定的依赖镜像:插件与项目依赖统一解析自 Gradle Plugin Portal、Google Maven 与 Maven Central,避免阿里云镜像 502 阻断 Safe Args 的 Kotlin classpath 解析。

文档

  • 建立 6.8/6.9 稳定台账与合同门禁(docs/6.9-stabilization.md、scripts/verify-stabilization.ps1),固化 ABI、规则格式、备份格式与模块拓扑基线。
  • 定义匹配身份、应用目标、效果基线与效果所有权等测试术语,区分产品失败与基础设施中断,明确 instrumentation 通过不能替代设备发布验收。

v6.8.0

Choose a tag to compare

@firesahc firesahc released this 05 Jul 11:46

架构重构

  • 移除文件快照降级链路 — 删除 data/ 包下全部文件(DataBusConstants、RuleSnapshotStore、SignalStore)及 control/SnapshotPublisher,精简约 845 行代码。(5acb34b)

    • 文件快照在 Binder 存活时完全冗余(Binder 即时推送延迟 <1ms,文件快照增加 5-30ms IO 开销)
    • 该链路曾引入 2 个 bugfix 提交 (d266a9d) (44ce77d) ,移除后消除对应维护成本
    • Binder 不可用时不再降级到文件快照,直接返回空规则
    • RuleManager 移除 FileObserver/EventBus/Handler 依赖,移除 refreshFromSnapshot/relaySnapshotToEventBus/installSignalObserver
    • RuleServiceServer 移除 RuleSnapshotStore/SignalStore 构造参数
    • RuleDiff 移除已废弃的 hasChanged() 方法
  • 重命名 runtime 包为 orchestrator — 明确职责边界。(cb3240a)

    • com.kaisar.xposed.godmode.runtime → com.kaisar.xposed.godmode.orchestrator
    • engine 模块提供匹配与应用原语(RuleApplier/Matcher),orchestrator 负责将原语编排为完整的生命周期感知运行时
    • 同步更新 wiki 文档(架构概览、Xposed注入详解、UI与开发指南)中所有引用

Bug 修复

  • 修复 RecycledBitmap 崩溃 — saveAll() 和 snapshotView() 两处崩溃。(1e0d745)
    • saveAll: HashMap 多条 key 因共享对象引用指向同一 entry,导致首条 Bitmap 处理后回收,后续写入 IPC 时 Can't parcel a recycled bitmap。改用 ArrayList<Bitmap> 并行索引 + 写入前 isRecycled() 检查。
    • snapshotView: ImageView 持有来自前次修改的位图,saveAll 后该位图被替换或回收,view.draw(canvas) 尝试 draw 已回收 BitmapDrawable 引发崩溃。包裹 try-catch(RuntimeException) 兜底返回等尺寸透明位图。

依赖清理

  • GmGlideModule 迁移至 ui/glide/ 包 — 消除 util/ 对 ipc/RuleServiceClient 和 rule/RuleRecord 的反向依赖。Glide 注解处理器可自动扫描新包路径。(4e85259)

  • drawRuleMask 参数化 — BitmapUtils.drawRuleMask(Bitmap, RuleRecord) → drawRectMask(Bitmap, x, y, w, h),消除 util/ 对 rule/RuleRecord 类型的依赖。(fdb7f83)

  • isInfoFlowMode 参数化 — RuleRecordFactory 不再直接引用 inject/ModuleBootstrap,isInfoFlowMode 改为由调用方通过 boolean 参数注入,消除 rule/ 层对 inject/ 的反向依赖。涉及 6 处调用方更新。(4813c4d)

v6.7.0

Choose a tag to compare

@firesahc firesahc released this 04 Jul 11:46

包结构重构

  • injection/ → inject/ + ipc/ + control/ + editor/ + runtime/ + data/:从扁平包名拆分为六层结构,按职责分层
  • bridge/ → ipc/:IPC 通信层标准化,新增 RuleServiceClient、ServiceObserver 等组件
  • service/ → control/:控制层职责收敛,新增 ModuleLifecycle 状态机、RuleRepository 仓储、PermissionEnforcer 权限控制
  • injection.editor util → 标准包路径(editor/、util/):工具类和编辑器组件归位
  • ui/ 包收束:表现层组件统一归入 ui/ 目录,不再分散

入口类拆分

HookLauncher 拆分为三个职责明确的类:

  • ModuleBootstrap — Xposed 模块入口,负责初始化与事件通知
  • AppInjector — 应用注入逻辑,接管目标进程注入
  • ServiceBootstrapper — 系统服务引导,接管 bootstrapSystemService()

IPC 架构升级

  • ServiceObserver 回调从直接调用 HookLauncher 改为 Callback 接口委托至 AppInjector,实现依赖解耦
  • RuleManager 新增 Binder IPC 主通道 + 文件快照兜底双路径:IPC 不可用时自动从磁盘 .rule 文件读取,确保 UI 层在桥接未就绪时仍能展示历史规则

运行时强化

  • RuleSingleLiveEvent 替换 saveAllCompleteNotifier,修复修改确认后 saveAll 显示"没有需要保存的修改"
  • 闭合规则快照跨层降级链路,确保文件快照兜底正确触发
  • RuleLifecycleManager 新增规则生命周期管理,RuleSnapshotStore、SignalStore 统一规则快照序列化与存储

接口与命名规范化

  • 移除所有 I- 前缀接口(如 IRuleEditor → RuleEditor),统一命名风格
  • 集合操作从传统循环迁移至 removeIf、forEach、Arrays.stream 等现代 API

修复

  • 修复 RuleManager 信号路径断裂导致规则不生效
  • 修复修改确认后 saveAll 显示"没有需要保存的修改"
  • 日志框架统一、线程安全修复与线程池迁移

构建与配置修复

  • Gradle 构建配置修复,统一版本目录管理