Files
cmautobuy/docs/task/25-usb-android-设备转-wifi-adb.md
T

4.1 KiB

25 将勾选的 USB Android 设备转为 Wi-Fi ADB

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 状态:已完成
  • 日期:2026-08-07
  • Gitea 工单:#25

背景与目标

用户原来需要在终端手工读取手机 IP、开启 5555、拔掉 USB 并重新执行 adb connect。此次在设置页增加“转为 Wi-Fi”按钮,引导用户把勾选的 USB 设备转换为拔线后仍可使用的 Wi-Fi ADB 设备。

最终方案

  • “转为 Wi-Fi”只在勾选状态正常的 USB 设备时可用。
  • 服务使用带设备号的 ADB 命令读取 ip route,优先从默认路由对应接口的 src 字段解析 IPv4,不写死 wlan0。
  • 对指定 USB 设备执行 adb tcpip 5555,尝试准备 Wi-Fi 通道,并在状态区提示用户拔掉 USB。
  • 后台每 0.5 秒检查一次 USB 通道,连续两次消失才继续,避免把 adbd 短暂重启误判为拔线;默认等待 60 秒。
  • 检测到拔线后再次执行 adb connect IP:5555,并确认该设备状态为 device。
  • 成功后刷新设备列表并勾选 Wi-Fi 设备;不会自动写入 SQLite,用户仍需点击“保存”。
  • ADB 命令、等待和轮询全部在 QObject + moveToThread Worker 中执行;页面关闭后停止后续步骤并忽略迟到结果。
  • 失败时保留原列表、原勾选和已保存配置,并在原状态区提供原因和重试建议。
  • 不修改数据库、Admin 接口、PDD 自动化和第三方依赖。

这是设置页的局部按钮和状态补全,按 windows-ui-ux 的长任务规则使用稳定状态区反馈,未制作 HTML 原型。

改了哪些

  • client/src/android_device_service.py:IP 解析、开启 5555、拔线检测、Wi-Fi 重连和最终验证。
  • client/src/settings_ui.py:增加 Fluent“转为 Wi-Fi”按钮、工具提示和无障碍名称。
  • client/src/settings_ui_event.py:增加转换 Worker、进度反馈、按钮互斥和关闭保护。
  • client/test/test_android_device_service.py:覆盖路由解析、命令顺序、拔线超时、错误设备和状态验证。
  • client/test/test_settings_ui_event.py:覆盖按钮状态、成功刷新、不自动保存、失败保留、主线程响应和关闭安全。

验收结果

验收标准 结果
仅勾选正常 USB 设备时按钮可用 通过
从默认路由对应接口解析有效 Wi-Fi IPv4 通过
ADB 命令明确使用 USB 序列号或 Wi-Fi 地址 通过
开启 5555、提示拔线并检测 USB 稳定消失 通过
拔线后重新连接并验证 Wi-Fi 状态 用户真机验收通过
成功后刷新并勾选 Wi-Fi 设备 通过
转换成功不自动保存当前设备 通过
失败保留列表、勾选和已保存配置 通过
防止重复提交,Qt 主线程保持响应 通过
页面关闭后忽略迟到结果 通过
不修改数据库、Admin、PDD 和依赖 通过
全量测试、语法检查和差异检查 通过

测试

  • 执行的命令:
# client 目录
C:/Python310/python.exe -m py_compile src/android_device_service.py src/settings_ui.py src/settings_ui_event.py test/test_android_device_service.py test/test_settings_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
C:/Python310/python.exe -c "from src.ui_main import MainWindow; from PyQt5.QtWidgets import QApplication; app=QApplication([]); w=MainWindow(); print('OK'); w.close(); app.quit()"
  • 结果:Client 全量 85 项测试通过;语法检查、离屏窗口冒烟和 git diff --check 通过。
  • 真机只读核对:192.168.0.173:5555 在线,实际 ip route 输出包含 wlan0 ... src 192.168.0.173,解析规则匹配。
  • 用户已完成 USB 转 Wi-Fi 和拔线流程验收。
  • 没验证到的部分:尚未验证打包后的 exe、Narrator、高对比度和 200% 缩放。

测试环境仍会输出现有 PyQt5 字体目录缺失和 SIP API 弃用警告,不影响测试结果。

相关提交

  • d478e69 feat: 支持 USB 设备转 Wi-Fi ADB (#25)