新增调试信息

This commit is contained in:
2025-10-27 22:15:25 +08:00
parent ae62457d8c
commit 04642cb2f0
5479 changed files with 683397 additions and 3450 deletions
+26 -2
View File
@@ -3,10 +3,13 @@ import '../services/api_service/kr_api.user.dart';
import '../utils/kr_update_util.dart';
import '../utils/kr_secure_storage.dart';
import '../utils/kr_log_util.dart';
import '../services/singbox_imp/kr_sing_box_imp.dart';
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:math';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:flutter/foundation.dart';
/// 协议配置
@@ -54,7 +57,27 @@ class KRDomain {
static Map<String, int> _domainResponseTimes = {}; // 域名响应时间记录
static Map<String, DateTime> _domainLastCheck = {}; // 域名最后检测时间
static const int _domainCacheDuration = 300; // 域名缓存时间(秒)
static final Dio _dio = Dio(); // Dio 实例
// Dio 实例及初始化
static final Dio _dio = (() {
final dio = Dio();
// 🔧 配置HttpClientAdapter使用sing-box的mixed代理
dio.httpClientAdapter = IOHttpClientAdapter(
createHttpClient: () {
final client = HttpClient();
client.findProxy = (url) {
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
KRLogUtil.kr_i(
'🔍 KRDomain 请求使用代理: $proxyConfig, url: $url',
tag: 'KRDomain',
);
return proxyConfig;
};
return client;
},
);
return dio;
})();
/// API 域名
static String get kr_api => kr_currentDomain;
@@ -1032,12 +1055,13 @@ class AppConfig {
/// 请求域名地址
/// 基础url
///
// static String baseUrl = "http://103.112.98.72:8088";
/// 请求域名地址调试模式
String get baseUrl {
if (kDebugMode) {
return "https://api.maodag.top";
return "http://154.12.35.103:8080";
}
return "${KRProtocol.kr_https}://${KRDomain.kr_api}";
}
+24 -1
View File
@@ -1,7 +1,8 @@
import 'dart:convert';
import 'dart:io' show Platform;
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
// import 'package:flutter_easyloading/flutter_easyloading.dart'; // 已替换为自定义组件
import 'package:flutter_loggy_dio/flutter_loggy_dio.dart';
@@ -11,6 +12,7 @@ import 'package:kaer_with_panels/app/common/app_run_data.dart';
import 'package:kaer_with_panels/app/network/base_response.dart';
import 'package:kaer_with_panels/app/localization/kr_language_utils.dart';
import 'package:kaer_with_panels/app/utils/kr_common_util.dart';
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
import 'package:kaer_with_panels/app/services/kr_site_config_service.dart';
// import 'package:crypto/crypto.dart';
@@ -44,6 +46,7 @@ class HttpUtil {
/// 对dio进行配置
void initDio() {
KRLogUtil.kr_i('🚀 HttpUtil.initDio() 开始初始化', tag: 'HttpUtil');
// 不使用 Loggy,改用自定义简洁拦截器
_dio.interceptors.add(_KRSimpleHttpInterceptor());
_dio.options.baseUrl = AppConfig.getInstance().baseUrl;
@@ -67,6 +70,26 @@ class HttpUtil {
_dio.options.validateStatus = (status) {
return status != null && status >= 200 && status < 500;
};
// 🔧 配置HttpClientAdapter 优先走本地 sing-box mixed 端口,
// 若代理不可用则回退到直连
KRLogUtil.kr_i('🔧 配置 HttpClientAdapter...', tag: 'HttpUtil');
_dio.httpClientAdapter = IOHttpClientAdapter(
createHttpClient: () {
KRLogUtil.kr_i('📱 createHttpClient 回调被调用', tag: 'HttpUtil');
final client = HttpClient();
client.findProxy = (url) {
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
KRLogUtil.kr_i(
'🔍 findProxy 被调用, url: $url, proxy: $proxyConfig',
tag: 'HttpUtil',
);
return proxyConfig;
};
return client;
},
);
KRLogUtil.kr_i('✅ HttpUtil.initDio() 初始化完成', tag: 'HttpUtil');
}
/// 更新baseUrl
+27 -7
View File
@@ -1,6 +1,7 @@
import 'dart:io';
import 'dart:io' as io;
import 'dart:math';
import 'dart:convert';
import 'package:dio/io.dart' as dio_io;
import 'package:fpdart/fpdart.dart';
import 'package:get/get.dart';
@@ -20,6 +21,7 @@ import '../kr_device_info_service.dart';
import '../kr_site_config_service.dart';
import '../../common/app_config.dart';
import 'package:dio/dio.dart' as dio;
import 'package:kaer_with_panels/app/services/singbox_imp/kr_sing_box_imp.dart';
class KRAuthApi {
/// 检查账号是否已注册(仅支持邮箱)
@@ -227,6 +229,24 @@ class KRAuthApi {
// 使用 Dio 直接发送请求(因为需要特殊的加密处理)
final dioInstance = dio.Dio();
// 🔧 配置HttpClientAdapter优先使用本地 sing-box mixed 端口,
// 失败时退回直连
dioInstance.httpClientAdapter = dio_io.IOHttpClientAdapter(
createHttpClient: () {
final client = io.HttpClient();
client.findProxy = (url) {
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
KRLogUtil.kr_i(
'🔍 KRAuthApi 请求使用代理: $proxyConfig, url: $url',
tag: 'KRAuthApi',
);
return proxyConfig;
};
return client;
},
);
final baseUrl = AppConfig.getInstance().baseUrl;
final url = '$baseUrl${Api.kr_deviceLogin}';
@@ -313,17 +333,17 @@ class KRAuthApi {
}
String _kr_getUserAgent() {
if (Platform.isAndroid) {
if (io.Platform.isAndroid) {
return 'android';
} else if (Platform.isIOS) {
} else if (io.Platform.isIOS) {
return 'ios';
} else if (Platform.isMacOS) {
} else if (io.Platform.isMacOS) {
return 'mac';
} else if (Platform.isWindows) {
} else if (io.Platform.isWindows) {
return 'windows';
} else if (Platform.isLinux) {
} else if (io.Platform.isLinux) {
return 'linux';
} else if (Platform.isFuchsia) {
} else if (io.Platform.isFuchsia) {
return 'harmony';
} else {
return 'unknown';
@@ -1,8 +1,11 @@
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:flutter/foundation.dart';
import '../model/response/kr_site_config.dart';
import '../common/app_config.dart';
import '../utils/kr_log_util.dart';
import 'singbox_imp/kr_sing_box_imp.dart';
/// 网站配置服务
class KRSiteConfigService extends ChangeNotifier {
@@ -13,6 +16,22 @@ class KRSiteConfigService extends ChangeNotifier {
_dio.options.connectTimeout = const Duration(seconds: 10);
_dio.options.sendTimeout = const Duration(seconds: 10);
_dio.options.receiveTimeout = const Duration(seconds: 10);
// 🔧 配置HttpClientAdapter使用sing-box的mixed代理
_dio.httpClientAdapter = IOHttpClientAdapter(
createHttpClient: () {
final client = HttpClient();
client.findProxy = (url) {
final proxyConfig = KRSingBoxImp.instance.kr_buildProxyRule();
KRLogUtil.kr_i(
'🔍 KRSiteConfigService 请求使用代理: $proxyConfig, url: $url',
tag: 'KRSiteConfigService',
);
return proxyConfig;
};
return client;
},
);
}
KRSiteConfig? _siteConfig;
@@ -97,6 +97,36 @@ class KRSingBoxImp {
/// Stream 订阅管理器
final List<StreamSubscription<dynamic>> _kr_subscriptions = [];
/// 当前混合代理端口是否就绪
bool get kr_isProxyReady => kr_status.value is SingboxStarted;
String? _lastProxyRule;
/// 构建 Dart HttpClient 可识别的代理规则字符串
///
/// 当 sing-box 尚未启动时返回 `DIRECT`,启动后返回
/// `PROXY 127.0.0.1:<port>; DIRECT`,以便在代理不可用时自动回落。
String kr_buildProxyRule({bool includeDirectFallback = true}) {
if (!kr_isProxyReady) {
const directRule = 'DIRECT';
if (_lastProxyRule != directRule) {
KRLogUtil.kr_i('⏳ sing-box 未就绪,使用 DIRECT 直连', tag: 'SingBox');
_lastProxyRule = directRule;
}
return directRule;
}
final proxyRule = StringBuffer('PROXY 127.0.0.1:$kr_port');
if (includeDirectFallback) {
proxyRule.write('; DIRECT');
}
final ruleString = proxyRule.toString();
if (_lastProxyRule != ruleString) {
KRLogUtil.kr_i('🛠️ 使用代理规则: $ruleString', tag: 'SingBox');
_lastProxyRule = ruleString;
}
return ruleString;
}
/// 初始化
Future<void> init() async {
try {
@@ -426,8 +456,10 @@ class KRSingBoxImp {
kr_outbounds = outbounds;
final map = {};
map["outbounds"] = kr_outbounds;
// 只保存 outboundsMobile.buildConfig() 会添加其他配置
final map = {
"outbounds": kr_outbounds
};
final file = _file(kr_configName);
final temp = _tempFile(kr_configName);
+15 -3
View File
@@ -14,10 +14,9 @@ import 'package:kaer_with_panels/app/localization/kr_language_utils.dart';
import 'package:kaer_with_panels/app/routes/app_pages.dart';
import 'package:kaer_with_panels/app/utils/kr_window_manager.dart';
import 'app/utils/kr_secure_storage.dart';
import 'app/services/singbox_imp/kr_sing_box_imp.dart';
import 'app/common/app_config.dart';
import 'app/services/kr_site_config_service.dart';
import 'app/utils/kr_secure_storage.dart';
// 全局导航键
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@@ -25,6 +24,9 @@ final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 为所有 HttpClient 请求统一注入代理策略
HttpOverrides.global = KRProxyHttpOverrides();
// 初始化 Hive
await KRSecureStorage().kr_initHive();
@@ -131,3 +133,13 @@ Widget _myApp(GetxTranslations translations, Locale initialLocale) {
// defaultTransition: Transition.fade,
);
}
/// 全局 HttpOverrides,确保所有 dart:io 网络请求遵循 sing-box 代理策略
class KRProxyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
final client = super.createHttpClient(context);
client.findProxy = (uri) => KRSingBoxImp.instance.kr_buildProxyRule();
return client;
}
}