fix: 消除所有会导致STF断开连接的操作 - adb_connect移除kill-server硬重置(会断全网设备) - APK安装后不再adb_disconnect(IP:5555会断STF provider) - 扫描空闲设备不再adb connect/disconnect(直接标记空闲)
This commit is contained in:
+5
-12
@@ -74,20 +74,13 @@ def adb_connect(remote_adb_url, retries=5):
|
|||||||
|
|
||||||
首次常因认证握手未就绪报 failed to authenticate,第2次重试通常 already connected。
|
首次常因认证握手未就绪报 failed to authenticate,第2次重试通常 already connected。
|
||||||
STF remoteConnect 启用后端口监听可能需要几秒,所以重试间隔递增。
|
STF remoteConnect 启用后端口监听可能需要几秒,所以重试间隔递增。
|
||||||
若全部重试失败,做一次 kill-server 硬重置后再试(long-running 进程的 adb daemon
|
|
||||||
可能状态坏掉,必须重置)。硬重置在全局锁内,会短暂影响并发 worker,但只在万不得已时触发。
|
**绝不 kill-server**:kill-server 会断开所有设备的 adb transport,
|
||||||
|
导致 STF provider 对全部设备误判离线并触发重连,影响所有运行中的任务。
|
||||||
|
连接失败就返回 False,由调用方处理(标记任务失败,不影响其他设备)。
|
||||||
"""
|
"""
|
||||||
with _ADB_LOCK:
|
with _ADB_LOCK:
|
||||||
if _try_connect(remote_adb_url, retries):
|
return _try_connect(remote_adb_url, retries)
|
||||||
return True
|
|
||||||
# 全部失败,硬重置 adb server
|
|
||||||
_log.warning(f"{remote_adb_url} 重试耗尽,执行 kill-server 硬重置")
|
|
||||||
_adb("kill-server")
|
|
||||||
time.sleep(2)
|
|
||||||
_adb("start-server")
|
|
||||||
time.sleep(2)
|
|
||||||
return _try_connect(remote_adb_url, 3)
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def _try_connect(remote_adb_url, retries):
|
def _try_connect(remote_adb_url, retries):
|
||||||
|
|||||||
+8
-5
@@ -9,13 +9,15 @@
|
|||||||
|
|
||||||
设备连接策略(直连设备 IP:5555,完全绕过 STF occupy/release):
|
设备连接策略(直连设备 IP:5555,完全绕过 STF occupy/release):
|
||||||
- worker 运行中:跳过(避免打断任务)
|
- worker 运行中:跳过(避免打断任务)
|
||||||
- 其他设备(自己占用/空闲/他人占用):直接 adb connect serial → install → disconnect
|
- 其他设备(自己占用/空闲/他人占用):直接 adb connect serial → install
|
||||||
不经过 STF,不会触发 STF agent 清理,安装的 app 会永久保留
|
不经过 STF,不会触发 STF agent 清理,安装的 app 会永久保留
|
||||||
|
- 安装后**不主动 adb disconnect**:serial 是 IP:5555,STF provider 共享该地址
|
||||||
|
的 adb transport,disconnect 会让 STF 误判设备离线并触发重连。
|
||||||
- serial 格式为 IP:5555(设备本身的 adb 网络地址),STF 返回的 serial 即此格式
|
- serial 格式为 IP:5555(设备本身的 adb 网络地址),STF 返回的 serial 即此格式
|
||||||
|
|
||||||
为什么不用 STF occupy/release:
|
为什么不用 STF occupy/release:
|
||||||
STF release 会触发 agent 清理设备(卸载第三方 app、清除数据、回桌面),
|
STF release 会触发 agent 清理设备(卸载第三方 app、清除数据、回桌面),
|
||||||
导致刚安装的 app 被自动删除。直连设备完全绕过 STF,安装完断开连接即可。
|
导致刚安装的 app 被自动删除。直连设备完全绕过 STF,安装完保持连接即可。
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
@@ -28,7 +30,6 @@ from config import APK_DIR, ADB_PATH
|
|||||||
from core.logger import get_logger
|
from core.logger import get_logger
|
||||||
from core.models import db, ApkFile as ApkRow
|
from core.models import db, ApkFile as ApkRow
|
||||||
from .stf_client import STFClient
|
from .stf_client import STFClient
|
||||||
from .adb_helper import adb_disconnect
|
|
||||||
from .device_worker import get_all_worker_status
|
from .device_worker import get_all_worker_status
|
||||||
|
|
||||||
_log = get_logger("core.apk")
|
_log = get_logger("core.apk")
|
||||||
@@ -349,8 +350,10 @@ class ApkManager:
|
|||||||
self._set_item(serial, "failed", str(e)[:200])
|
self._set_item(serial, "failed", str(e)[:200])
|
||||||
_log.exception(f"[{serial}] 安装异常")
|
_log.exception(f"[{serial}] 安装异常")
|
||||||
finally:
|
finally:
|
||||||
# 断开 adb 连接(不影响设备,app 永久保留)
|
# 不主动 adb disconnect:serial 是 IP:5555,STF provider 共享该地址的
|
||||||
adb_disconnect(serial)
|
# adb transport,disconnect 会让 STF 误判设备离线并触发重连。
|
||||||
|
# adb 连接保持即可,不影响设备和后续操作。
|
||||||
|
pass
|
||||||
|
|
||||||
def _set_item(self, serial, status, msg=""):
|
def _set_item(self, serial, status, msg=""):
|
||||||
"""更新安装任务中某设备的状态。"""
|
"""更新安装任务中某设备的状态。"""
|
||||||
|
|||||||
+8
-12
@@ -279,20 +279,16 @@ class _ForegroundScanner:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
def _scan_free(self, serial):
|
def _scan_free(self, serial):
|
||||||
"""空闲设备:轻量 adb connect serial 查询(单次尝试,不 kill-server)。
|
"""空闲设备:不扫描前台 App,直接返回"空闲"。
|
||||||
|
|
||||||
serial 通常为 IP:5555,若设备 5555 端口未开放则快速失败。
|
原因:STF provider 内部通过 IP:5555 维持 adb 连接监控设备。
|
||||||
绝不重试、绝不 kill-server,避免影响正在运行的 worker。
|
外部 adb connect/disconnect IP:5555 会让 adb server 断开该地址的
|
||||||
|
transport,连带 STF provider 的连接一起断,STF 误判设备 offline
|
||||||
|
并触发重连——表现就是"一扫描前台 App 设备就离线、需要重连"。
|
||||||
|
因此空闲设备绝不主动 adb connect/disconnect,只对运行中设备
|
||||||
|
(走 STF 隧道端口,不动 5555)和自占设备(remoteConnect 隧道)扫描。
|
||||||
"""
|
"""
|
||||||
try:
|
return "空闲"
|
||||||
if not adb_connect_light(serial):
|
|
||||||
return "(不可达)"
|
|
||||||
try:
|
|
||||||
return get_foreground_app(serial)
|
|
||||||
finally:
|
|
||||||
adb_disconnect(serial)
|
|
||||||
except Exception:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
# ================== 任务管理器 ==================
|
# ================== 任务管理器 ==================
|
||||||
|
|||||||
Reference in New Issue
Block a user