阶段1: 调度/生命周期切换 device_pool——task_manager 设备解析与状态查询、STFDevice 去 occupy/release、web_server 端点换数据源(USB 桥接保留到阶段 2)

This commit is contained in:
2026-08-17 11:16:13 +08:00
parent 52c4d3aab4
commit 5354fe6379
5 changed files with 117 additions and 200 deletions
+33 -31
View File
@@ -647,7 +647,7 @@ def api_device_screen_all():
data = request.json or {}
mode = data.get("mode", "on")
try:
serials = [d["serial"] for d in stf.list_all_devices() if d.get("present")]
serials = device_pool.list_online()
except Exception as e:
return jsonify({"ok": False, "error": f"获取设备列表失败: {e}"}), 502
if not serials:
@@ -741,7 +741,12 @@ def api_stop_all():
@app.route("/api/release", methods=["POST"])
@perm_required(PERM_DEVICES)
def api_release():
released, failed = stf.release_all_mine()
# 阶段 1:调度已不占 STF,此处仅清理迁移期遗留的 STF 占用记录
# (阶段 3 摘除 STF 后此接口改为清理本实例 _running/worker 状态)
try:
released, failed = stf.release_all_mine()
except Exception:
released, failed = [], []
return jsonify({"ok": True, "released": released, "failed": failed})
@@ -916,32 +921,30 @@ def api_steps_test():
def api_uiauto_devices():
"""获取可选设备列表(抓取元素用)。
uiautodev 只认识本地 adb 已连接的设备;平台设备池(STF)里在线但未
本地连接的设备(如 100.100.10.10)在这里补全,并先做一次轻量 adb
connect(单次尝试,绝不 kill-server),让它们可被 uiautodev 抓取。
uiautodev 只认识本地 adb 已连接的设备;设备池里在线但未本地连接的设备
在这里补全,并先做一次轻量 adb connect(单次尝试,绝不 kill-server),
让它们可被 uiautodev 抓取。
"""
ok, data = uiauto_helper.list_devices()
if not ok:
return jsonify({"ok": False, "error": data}), 503
seen = {d.get("serial") for d in data}
try:
pool = stf.list_all_devices()
online = set(device_pool.list_online())
pool = [s for s in device_pool.list_configured() if s in online]
except Exception:
pool = []
added = 0
for d in pool:
serial = d.get("serial", "")
for serial in pool:
if not serial or serial in seen:
continue
if not (d.get("present") and d.get("ready")):
continue
# 轻量连接(单次尝试,不重试不 kill-server);连不上也照样列出,
# 前端抓取时会报明确错误,不影响其他设备的连接
adb_connect_light(serial)
data.append({
"serial": serial,
"model": d.get("model") or d.get("product") or "",
"product": d.get("product") or "",
"model": "",
"product": "",
"name": serial,
"status": "device",
"enabled": True,
@@ -949,7 +952,7 @@ def api_uiauto_devices():
seen.add(serial)
added += 1
if added:
_log.info(f"抓取元素设备列表补全 {added} 台 STF 在线设备: {list(seen)}")
_log.info(f"抓取元素设备列表补全 {added} 台在线设备: {list(seen)}")
return jsonify({"ok": True, "devices": data})
@@ -1006,18 +1009,16 @@ def api_apks_delete(apk_id):
@app.route("/api/apks/install/devices")
@perm_required(PERM_APKS)
def api_apks_install_devices():
"""可安装设备列表(应用管理):STF 在线设备池 + 本机 adb 设备(含 USB 有线连接)。
"""可安装设备列表(应用管理):设备池在线设备 + 本机 adb 设备(含 USB 有线连接)。
source: stf=STF 池 / usb=本机有线 adb / adb=本机网络 adb。
source: pool=设备池 / usb=本机有线 adb / adb=本机网络 adb。
"""
devices, seen = [], set()
try:
for d in stf.list_all_devices():
serial = d.get("serial", "")
if serial and d.get("present") and d.get("ready"):
devices.append({"serial": serial,
"model": d.get("model") or d.get("manufacturer") or "",
"source": "stf"})
online = set(device_pool.list_online())
for serial in device_pool.list_configured():
if serial in online:
devices.append({"serial": serial, "model": "", "source": "pool"})
seen.add(serial)
except Exception:
pass
@@ -1066,12 +1067,11 @@ def _blocked_adb_cmd(cmd):
def _merged_device_list():
"""本地 adb(含 USB)+ STF 在线设备池的合并列表([{serial, state}])。
"""本地 adb(含 USB)+ 设备池的合并列表([{serial, state}])。
供维护终端/剪贴板注入/应用版本管理等设备选择场景共用。
STF 里 adb 可达但 agent 未就绪的设备(手机端 agent 启动失败)也列入,
标记 stf_not_ready——这种设备恰恰需要用维护终端卸载/重装 agent 修复,
不列出来就永远无法修复(死循环)。
状态:device/offline=本机 adb 实际状态;pool=设备池已配置但本机未连接;
stf_not_ready=STF agent 未就绪(迁移期保留,阶段 3 摘除 STF 后删除)。
"""
states = {}
out = _adb("devices")
@@ -1079,15 +1079,17 @@ def _merged_device_list():
parts = line.split()
if len(parts) >= 2 and parts[0] and not parts[0].startswith("*"):
states[parts[0]] = parts[1]
try:
for serial in device_pool.list_configured():
if serial not in states:
states[serial] = "pool"
except Exception:
pass
# 迁移期:STF 里 adb 可达但 agent 未就绪的设备仍列出,供维护终端修复 agent
try:
for d in stf.list_all_devices():
serial = d.get("serial", "")
if not serial or serial in states:
continue
if d.get("present") and d.get("ready"):
states[serial] = "stf"
elif d.get("present") and not d.get("ready"):
# adb 可达但 STF agent 未就绪(启动失败/未安装):列入供修复
if serial and d.get("present") and not d.get("ready") and serial not in states:
states[serial] = "stf_not_ready"
except Exception:
pass