mobile v1.0.3:登录卡死定位增强(B-58)

- SDK 初始化与登录拆成两步分别超时,提示语区分卡在哪一步
- 登录失败时读取并展示 OpenIM SDK 日志文件结尾(去 ANSI 颜色码),用户拍照即可回传诊断信息
- 模拟器实测(Android 15 x86_64):initSDK+login 对 192.168.200.11 全流程正常,排除服务端与代码逻辑问题
- libgojni arm64 已验证 16KB 页对齐,排除新机型兼容性问题
This commit is contained in:
KIMI
2026-08-15 15:42:31 +08:00
parent e2cc59d8c1
commit a5b3a0e35f
3 changed files with 53 additions and 3 deletions
+36
View File
@@ -39,6 +39,41 @@ class IMService extends ChangeNotifier {
/// 最近一次连接失败的原始错误(诊断展示用)
String? lastConnectError;
/// SDK 数据/日志目录(_doInit 时记录)
String? _dataDir;
/// 读 SDK 日志文件的结尾部分(定位「SDK 卡在哪」用)。读不到返回空串。
Future<String> sdkLogTail() async {
try {
final dataDir = _dataDir ?? '${(await getApplicationDocumentsDirectory()).path}/openim';
final dir = Directory(dataDir);
if (!dir.existsSync()) return '';
final files = dir
.listSync(recursive: true)
.whereType<File>()
.where((f) => f.path.endsWith('.log'))
.toList()
..sort((a, b) => b.lastModifiedSync().compareTo(a.lastModifiedSync()));
if (files.isEmpty) return '';
final file = files.first;
final len = file.lengthSync();
final start = len > 2048 ? len - 2048 : 0;
final raf = file.openSync();
try {
raf.setPositionSync(start);
final bytes = raf.readSync(len - start);
// 去掉日志里的 ANSI 颜色码,免得截图里出现乱码
return String.fromCharCodes(bytes)
.replaceAll(RegExp(r'\x1B\[[0-9;]*m'), '')
.trim();
} finally {
raf.closeSync();
}
} catch (_) {
return '';
}
}
/// 是否已登录
bool loggedIn = false;
@@ -98,6 +133,7 @@ class IMService extends ChangeNotifier {
Future<void> _doInit() async {
final dir = await getApplicationDocumentsDirectory();
final dataDir = '${dir.path}/openim';
_dataDir = dataDir;
await Directory(dataDir).create(recursive: true);
final ok = await OpenIM.iMManager.initSDK(
platformID: platformID,