优化部分安卓机型可能存在连接超时等问题新增日志排查

(cherry picked from commit e0fcc27f28f27321a49115df86507e3ac55e8ef8)
This commit is contained in:
2025-11-02 01:32:51 -08:00
committed by speakeloudest
parent b8d0417d0f
commit dee7f0a591
11 changed files with 416 additions and 43 deletions
+19 -15
View File
@@ -2,16 +2,20 @@ import 'package:flutter/foundation.dart';
import 'package:loggy/loggy.dart';
/// 日志工具类
/// 🔒 Release模式下所有日志都不会输出,确保生产环境的性能和安全
/// 🔧 Android 15 诊断模式:临时允许 Release 模式下输出关键日志用于问题诊断
class KRLogUtil {
static final KRLogUtil _instance = KRLogUtil._internal();
factory KRLogUtil() => _instance;
KRLogUtil._internal();
/// 🔧 临时启用 Release 日志用于 Android 15 问题诊断
/// ⚠️ 生产环境修复后应该改回 false
static const bool _forceEnableReleaseLogging = true;
/// 初始化日志
static void kr_init() {
// 只在 Debug 模式初始化日志
if (kDebugMode) {
// Debug 模式或强制启用时初始化日志
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy.initLoggy(
logPrinter: PrettyPrinter(),
);
@@ -19,49 +23,49 @@ class KRLogUtil {
}
/// 调试日志
/// 🔒 只在 Debug 模式输出
/// 🔧 Debug 模式或强制启用时输出
static void kr_d(String message, {String? tag}) {
if (kDebugMode) {
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy('${tag ?? 'KRLogUtil'}').debug(message);
}
}
/// 信息日志
/// 🔒 只在 Debug 模式输出
/// 🔧 Debug 模式或强制启用时输出
static void kr_i(String message, {String? tag}) {
if (kDebugMode) {
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy('${tag ?? 'KRLogUtil'}').info(message);
}
}
/// 警告日志
/// 🔒 只在 Debug 模式输出
/// 🔧 Debug 模式或强制启用时输出
static void kr_w(String message, {String? tag}) {
if (kDebugMode) {
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy('${tag ?? 'KRLogUtil'}').warning(message);
}
}
/// 错误日志
/// 🔒 只在 Debug 模式输出
/// 🔧 Debug 模式或强制启用时输出
static void kr_e(String message, {String? tag, Object? error, StackTrace? stackTrace}) {
if (kDebugMode) {
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy('${tag ?? 'KRLogUtil'}').error(message, error, stackTrace);
}
}
/// 网络日志
/// 🔒 只在 Debug 模式输出
/// 🔧 Debug 模式或强制启用时输出
static void kr_network(String message, {String? tag}) {
if (kDebugMode) {
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy('${tag ?? 'Network'}').info(message);
}
}
/// 性能日志
/// 🔒 只在 Debug 模式输出
/// 🔧 Debug 模式或强制启用时输出
static void kr_performance(String message, {String? tag}) {
if (kDebugMode) {
if (kDebugMode || _forceEnableReleaseLogging) {
Loggy('${tag ?? 'Performance'}').info(message);
}
}
+103 -1
View File
@@ -4,6 +4,8 @@ import 'package:kaer_with_panels/app/widgets/dialogs/kr_dialog.dart';
import 'package:kaer_with_panels/app/routes/app_pages.dart';
import 'package:kaer_with_panels/app/utils/kr_log_util.dart';
import 'package:kaer_with_panels/app/localization/app_translations.dart';
import 'dart:io';
import 'package:path_provider/path_provider.dart';
/// 订阅导航工具类
/// 用于统一处理订阅相关的导航逻辑
@@ -14,17 +16,62 @@ class KRSubscribeNavigationUtil {
///
/// [tag] 调用来源标签,用于日志记录
static void navigateToPurchase({String tag = 'Subscribe'}) {
print('🔔 [NavigationUtil] ========== navigateToPurchase 被调用 ==========');
print('🔔 [NavigationUtil] Tag: $tag');
print('🔔 [NavigationUtil] 当前时间: ${DateTime.now()}');
// 🔧 先获取关键信息并打印
final appRunData = KRAppRunData.getInstance();
final isDeviceLogin = appRunData.isDeviceLogin();
final account = appRunData.kr_account.value;
print('🔔 [NavigationUtil] 账号: $account');
print('🔔 [NavigationUtil] 是否设备登录: $isDeviceLogin');
KRLogUtil.kr_i('=== 订阅按钮点击 ===', tag: tag);
KRLogUtil.kr_i('账号: $account', tag: tag);
KRLogUtil.kr_i('是否设备登录: $isDeviceLogin', tag: tag);
// 🔧 文件写入改为非阻塞,放在后面
Future(() async {
try {
final dir = await getApplicationDocumentsDirectory();
final debugFile = File('${dir.path}/NAVIGATION_DEBUG.txt');
await debugFile.writeAsString(
'=' * 60 + '\n'
'🔔 navigateToPurchase 被调用!\n'
'时间: ${DateTime.now()}\n'
'来源: $tag\n'
'账号: $account\n'
'是否设备登录: $isDeviceLogin\n'
'版本标识: Android15_Fix_v5\n'
'=' * 60 + '\n',
mode: FileMode.append,
);
} catch (e) {
print('🔔 [NavigationUtil] ❌ 写入导航日志失败: $e');
}
});
if (isDeviceLogin) {
// 设备登录用户需要绑定账号
print('🔔 [NavigationUtil] ⚠️ 检测到设备登录,将显示绑定提示对话框');
KRLogUtil.kr_i('检测到设备登录,显示绑定提示', tag: tag);
// 🔧 记录显示对话框
Future(() async {
try {
final dir = await getApplicationDocumentsDirectory();
final debugFile = File('${dir.path}/NAVIGATION_DEBUG.txt');
await debugFile.writeAsString(
'⚠️ 用户是设备登录,显示绑定提示对话框\n'
'时间: ${DateTime.now()}\n'
'-' * 60 + '\n',
mode: FileMode.append,
);
} catch (e) { /* 忽略 */ }
});
KRDialog.show(
title: AppTranslations.kr_dialog.deviceLoginBindingTitle,
message: AppTranslations.kr_dialog.deviceLoginBindingMessage,
@@ -41,13 +88,68 @@ class KRSubscribeNavigationUtil {
);
} else {
// 正常流程 - 跳转到购买页面
print('🔔 [NavigationUtil] ✅ 普通用户,准备跳转到购买页面');
KRLogUtil.kr_i('普通用户,跳转到购买页面', tag: tag);
// 🔧 立即记录准备跳转
Future(() async {
try {
final dir = await getApplicationDocumentsDirectory();
final debugFile = File('${dir.path}/NAVIGATION_DEBUG.txt');
await debugFile.writeAsString(
'✅ 普通用户,准备调用 Get.toNamed\n'
'路由: ${Routes.KR_PURCHASE_MEMBERSHIP}\n'
'时间: ${DateTime.now()}\n'
'-' * 60 + '\n',
mode: FileMode.append,
);
} catch (e) { /* 忽略 */ }
});
try {
// 🔧 添加加载保护,避免页面跳转时卡死
Get.toNamed(Routes.KR_PURCHASE_MEMBERSHIP);
print('🔔 [NavigationUtil] 📍 步骤1: 正在调用 Get.toNamed(${Routes.KR_PURCHASE_MEMBERSHIP})...');
final result = Get.toNamed(Routes.KR_PURCHASE_MEMBERSHIP);
print('🔔 [NavigationUtil] 📍 步骤2: Get.toNamed 调用完成,返回值: $result');
// 🔧 文件写入改为非阻塞
Future(() async {
try {
final dir = await getApplicationDocumentsDirectory();
final debugFile = File('${dir.path}/NAVIGATION_DEBUG.txt');
await debugFile.writeAsString(
'✅ Get.toNamed 执行完成\n'
'路由: ${Routes.KR_PURCHASE_MEMBERSHIP}\n'
'返回值: $result\n'
'时间: ${DateTime.now()}\n'
'-' * 60 + '\n',
mode: FileMode.append,
);
} catch (e) {
print('🔔 [NavigationUtil] ❌ 写入跳转完成日志失败: $e');
}
});
} catch (e) {
KRLogUtil.kr_e('跳转购买页面失败: $e', tag: tag);
print('🔔 [NavigationUtil] ❌❌❌ 跳转异常: $e');
// 🔧 文件写入改为非阻塞
Future(() async {
try {
final dir = await getApplicationDocumentsDirectory();
final debugFile = File('${dir.path}/NAVIGATION_DEBUG.txt');
await debugFile.writeAsString(
'❌ Get.toNamed 执行失败\n'
'异常: $e\n'
'时间: ${DateTime.now()}\n'
'-' * 60 + '\n',
mode: FileMode.append,
);
} catch (e) {
print('🔔 [NavigationUtil] ❌ 写入跳转失败日志失败: $e');
}
});
// 如果跳转失败,显示错误提示
KRDialog.show(
title: AppTranslations.kr_dialog.error,