新增编译模式下对日志进行输出,并且更新了hive缓存取出后进行连通性判断
Build Android APK / 编译 libcore.aar (push) Has been cancelled
Build Android APK / 编译 Android APK (release) (push) Has been cancelled
Build Android APK / 创建 GitHub Release (push) Has been cancelled
Build Multi-Platform / 编译 libcore (iOS/tvOS) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Android) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Windows) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (macOS) (push) Has been cancelled
Build Multi-Platform / 编译 libcore (Linux) (push) Has been cancelled
Build Multi-Platform / 构建 Android APK (push) Has been cancelled
Build Multi-Platform / 构建 Windows (push) Has been cancelled
Build Multi-Platform / 构建 macOS (push) Has been cancelled
Build Multi-Platform / 构建 Linux (push) Has been cancelled
Build Multi-Platform / 构建 iOS (push) Has been cancelled
Build Multi-Platform / 创建 Release (push) Has been cancelled
Build Windows / 编译 libcore (Windows) (push) Has been cancelled
Build Windows / build (push) Has been cancelled

(cherry picked from commit 40f95d0c463c31428c5f25118f59b0c3a60e73ba)
This commit is contained in:
2025-11-01 08:51:11 -07:00
committed by speakeloudest
parent 4c5763647d
commit 2b80fcba0d
6 changed files with 466 additions and 119 deletions
+138 -5
View File
@@ -1081,21 +1081,141 @@ class KRDomain {
);
}
/// 从本地加载域名
/// 从本地加载域名(方案1:加载后验证可用性)
static Future<void> kr_loadBaseDomain() async {
KRLogUtil.kr_i('📂 开始从 Hive 加载域名配置', tag: 'KRDomain');
final startTime = DateTime.now();
try {
// 🔧 Android 15 关键修复:添加总体超时保护(15秒)
await Future.any([
_executeLoadAndVerify(),
Future.delayed(const Duration(seconds: 15), () {
throw TimeoutException('域名加载和验证总超时(15秒)');
}),
]);
} on TimeoutException catch (e) {
final duration = DateTime.now().difference(startTime).inSeconds;
KRLogUtil.kr_e('⏱️ 域名加载验证超时($duration 秒): $e', tag: 'KRDomain');
// 超时时使用默认域名
if (kr_baseDomains.isNotEmpty) {
kr_currentDomain = kr_baseDomains[0];
KRLogUtil.kr_w('⚠️ 超时后使用默认域名: $kr_currentDomain', tag: 'KRDomain');
}
} catch (e) {
final duration = DateTime.now().difference(startTime).inSeconds;
KRLogUtil.kr_e('❌ 域名加载异常($duration 秒): $e', tag: 'KRDomain');
// 异常时使用默认域名
if (kr_baseDomains.isNotEmpty) {
kr_currentDomain = kr_baseDomains[0];
}
}
final totalDuration = DateTime.now().difference(startTime).inMilliseconds;
KRLogUtil.kr_i('✅ 域名加载完成,耗时: ${totalDuration}ms,当前域名: $kr_currentDomain', tag: 'KRDomain');
}
/// 执行域名加载和验证
static Future<void> _executeLoadAndVerify() async {
// 加载域名列表
String? savedDomains = await _storage.kr_readData(key: kr_domainsKey);
if (savedDomains != null) {
kr_baseDomains = savedDomains.split(',');
if (savedDomains != null && savedDomains.isNotEmpty) {
kr_baseDomains = savedDomains.split(',').where((d) => d.isNotEmpty).toList();
KRLogUtil.kr_i('📋 从 Hive 加载的域名列表: $kr_baseDomains', tag: 'KRDomain');
} else {
KRLogUtil.kr_w('⚠️ Hive 中没有保存的域名列表,使用默认配置', tag: 'KRDomain');
}
// 加载当前域名
String? savedDomain = await _storage.kr_readData(key: kr_domainKey);
if (savedDomain != null && kr_baseDomains.contains(savedDomain)) {
kr_currentDomain = savedDomain;
KRLogUtil.kr_i('📌 从 Hive 加载的当前域名: $savedDomain', tag: 'KRDomain');
if (savedDomain != null && savedDomain.isNotEmpty && kr_baseDomains.contains(savedDomain)) {
// 🔧 Android 15 关键修复:验证 Hive 缓存的域名是否仍然可用
KRLogUtil.kr_i('🔍 验证 Hive 缓存域名的可用性: $savedDomain', tag: 'KRDomain');
try {
// 快速验证(3 秒超时)
bool isAvailable = await kr_fastCheckDomainAvailability(savedDomain).timeout(
const Duration(seconds: 3),
onTimeout: () {
KRLogUtil.kr_w('⏱️ 域名验证超时(3秒),视为不可用', tag: 'KRDomain');
return false;
},
);
if (isAvailable) {
kr_currentDomain = savedDomain;
KRLogUtil.kr_i('✅ Hive 缓存域名验证通过,继续使用: $kr_currentDomain', tag: 'KRDomain');
return;
} else {
KRLogUtil.kr_w('❌ Hive 缓存域名不可用: $savedDomain,需要切换', tag: 'KRDomain');
}
} catch (e) {
KRLogUtil.kr_e('❌ 域名验证异常: $e,需要切换', tag: 'KRDomain');
}
} else {
if (savedDomain == null || savedDomain.isEmpty) {
KRLogUtil.kr_w('⚠️ Hive 中没有保存的当前域名', tag: 'KRDomain');
} else {
KRLogUtil.kr_w('⚠️ Hive 缓存的域名 $savedDomain 不在域名列表中', tag: 'KRDomain');
}
}
// 🔧 Android 15 增强:Hive 域名验证失败,自动选择可用域名
KRLogUtil.kr_i('🔄 Hive 域名不可用,开始选择可用域名...', tag: 'KRDomain');
// 尝试从域名列表中找到可用的域名(每个最多 3 秒)
for (String domain in kr_baseDomains) {
try {
KRLogUtil.kr_i('🧪 测试域名: $domain', tag: 'KRDomain');
bool isAvailable = await kr_fastCheckDomainAvailability(domain).timeout(
const Duration(seconds: 3),
onTimeout: () {
KRLogUtil.kr_w('⏱️ 域名 $domain 验证超时(3秒)', tag: 'KRDomain');
return false;
},
);
if (isAvailable) {
kr_currentDomain = domain;
await kr_saveCurrentDomain();
KRLogUtil.kr_i('✅ 找到可用域名: $kr_currentDomain,已保存到 Hive', tag: 'KRDomain');
return;
}
} catch (e) {
KRLogUtil.kr_w('⚠️ 域名 $domain 验证异常: $e', tag: 'KRDomain');
}
}
// 如果所有主域名都不可用,快速尝试备用域名(5秒总超时)
KRLogUtil.kr_w('⚠️ 所有主域名都不可用,尝试备用域名...', tag: 'KRDomain');
try {
String? backupDomain = await kr_tryLocalBackupDomains().timeout(
const Duration(seconds: 5),
onTimeout: () {
KRLogUtil.kr_w('⏱️ 备用域名获取超时', tag: 'KRDomain');
return null;
},
);
if (backupDomain != null) {
kr_currentDomain = backupDomain;
await kr_saveCurrentDomain();
KRLogUtil.kr_i('✅ 使用备用域名: $kr_currentDomain', tag: 'KRDomain');
return;
}
} catch (e) {
KRLogUtil.kr_w('⚠️ 备用域名获取异常: $e', tag: 'KRDomain');
}
// 最后的兜底:使用列表中的第一个域名(即使不可用)
if (kr_baseDomains.isNotEmpty) {
kr_currentDomain = kr_baseDomains[0];
await kr_saveCurrentDomain();
KRLogUtil.kr_w('⚠️ 无法验证任何域名,使用默认域名: $kr_currentDomain', tag: 'KRDomain');
} else {
KRLogUtil.kr_e('❌ 没有可用的域名配置!', tag: 'KRDomain');
}
}
@@ -1123,6 +1243,19 @@ class KRDomain {
}
class AppConfig {
/// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/// 初始化日志收集开关
/// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/// 🔧 全局开关:是否启用初始化日志收集
/// true:将所有初始化日志写入文件,方便问题诊断
/// false:关闭日志收集,减少 I/O 操作
///
/// 建议:
/// - 测试版本、Beta 版本:设置为 true
/// - 正式生产版本:根据需要设置为 false(或在遇到问题时临时开启)
static const bool enableInitLogCollection = true;
/// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
/// 加密密钥配置
/// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━