feat: 提交国家分组功能和debug功能
This commit is contained in:
@@ -1025,10 +1025,25 @@ class KRSingBoxImp {
|
||||
KRLogUtil.kr_i('💾 开始保存配置文件...', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('📊 出站节点数量: ${outbounds.length}', tag: 'SingBox');
|
||||
|
||||
// 分离真实节点和自动选择节点
|
||||
final realNodes = <Map<String, dynamic>>[];
|
||||
final autoNodes = <Map<String, dynamic>>[];
|
||||
|
||||
for (final outbound in outbounds) {
|
||||
if (outbound['tag']?.toString().endsWith('-auto') == true) {
|
||||
autoNodes.add(outbound);
|
||||
} else {
|
||||
realNodes.add(outbound);
|
||||
}
|
||||
}
|
||||
|
||||
KRLogUtil.kr_i('📊 真实节点数量: ${realNodes.length}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('📊 自动选择节点数量: ${autoNodes.length}', tag: 'SingBox');
|
||||
|
||||
// 打印每个节点的详细配置
|
||||
for (int i = 0; i < outbounds.length; i++) {
|
||||
final outbound = outbounds[i];
|
||||
KRLogUtil.kr_i('📋 节点[$i] 配置:', tag: 'SingBox');
|
||||
for (int i = 0; i < realNodes.length; i++) {
|
||||
final outbound = realNodes[i];
|
||||
KRLogUtil.kr_i('📋 真实节点[$i] 配置:', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - type: ${outbound['type']}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - tag: ${outbound['tag']}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - server: ${outbound['server']}', tag: 'SingBox');
|
||||
@@ -1042,11 +1057,20 @@ class KRSingBoxImp {
|
||||
if (outbound['uuid'] != null) {
|
||||
KRLogUtil.kr_i(' - uuid: ${outbound['uuid']?.toString().substring(0, 8)}...', tag: 'SingBox');
|
||||
}
|
||||
KRLogUtil.kr_i(' - 完整配置: ${jsonEncode(outbound)}', tag: 'SingBox');
|
||||
}
|
||||
|
||||
for (int i = 0; i < autoNodes.length; i++) {
|
||||
final outbound = autoNodes[i];
|
||||
KRLogUtil.kr_i('🤖 自动选择节点[$i] 配置:', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - type: ${outbound['type']}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i(' - tag: ${outbound['tag']}', tag: 'SingBox');
|
||||
if (outbound['outbounds'] != null) {
|
||||
KRLogUtil.kr_i(' - outbounds: ${outbound['outbounds']}', tag: 'SingBox');
|
||||
}
|
||||
}
|
||||
|
||||
// ⚠️ 临时过滤 Hysteria2 节点以避免 libcore 崩溃
|
||||
kr_outbounds = outbounds.where((outbound) {
|
||||
final filteredRealNodes = realNodes.where((outbound) {
|
||||
final type = outbound['type'];
|
||||
if (type == 'hysteria2' || type == 'hysteria') {
|
||||
KRLogUtil.kr_w('⚠️ 跳过 Hysteria2 节点: ${outbound['tag']} (libcore bug)', tag: 'SingBox');
|
||||
@@ -1055,11 +1079,30 @@ class KRSingBoxImp {
|
||||
return true;
|
||||
}).toList();
|
||||
|
||||
KRLogUtil.kr_i('✅ 过滤后节点数量: ${kr_outbounds.length}/${outbounds.length}', tag: 'SingBox');
|
||||
// 过滤自动选择节点中的 Hysteria2
|
||||
final filteredAutoNodes = autoNodes.where((outbound) {
|
||||
if (outbound['outbounds'] != null) {
|
||||
final outbounds = outbound['outbounds'] as List<dynamic>;
|
||||
// 检查是否包含 Hysteria2 节点
|
||||
final hasHysteria2 = outbounds.any((tag) => tag.toString().toLowerCase().contains('hysteria'));
|
||||
if (hasHysteria2) {
|
||||
KRLogUtil.kr_w('⚠️ 跳过包含 Hysteria2 的自动选择节点: ${outbound['tag']} (libcore bug)', tag: 'SingBox');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}).toList();
|
||||
|
||||
KRLogUtil.kr_i('✅ 过滤后真实节点数量: ${filteredRealNodes.length}/${realNodes.length}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('✅ 过滤后自动选择节点数量: ${filteredAutoNodes.length}/${autoNodes.length}', tag: 'SingBox');
|
||||
|
||||
// 构建所有可用标签列表(selector 包含真实和自动节点)
|
||||
final allAvailableTags = <String>[];
|
||||
allAvailableTags.addAll(filteredAutoNodes.map((o) => o['tag'] as String));
|
||||
allAvailableTags.addAll(filteredRealNodes.map((o) => o['tag'] as String));
|
||||
|
||||
// 🔧 修复:生成完整的 SingBox 配置
|
||||
// 之前只保存 {"outbounds": [...]}, 导致 libcore 无法正确处理
|
||||
// 现在保存完整配置,包含所有必需字段
|
||||
// 现在保存完整配置,包含所有必需字段,并且 outbounds 顺序为:selector→自动组→真实节点→direct/block/dns-out
|
||||
final Map<String, dynamic> fullConfig = {
|
||||
"log": {
|
||||
"level": "debug",
|
||||
@@ -1096,14 +1139,17 @@ class KRSingBoxImp {
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
// 🔧 修复:添加 selector 组,让用户可以手动选择节点
|
||||
// 🔧 修复:添加 selector 组,包含真实和自动节点标签
|
||||
{
|
||||
"type": "selector",
|
||||
"tag": "proxy",
|
||||
"outbounds": kr_outbounds.map((o) => o['tag'] as String).toList(),
|
||||
"default": kr_outbounds.isNotEmpty ? kr_outbounds[0]['tag'] : "direct",
|
||||
"outbounds": allAvailableTags,
|
||||
"default": allAvailableTags.isNotEmpty ? allAvailableTags[0] : "direct",
|
||||
},
|
||||
...kr_outbounds,
|
||||
// 🔧 修复:自动选择组排在真实节点前面
|
||||
...filteredAutoNodes,
|
||||
// 🔧 修复:真实节点排在后面
|
||||
...filteredRealNodes,
|
||||
{
|
||||
"type": "direct",
|
||||
"tag": "direct"
|
||||
@@ -1135,7 +1181,8 @@ class KRSingBoxImp {
|
||||
final mapStr = jsonEncode(fullConfig);
|
||||
|
||||
KRLogUtil.kr_i('📄 完整配置文件长度: ${mapStr.length}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('📄 Outbounds 数量: ${kr_outbounds.length}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('📄 Outbounds 总数: ${filteredAutoNodes.length + filteredRealNodes.length}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('📄 Selector 可用标签数: ${allAvailableTags.length}', tag: 'SingBox');
|
||||
KRLogUtil.kr_i('📄 配置前800字符:\n${mapStr.substring(0, mapStr.length > 800 ? 800 : mapStr.length)}', tag: 'SingBox');
|
||||
|
||||
await file.writeAsString(mapStr);
|
||||
|
||||
Reference in New Issue
Block a user