## 标题
升级到 1.48.76 后规则整体静默失效:直连规则与广告拦截均不生效,全部流量走代理(VPN)出口
## 现象
1. 同样的规则和设置,在 1.40.0 上「直连(放行)」与「广告拦截」都正常;升级到 1.48.76 后**两者同时失效**。
2. 所有连接在 Activity 中的出口都是代理(即 VPN 出口),没有任何 DIRECT 或 REJECT 生效。
3. 规则页仍显示规则已添加、规则集开关显示为开启,**界面没有任何报错**。
4. 共享能正常启动、能上网,所以不是启动失败,也不是出口不可达:是规则判定结果全部落到了默认 PROXY。
## 复现步骤
1. 在 1.40.0 上配置「放行」直连规则 + 开启广告拦截规则集,确认直连出口与广告拦截均生效。
2. 覆盖安装 1.48.76(保留数据)。
3. 保持设置不变,开始共享,从客户端访问一个已设为直连的域名,再打开一个广告域名。
4. 结果:直连域名没有从物理网出去,广告也没有被拦截;Activity 中所有连接出口均为 VPN。
## 期望
升级后规则继续生效:直连走物理出口,广告域名返回 403(REJECT)。
## 实际
规则引擎对全部请求返回默认 PROXY(RuleSrc.DEFAULT),直连与拦截同时失效。
## 已做的排查(请一并参考)
- 规则 → 放行:当前【__】条;规则 → 规则集:广告拦截开关【开/关】,已启用直连组【__】个。
- Activity → 域名详情 → 命中规则显示:【默认 / 你的直连列表 / 内置广告 / 其他】;出口显示:【VPN / 直连】。
- 客户端确实经由本机代理端口访问(Activity 中能看到这些连接),排除"流量没经过代理"。
- 日志中观察到(如有):rules.rebuilt 的 reject/direct 条数为【__/__】;【有/无】rules.rebuildFailed;【有/无】assetFail;【有/无】probe FAIL。
## 代码线索(供参考,未能确认)
对比 v1.40.0 与 v1.48.76:
- RuleRepository.rebuild 在 1.48 新增了"不发布缺失 assets 的部分快照"的闸门(约 116-123 行):
任一内置名单读取失败或构建后自检失败,直接 return false,整份 Snapshot 不发布。
v1.40.0 在同样位置是无条件 ruleEngine.update(...) 发布快照。
- 冷启动时 RuleEngine 的 snapshot 为空,未命中任何表时兜底 RuleAction.PROXY(RuleEngine 约 104 行)。
- ProxyServerRepository.startSession 在 1.48 新增 check(ready)(约 235 行),理论上构建失败会导致共享启动失败;
但我的共享能正常启动,所以我怀疑的不是启动失败,而是"构建成功但表为空/规则未装载",
或者是 enabledRuleGroups 在升级后与引擎内的快照不一致。
- 1.48 新增的 directEgressUnavailable 只覆盖出口缺失,不覆盖"规则未生效",因此该场景在 UI 上完全静默。 |