Repository navigation
Releases
v6.13.1
新增功能
- 修改模式支持调整文字大小 (2703370) (a04b755) (4f6cd60) #16
- engine:
WireValues、ModifyEffect、ModifyApplier同构扩展modTextSize(绝对 px,默认-1f未修改),AppliedState捕获基线并 compare-before-restore,与modAlpha同范式。 - wire:
RuleRecord(含origTextSize、构造器、JSONmod_text_size/orig_text_size、Parcel 尾部追加 +dataAvail守卫)、TypeAdapter、ViewSnapshot、Factory、Draft同步扩展;老备份/老 parcel 缺省未修改。 - 编辑器:字号区以原字号为 100% 作 50%~200% 滑块,仅
TextView且非AutoSize时可见;保存换算绝对 px;详情页/列表展示同步。
- engine:
修复
- parcel 回读丢失
origTextSize(157068d):尾部追加时误用局部变量承接,字段恒为缺省值。改为直接赋值。由设备 parcel 用例捕获(JVM 单测走TypeAdapter路径,天然覆盖不到)。 - 数字框手输回写滑块映射 (7cc7134):四个数字框(宽/高/alpha/字号)手输曾静默无响应。现输入全程零干预,仅 IME DONE 或失焦提交一次:解析、钳制、拨滑块、走统一映射;空/非法回显当前值;
saveCurrent先clearFocus刷出 pending 输入。
测试与基础设施
v6.13.0
✨ 新功能
新增「忽略深度」规则选项 #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
✨ 核心更新
修复编辑器配置重建时的状态竞争问题
修复 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/ 的“预先存在”作为硬性启动条件。
现在测试脚本会:
- 首先检查日志目录是否已经存在。
- 不存在时尝试创建。
- 如果当前环境无法提供该目录,则记录警告并允许非持久化日志相关测试继续执行。
- 只有启用
-RequirePersistentLog时,才将日志环境作为强制门禁。
这样可以区分“产品测试失败”和“当前测试设备没有提供所需特权环境”。
区分基础设施失败与断言失败
测试脚本现在明确区分:
- Infrastructure failures:测试宿主没有成功启动、测试超时、设备/测试环境中断等。
- Assertion failures:测试已经实际运行,并且代码行为/断言不符合预期。
同时:
- 测试超时现在被归类为基础设施失败。
- 基础设施失败继续支持自动重试。
- 已经产生明确测试执行结果的情况下,不再因为同时存在前台化异常而错误覆盖真正的断言结果。
- 最终失败报告分别列出基础设施失败与断言失败,提高设备测试问题定位效率。
增强稳定化检查
verify-stabilization.ps1 新增对测试脚本中 su -c 使用方式的静态检查:
amdumpsysechotestlsinputcmd
等不需要特权的命令不得被强制包装进 su。
这样可以避免以后再次引入“CI 环境缺少 su 导致整个测试体系失效”的问题。
v6.12.0
一、编辑器工具栏:微信兼容与配置架构(本轮主线)
- (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 短路跳过包目录解析。
验证状态(随本段发布)
v6.11.0
✨ 新功能(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
热修复版本 · 基于 v6.10.0
🐛 问题修复 (5a97314)
- 修复更新后持续提示「规则服务合同不匹配」
- 现象:从旧版本更新至 6.10.0 后,即使完整安装新模块并重启系统,管理端依然反复提示“规则服务合同不匹配”,规则功能无法使用。
- 根因:服务身份校验所用的构建版本基准被硬编码为固定值
61000,而 6.10.0 起版本号改为按提交计数自动生成(当前为 493+),两者结构性不等——重启无法消除常量与动态值的偏差,提示陷入死循环。 - 修复:构建身份改为与本构建 versionCode 动态同源。客户端与服务端同装一份 APK 时必然一致;仅当更新后未重启、system_server 仍驻留旧版服务时才会正确触发“请重启系统”提示——该原有保护能力完整保留。
- 配套:合同测试新增“驻留旧构建拒绝”回归用例;静态门禁锁定动态引用形状,防止硬编码回潮。
⬆️ 升级指引
从 v6.10.0 版本覆盖安装本版 APK 并重启系统即可恢复正常,无需清除数据。
v6.10.0
✨ 新功能
- 编辑器撤销(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
新增
- 编辑器交互收敛:移除修改/移除模式的长按拖拽、吸附与取消区,触摸事件仅负责选择目标,规则创建统一由工具栏发起;修改工具栏改为「修改/预览」,属性面板以「取消/保存」提交单个目标,并用代次与 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 区分展示元数据与匹配/应用字段,不修改RuleRecordParcelable 合同。 - 崩溃恢复进入重启循环:以 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
架构重构
-
移除文件快照降级链路 — 删除
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
包结构重构
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 构建配置修复,统一版本目录管理