阶段2: USB 远程 adb server 打通(220 host 网络 5037 全接口监听,无需改 220)+ 自建远程看屏(MJPEG 流 + u2 触控 tap/swipe/key/text,ws-scrcpy 不在 npm 改自建)
This commit is contained in:
@@ -31,6 +31,26 @@ def _adb(*args):
|
||||
except subprocess.TimeoutExpired:
|
||||
_log.warning(f"adb {' '.join(args)} 超时 {_ADB_TIMEOUT}s")
|
||||
return ""
|
||||
return _decode(r)
|
||||
|
||||
|
||||
def _adb_remote(host, port, *args):
|
||||
"""在远程 adb server(如 220)上执行 adb 命令,返回文本。
|
||||
|
||||
USB 设备插在 220,本机 adb server 看不到,必须 -H/-P 指向 220 的 adb server
|
||||
(host 网络模式,5037 全接口监听,Tailscale 可达)。超时语义同 _adb。
|
||||
"""
|
||||
try:
|
||||
r = subprocess.run([ADB_PATH, "-H", host, "-P", str(port), *args],
|
||||
capture_output=True, timeout=_ADB_TIMEOUT)
|
||||
except subprocess.TimeoutExpired:
|
||||
_log.warning(f"adb -H {host} -P {port} {' '.join(args)} 超时 {_ADB_TIMEOUT}s")
|
||||
return ""
|
||||
return _decode(r)
|
||||
|
||||
|
||||
def _decode(r):
|
||||
"""subprocess 结果解码(Windows GBK 兼容)。"""
|
||||
out = (r.stdout or b"") + (r.stderr or b"")
|
||||
try:
|
||||
return out.decode("utf-8", errors="replace").strip()
|
||||
@@ -77,6 +97,41 @@ def get_foreground_app(remote_adb_url, timeout=3):
|
||||
return None
|
||||
|
||||
|
||||
def get_foreground_app_remote(host, port, serial, timeout=3):
|
||||
"""远程 adb server(220)上设备的前台 App(USB 设备用)。
|
||||
|
||||
与 get_foreground_app 同逻辑,只是 adb 指向远程 server(-H/-P)。
|
||||
"""
|
||||
if not serial:
|
||||
return None
|
||||
try:
|
||||
r = subprocess.run(
|
||||
[ADB_PATH, "-H", host, "-P", str(port), "-s", serial, "shell",
|
||||
"dumpsys window | grep mCurrentFocus"],
|
||||
capture_output=True, timeout=timeout
|
||||
)
|
||||
out = ((r.stdout or b"") + (r.stderr or b"")).decode("utf-8", errors="replace").strip()
|
||||
if not out:
|
||||
return None
|
||||
low = out.lower()
|
||||
if "device offline" in low or "device not found" in low or "error:" in low:
|
||||
return None
|
||||
for line in out.split("\n"):
|
||||
if "mCurrentFocus" not in line:
|
||||
continue
|
||||
m = re.search(r'\bu0\s+(\S+)', line)
|
||||
if m:
|
||||
token = m.group(1).rstrip("}")
|
||||
if "/" in token:
|
||||
return token.split("/")[0]
|
||||
return token or None
|
||||
return None
|
||||
except subprocess.TimeoutExpired:
|
||||
return None
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def adb_connect(remote_adb_url, retries=5):
|
||||
"""adb connect(带重试)。返回 True/False。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user