- 【集成包】:IMSDK / pub.dev
tencent_cloud_chat_sdk(无 UIKit)
- 【平台】:Flutter Android(FFI)
- 【SDK 版本】:8.9.7540+2 发现;8.9.7540+3 / 9.0.7652+1 / 9.1.7818(最新)Dart 侧时序均未修复
- 【机型】:Redmi Note 8 Pro 真机(其它 Android 也可复现,播放器纹理存活时更明显)
- 【之前版本有无此问题】:FFI 插件
unInitSDK 内调用 unregisterPort() 起就存在。8.9.7540+3 changelog 写 “re-init after uninit no response”,实际只给 callExperimentalAPI 加了超时,unInitSDK 仍是先 unregisterPort() 再 DartUnitSDK()
- 【当前现象】:同一进程切换两个 sdkAppId(logout → unInitSDK → initSDK → login)。unInit 后立刻
im ffi: Serious error, no Dart_Port registered,随后同步 FFI DartInitSDK 卡住 isolate,Timer/timeout 失效,UI 卡死;ExoPlayer 同时出帧时有声无画
- 【日志】:
unInitSDK 完成
im ffi: Serious error, no Dart_Port registered
initSDK 调用后无返回(同步 FFI 阻塞 isolate)
根因
lib/native_im/adapter/tim_manager.dart unInitSDK() 先 NativeLibraryManager.unregisterPort(),再 DartUnitSDK()。ReceivePort 是 isolate 级 static final。Android 原生销毁仍会往 Dart 打日志/网络回调。端口没了之后 FFI 报 no Dart_Port,DartInitSDK 把 UI isolate 打挂。官方 initSDK 已 init 时直接 return true 且不换 sdkAppId,所以必须 unInit。业务层 removeListener / 空监听绕不过 DartUnregisterSendPort。
建议修复
Android 换 sdkAppId 时不要 unregisterPort(registerPort 幂等,端口属于 isolate)。或先 DartUnitSDK 完成再决定是否注销。另外 removeSDKListener() 无参时应 clear 监听列表。
复现
- initSDK(sdkAppIdA) + login
- Android 真机保持进程(可同时起 ExoPlayer)
- logout → unInitSDK → initSDK(sdkAppIdB) + login
- logcat 出现 no Dart_Port,initSDK 不再返回
已在 8.9.7540+2 本地 fork 验证:Android 保留端口后可完成切换,isolate 不再卡死。请合入正式版。
tencent_cloud_chat_sdk(无 UIKit)unInitSDK内调用unregisterPort()起就存在。8.9.7540+3 changelog 写 “re-init after uninit no response”,实际只给callExperimentalAPI加了超时,unInitSDK仍是先unregisterPort()再DartUnitSDK()im ffi: Serious error, no Dart_Port registered,随后同步 FFIDartInitSDK卡住 isolate,Timer/timeout 失效,UI 卡死;ExoPlayer 同时出帧时有声无画根因
lib/native_im/adapter/tim_manager.dartunInitSDK()先NativeLibraryManager.unregisterPort(),再DartUnitSDK()。ReceivePort 是 isolate 级 static final。Android 原生销毁仍会往 Dart 打日志/网络回调。端口没了之后 FFI 报 no Dart_Port,DartInitSDK把 UI isolate 打挂。官方initSDK已 init 时直接 return true 且不换 sdkAppId,所以必须 unInit。业务层 removeListener / 空监听绕不过DartUnregisterSendPort。建议修复
Android 换 sdkAppId 时不要 unregisterPort(registerPort 幂等,端口属于 isolate)。或先 DartUnitSDK 完成再决定是否注销。另外
removeSDKListener()无参时应 clear 监听列表。复现
已在 8.9.7540+2 本地 fork 验证:Android 保留端口后可完成切换,isolate 不再卡死。请合入正式版。