Skip to content

【Flutter Android】【tencent_cloud_chat_sdk 8.9.7540+2 ~ 9.1.7818】unInitSDK 先注销 Dart_Port 再 DartUnitSDK,换 sdkAppId 后 isolate 卡死 #1470

Description

@Wxm510846302
  • 【集成包】: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 监听列表。

复现

  1. initSDK(sdkAppIdA) + login
  2. Android 真机保持进程(可同时起 ExoPlayer)
  3. logout → unInitSDK → initSDK(sdkAppIdB) + login
  4. logcat 出现 no Dart_Port,initSDK 不再返回

已在 8.9.7540+2 本地 fork 验证:Android 保留端口后可完成切换,isolate 不再卡死。请合入正式版。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions