fix(client): 切后台停看门狗 — 后台 urltest 被限流不再误判节点死断连
真机(Honor/MagicOS)复现:连上后切后台 ~1min 必断,报「当前节点异常」。 logcat 铁证:进程存活、Dart 看门狗后台照跑, [Watchdog] urltest stale 59s → upstream dead → unhealthy → doStop 根因:后台(Doze)把 urltest 主动探测限流 → urltest 停更,但 speed 帧仍在流 → statsLive=true + urltest 陈旧 → 路径A 误判上游死,把正常隧道断掉。上次的 statsLive 闸只挡「stats 整体停」(macOS 睡眠),挡不住「speed 在流、只 urltest 停」。 修:看门狗是前台 UX 功能(发现节点死好让用户换),后台无 UI 可响应、urltest 必被限流 → AppLifecycleListener 在 paused/hidden 停看门狗,resumed 且仍连接则重启(基准由 _onStats 首帧/gap 重置)。真·内核掉线(路径A',事件驱动)不受影响,仍上报。 测试:connection_watchdog 新增「切后台停看门狗」回归(后台 speed 在流+urltest 停 >45s 不切节点);全 7 例过。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
// - 状态来源:bridge.statusStream(来自内核回调),非 Timer 模拟。
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../bridge/log.dart';
|
||||
@@ -93,6 +94,19 @@ class ConnectionController extends StateNotifier<ConnectionState> {
|
||||
unawaited(_disconnect());
|
||||
}
|
||||
});
|
||||
// 生命周期闸:切后台停看门狗,回前台再开。原因:后台(尤其 Android Doze)会把 urltest
|
||||
// 的主动探测限流 → urltest 停更、但 speed 帧仍在流 → 路径 A 误判「上游死」把正常隧道断掉
|
||||
// (实测 Honor 后台 ~1min 必现:logcat「urltest stale 59s → upstream dead」)。后台无 UI 可
|
||||
// 响应,停掉最稳;回前台基准由 _onStats 首帧/gap 重置。真·内核掉线(路径 A',事件驱动)不受影响。
|
||||
_lifecycle = AppLifecycleListener(
|
||||
onStateChange: (s) {
|
||||
if (s == AppLifecycleState.resumed) {
|
||||
if (state.phase == VpnPhase.on && _watchdog == null) _startWatchdog();
|
||||
} else if (s == AppLifecycleState.paused || s == AppLifecycleState.hidden) {
|
||||
_stopWatchdog();
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
final Ref _ref;
|
||||
@@ -102,6 +116,7 @@ class ConnectionController extends StateNotifier<ConnectionState> {
|
||||
ProviderSubscription<AuthState>? _authSub;
|
||||
Timer? _elapsed;
|
||||
Timer? _watchdog;
|
||||
AppLifecycleListener? _lifecycle;
|
||||
bool _probing = false;
|
||||
// 最近一次 urltest 成功(经 proxy 真实可达)的时刻;路径 A 用其陈旧度判上游死。
|
||||
DateTime? _lastUrltestOk;
|
||||
@@ -381,6 +396,7 @@ class ConnectionController extends StateNotifier<ConnectionState> {
|
||||
_authSub?.close();
|
||||
_stopElapsed();
|
||||
_stopWatchdog();
|
||||
_lifecycle?.dispose();
|
||||
_api?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user