修复旧 Wi-Fi 设备恢复失败时无法搜索 USB 设备 #66

Closed
opened 2026-08-09 22:09:42 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP)
  • 阶段:Android 设备管理

要解决什么

复现步骤:

  1. Client 数据库保存一台旧的 Wi-Fi ADB 设备,例如 192.168.0.173:5555。
  2. 旧 Wi-Fi 地址当前无法连接,同时通过 USB 连接另一台手机。
  3. 命令行执行 adb devices -l 可以看到 USB 设备。
  4. 在 Client 设置页点击“搜索”。

当前程序先恢复已保存 Wi-Fi;adb connect 失败后整个 Worker 直接报错,没有继续执行普通设备枚举,所以表格看不到已经连接的 USB 设备。

做什么 / 不做什么

  • 做:旧 Wi-Fi 恢复失败后继续执行 adb devices -l;表格展示实际找到的设备;提示恢复警告并保留已保存配置;只有普通设备枚举本身失败才按搜索失败处理。
  • 不做:不自动删除或改写已保存设备;不增加新按钮;不改变 USB 转 Wi-Fi、保存和删除流程;不改数据库和 Admin 接口。

怎么做

  • client/src/android_device_service.py:增加简单的设备搜索结果对象,分别表达设备列表和可选的恢复警告。
  • client/src/settings_ui_event.py:后台 Worker 捕获已保存设备恢复错误,随后继续普通搜索;把设备和恢复警告一起回传主线程。主线程始终先更新实际设备表格,再显示“搜索完成但旧设备恢复失败”的中文提示。
  • client/test/test_settings_ui_event.py:覆盖旧 Wi-Fi 离线但 USB 在线、旧 Wi-Fi 离线且无其他设备、普通 adb devices -l 失败,以及原有成功恢复行为。
  • 同步设置页稳定交互文档;这是局部错误恢复调整,不制作 HTML 原型。

验收标准

  • 已保存 Wi-Fi 在线时,搜索后仍能恢复并自动勾选。
  • 已保存 Wi-Fi 离线但 USB 在线时,表格显示 USB 设备,并提示旧设备恢复失败、配置保留。
  • 已保存 Wi-Fi 离线且没有其他设备时,显示空表及恢复失败提示,不清除配置。
  • 普通 adb devices -l 本身失败时,保留原表格并显示搜索失败。
  • ADB 操作继续在 QObject + moveToThread 工作线程执行,界面不阻塞。
  • 不修改数据库中的 android.selected_serial,不影响保存、删除和 USB 转 Wi-Fi。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m unittest discover -s test -p test_settings_ui_event.py -v
C:/Python310/python.exe -m unittest discover -s test -v
C:/Python310/python.exe -m py_compile src/android_device_service.py src/settings_ui_event.py
$env:QT_QPA_PLATFORM="offscreen"
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()"
Remove-Item Env:QT_QPA_PLATFORM

手动验证:数据库已保存不可连接的旧 Wi-Fi 地址,同时 USB 手机在 adb devices -l 中为 device;点击搜索后应显示 USB 手机和恢复警告。

风险和回退

  • 恢复失败后会多执行一次普通搜索,但操作已在后台线程且沿用现有超时。
  • 旧配置只保留不改写,用户仍可使用“删除”主动清除。
  • 可按本工单提交回退,不涉及数据库迁移或接口兼容。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 Client 可运行任务闭环(MVP) - 阶段:Android 设备管理 ## 要解决什么 复现步骤: 1. Client 数据库保存一台旧的 Wi-Fi ADB 设备,例如 `192.168.0.173:5555`。 2. 旧 Wi-Fi 地址当前无法连接,同时通过 USB 连接另一台手机。 3. 命令行执行 `adb devices -l` 可以看到 USB 设备。 4. 在 Client 设置页点击“搜索”。 当前程序先恢复已保存 Wi-Fi;`adb connect` 失败后整个 Worker 直接报错,没有继续执行普通设备枚举,所以表格看不到已经连接的 USB 设备。 ## 做什么 / 不做什么 - 做:旧 Wi-Fi 恢复失败后继续执行 `adb devices -l`;表格展示实际找到的设备;提示恢复警告并保留已保存配置;只有普通设备枚举本身失败才按搜索失败处理。 - 不做:不自动删除或改写已保存设备;不增加新按钮;不改变 USB 转 Wi-Fi、保存和删除流程;不改数据库和 Admin 接口。 ## 怎么做 - `client/src/android_device_service.py`:增加简单的设备搜索结果对象,分别表达设备列表和可选的恢复警告。 - `client/src/settings_ui_event.py`:后台 Worker 捕获已保存设备恢复错误,随后继续普通搜索;把设备和恢复警告一起回传主线程。主线程始终先更新实际设备表格,再显示“搜索完成但旧设备恢复失败”的中文提示。 - `client/test/test_settings_ui_event.py`:覆盖旧 Wi-Fi 离线但 USB 在线、旧 Wi-Fi 离线且无其他设备、普通 `adb devices -l` 失败,以及原有成功恢复行为。 - 同步设置页稳定交互文档;这是局部错误恢复调整,不制作 HTML 原型。 ## 验收标准 - [ ] 已保存 Wi-Fi 在线时,搜索后仍能恢复并自动勾选。 - [ ] 已保存 Wi-Fi 离线但 USB 在线时,表格显示 USB 设备,并提示旧设备恢复失败、配置保留。 - [ ] 已保存 Wi-Fi 离线且没有其他设备时,显示空表及恢复失败提示,不清除配置。 - [ ] 普通 `adb devices -l` 本身失败时,保留原表格并显示搜索失败。 - [ ] ADB 操作继续在 `QObject + moveToThread` 工作线程执行,界面不阻塞。 - [ ] 不修改数据库中的 `android.selected_serial`,不影响保存、删除和 USB 转 Wi-Fi。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -p test_settings_ui_event.py -v C:/Python310/python.exe -m unittest discover -s test -v C:/Python310/python.exe -m py_compile src/android_device_service.py src/settings_ui_event.py $env:QT_QPA_PLATFORM="offscreen" 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()" Remove-Item Env:QT_QPA_PLATFORM ``` 手动验证:数据库已保存不可连接的旧 Wi-Fi 地址,同时 USB 手机在 `adb devices -l` 中为 `device`;点击搜索后应显示 USB 手机和恢复警告。 ## 风险和回退 - 恢复失败后会多执行一次普通搜索,但操作已在后台线程且沿用现有超时。 - 旧配置只保留不改写,用户仍可使用“删除”主动清除。 - 可按本工单提交回退,不涉及数据库迁移或接口兼容。
Author
Owner

实施进度

代码与回归已完成,准备提交:

  • 已保存 Wi-Fi 恢复失败后,Worker 会继续普通设备搜索;
  • 搜索结果分别携带实际设备列表和恢复警告;
  • 主线程更新实际设备表格,并提示旧设备恢复失败、配置保留;
  • 普通 adb devices -l 失败仍按真正搜索失败处理并保留旧表格。

验证:Client 全量 183 项测试通过;语法检查和离屏主窗口冒烟通过。

当前机器实机只读验证:旧地址 192.168.0.173:5555 恢复超时后,搜索结果仍返回 USB 设备 30167b23,且没有整体搜索错误。

## 实施进度 代码与回归已完成,准备提交: - 已保存 Wi-Fi 恢复失败后,Worker 会继续普通设备搜索; - 搜索结果分别携带实际设备列表和恢复警告; - 主线程更新实际设备表格,并提示旧设备恢复失败、配置保留; - 普通 `adb devices -l` 失败仍按真正搜索失败处理并保留旧表格。 验证:Client 全量 183 项测试通过;语法检查和离屏主窗口冒烟通过。 当前机器实机只读验证:旧地址 `192.168.0.173:5555` 恢复超时后,搜索结果仍返回 USB 设备 `30167b23`,且没有整体搜索错误。
Author
Owner

完成记录

状态:待用户验收。

最终实现:旧 Wi-Fi 恢复失败后继续普通设备枚举,表格显示实际设备,并把恢复错误作为“配置已保留”的警告;只有普通枚举也失败时才保留旧表格并显示搜索失败。没有修改数据库、Admin 接口或设备保存值。

提交:

  • ff8cdd7 fix: Wi-Fi 恢复失败后继续搜索设备 (#66)
  • c01f3f8 docs: 归档任务 #66

归档:docs/task/66-Wi-Fi恢复失败后继续搜索设备.md

验证:设置页 37 项测试通过,Client 全量 183 项测试通过,语法检查和离屏冒烟通过。当前机器旧 Wi-Fi 恢复超时后仍成功返回 USB 设备 30167b23。

未验证:用户尚未在可见 Client 页面点击搜索完成最终验收。

## 完成记录 状态:待用户验收。 最终实现:旧 Wi-Fi 恢复失败后继续普通设备枚举,表格显示实际设备,并把恢复错误作为“配置已保留”的警告;只有普通枚举也失败时才保留旧表格并显示搜索失败。没有修改数据库、Admin 接口或设备保存值。 提交: - `ff8cdd7` `fix: Wi-Fi 恢复失败后继续搜索设备 (#66)` - `c01f3f8` `docs: 归档任务 #66` 归档:`docs/task/66-Wi-Fi恢复失败后继续搜索设备.md` 验证:设置页 37 项测试通过,Client 全量 183 项测试通过,语法检查和离屏冒烟通过。当前机器旧 Wi-Fi 恢复超时后仍成功返回 USB 设备 `30167b23`。 未验证:用户尚未在可见 Client 页面点击搜索完成最终验收。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:10 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#66