修复 Wi-Fi ADB 拔线后刷新丢失 #27

Closed
opened 2026-08-07 15:04:53 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:缺陷
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / MVP
  • 阶段:3. Admin Mock/Gateway 闭环
  • 依赖:#25、#26
  • 当前状态:验收通过

要解决什么

复现步骤

  1. USB 连接手机并搜索,列表显示一台 USB 设备;
  2. 点击“转为 Wi-Fi”,列表出现 USB 和 Wi-Fi 两台设备;
  3. 勾选 Wi-Fi 设备并保存;
  4. 拔掉 USB 数据线后点击“搜索/刷新”;
  5. USB 和 Wi-Fi 设备都从列表消失。

已确认 SQLite 正确保存 Wi-Fi 地址;问题发生时 adb devices -l 为空,但手机的 5555 TCP 端口仍在监听。当前普通搜索只执行 adb devices -l,不会重新执行 adb connect。另外,旧转换流程根据 USB 序列号短暂消失判断拔线,可能把 adb tcpip 5555 引起的 adbd 重启误判成物理拔线。

做什么 / 不做什么

  • 做:
    • USB 转 Wi-Fi 在数据线仍连接时完成:读取 IP、开启 5555、连接并验证 Wi-Fi;
    • 转换成功后直接刷新列表,正常显示 USB 和 Wi-Fi 两种连接;
    • 不再等待或猜测用户是否已经物理拔线;
    • 普通搜索/刷新时,若 SQLite 保存的是 Wi-Fi 地址,先后台重连该地址,再刷新 ADB 列表;
    • 重连失败时保留已保存配置,并给出可恢复提示;
    • 保持勾选状态使用稳定设备号,成功刷新后重新勾选已保存 Wi-Fi 设备;
    • 增加服务层和离屏 Qt 测试,覆盖重复点击、失败和关闭安全。
  • 不做:
    • 不保证手机重启、IP 改变、切换网络或关闭 5555 后仍在线;
    • 不保存临时 USB 设备或整个搜索结果;
    • 不实现 Android 11 配对码流程;
    • 不修改数据库结构、Admin、PDD 自动化和第三方依赖;
    • 不改页面布局,不制作 HTML 原型。

怎么做

  1. 简化 AndroidDeviceService.convert_usb_to_wifi:执行 adb tcpip 5555 后直接连接 Wi-Fi,确认目标地址状态为 device,再返回最新列表;删除“等待 USB 拔出”的运行步骤和相关误判。
  2. 让普通搜索 Worker 在存在已保存 Wi-Fi 地址时复用恢复逻辑:先 adb connect,再 adb devices -l;无保存地址或保存的是 USB 时保持普通搜索。
  3. 转换与搜索继续使用现有 QObject + moveToThread,不在主线程执行 ADB。
  4. 状态区明确提示“Wi-Fi 已连接,可保存后拔掉 USB”和重连失败后的处理方式,不弹模态框。
  5. 转换成功本身不自动写数据库;用户仍需勾选 Wi-Fi 后点击“保存”。

预计修改:

  • client/src/android_device_service.py
  • client/src/settings_ui_event.py
  • client/test/test_android_device_service.py
  • client/test/test_settings_ui_event.py

验收标准

  • 转换时不等待或误判物理拔线;
  • 数据线连接状态下可完成 Wi-Fi 连接并显示 USB、Wi-Fi 两台设备;
  • 转换成功后提示用户勾选 Wi-Fi、保存,再拔掉 USB;
  • 转换成功不会自动保存 Wi-Fi 设备;
  • 已保存 Wi-Fi 时,点击搜索/刷新先执行 adb connect 再查询设备;
  • 拔掉 USB 后刷新仍显示并勾选已保存的 Wi-Fi 设备;
  • 无已保存 Wi-Fi 时,搜索不额外执行 adb connect;
  • 重连失败保留数据库配置并显示下一步;
  • ADB 操作不阻塞 Qt 主线程,重复点击和页面关闭安全;
  • 不修改数据库、Admin、PDD 和依赖;
  • 全量 unittest、语法检查、离屏窗口冒烟和 git diff --check 通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m py_compile src/android_device_service.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"
Remove-Item Env:QT_QPA_PLATFORM

真机验收:

  1. USB 连接手机,搜索并勾选 USB 设备;
  2. 点击“转为 Wi-Fi”���不拔线,确认列表显示 USB 和 Wi-Fi;
  3. 勾选 Wi-Fi 并保存;
  4. 拔掉 USB 数据线,点击搜索;
  5. 确认 Wi-Fi 设备重新出现并保持勾选;
  6. 重启 Client,确认 #26 的启动恢复仍有效。

风险和回退

  • 某些手机会在重启、切网或关闭开发者选项后停止监听 5555,此时显示可恢复错误,不能伪装在线。
  • 回退时可撤销本工单提交,恢复 #25、#26 原行为;不涉及数据库回滚。

实施记录

  • 代码提交:5750397 fix: 修复 Wi-Fi ADB 拔线后刷新丢失 (#27)
  • 文档提交:c07fe56 docs: 归档任务 #27
  • Client 全量 95 项测试通过;语法检查、离屏主窗口启动/退出和差异检查通过。
  • 真机转换通过:USB 与 192.168.0.173:5555 同时稳定显示,状态均为 device。
  • 真机重连通过:主动断开 Wi-Fi ADB 会话后点击搜索,自动重连并勾选 192.168.0.173:5555。
  • 实施中发现 Wi-Fi ADB 会短暂进入 unauthorized,已增加后台稳定等待和手机授权提示。
  • 当前阶段:已实现,等待用户物理拔掉 USB 数据线验收;工单保持开启。

验收关闭

  • 用户于 2026-08-07 确认验收通过。
  • 本地归档状态已更新为“已完成”。
  • 验收归档提交:a6e3fe0。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:3. Admin Mock/Gateway 闭环 - 依赖:#25、#26 - 当前状态:验收通过 ## 要解决什么 ### 复现步骤 1. USB 连接手机并搜索,列表显示一台 USB 设备; 2. 点击“转为 Wi-Fi”,列表出现 USB 和 Wi-Fi 两台设备; 3. 勾选 Wi-Fi 设备并保存; 4. 拔掉 USB 数据线后点击“搜索/刷新”; 5. USB 和 Wi-Fi 设备都从列表消失。 已确认 SQLite 正确保存 Wi-Fi 地址;问题发生时 `adb devices -l` 为空,但手机的 5555 TCP 端口仍在监听。当前普通搜索只执行 `adb devices -l`,不会重新执行 `adb connect`。另外,旧转换流程根据 USB 序列号短暂消失判断拔线,可能把 `adb tcpip 5555` 引起的 adbd 重启误判成物理拔线。 ## 做什么 / 不做什么 - 做: - USB 转 Wi-Fi 在数据线仍连接时完成:读取 IP、开启 5555、连接并验证 Wi-Fi; - 转换成功后直接刷新列表,正常显示 USB 和 Wi-Fi 两种连接; - 不再等待或猜测用户是否已经物理拔线; - 普通搜索/刷新时,若 SQLite 保存的是 Wi-Fi 地址,先后台重连该地址,再刷新 ADB 列表; - 重连失败时保留已保存配置,并给出可恢复提示; - 保持勾选状态使用稳定设备号,成功刷新后重新勾选已保存 Wi-Fi 设备; - 增加服务层和离屏 Qt 测试,覆盖重复点击、失败和关闭安全。 - 不做: - 不保证手机重启、IP 改变、切换网络或关闭 5555 后仍在线; - 不保存临时 USB 设备或整个搜索结果; - 不实现 Android 11 配对码流程; - 不修改数据库结构、Admin、PDD 自动化和第三方依赖; - 不改页面布局,不制作 HTML 原型。 ## 怎么做 1. 简化 `AndroidDeviceService.convert_usb_to_wifi`:执行 `adb tcpip 5555` 后直接连接 Wi-Fi,确认目标地址状态为 `device`,再返回最新列表;删除“等待 USB 拔出”的运行步骤和相关误判。 2. 让普通搜索 Worker 在存在已保存 Wi-Fi 地址时复用恢复逻辑:先 `adb connect`,再 `adb devices -l`;无保存地址或保存的是 USB 时保持普通搜索。 3. 转换与搜索继续使用现有 `QObject + moveToThread`,不在主线程执行 ADB。 4. 状态区明确提示“Wi-Fi 已连接,可保存后拔掉 USB”和重连失败后的处理方式,不弹模态框。 5. 转换成功本身不自动写数据库;用户仍需勾选 Wi-Fi 后点击“保存”。 预计修改: - `client/src/android_device_service.py` - `client/src/settings_ui_event.py` - `client/test/test_android_device_service.py` - `client/test/test_settings_ui_event.py` ## 验收标准 - [x] 转换时不等待或误判物理拔线; - [x] 数据线连接状态下可完成 Wi-Fi 连接并显示 USB、Wi-Fi 两台设备; - [x] 转换成功后提示用户勾选 Wi-Fi、保存,再拔掉 USB; - [x] 转换成功不会自动保存 Wi-Fi 设备; - [x] 已保存 Wi-Fi 时,点击搜索/刷新先执行 `adb connect` 再查询设备; - [x] 拔掉 USB 后刷新仍显示并勾选已保存的 Wi-Fi 设备; - [x] 无已保存 Wi-Fi 时,搜索不额外执行 `adb connect`; - [x] 重连失败保留数据库配置并显示下一步; - [x] ADB 操作不阻塞 Qt 主线程,重复点击和页面关闭安全; - [x] 不修改数据库、Admin、PDD 和依赖; - [x] 全量 unittest、语法检查、离屏窗口冒烟和 `git diff --check` 通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m py_compile src/android_device_service.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" Remove-Item Env:QT_QPA_PLATFORM ``` 真机验收: 1. USB 连接手机,搜索并勾选 USB 设备; 2. 点击“转为 Wi-Fi”���不拔线,确认列表显示 USB 和 Wi-Fi; 3. 勾选 Wi-Fi 并保存; 4. 拔掉 USB 数据线,点击搜索; 5. 确认 Wi-Fi 设备重新出现并保持勾选; 6. 重启 Client,确认 #26 的启动恢复仍有效。 ## 风险和回退 - 某些手机会在重启、切网或关闭开发者选项后停止监听 5555,此时显示可恢复错误,不能伪装在线。 - 回退时可撤销本工单提交,恢复 #25、#26 原行为;不涉及数据库回滚。 ## 实施记录 - 代码提交:`5750397` `fix: 修复 Wi-Fi ADB 拔线后刷新丢失 (#27)` - 文档提交:`c07fe56` `docs: 归档任务 #27` - Client 全量 95 项测试通过;语法检查、离屏主窗口启动/退出和差异检查通过。 - 真机转换通过:USB 与 `192.168.0.173:5555` 同时稳定显示,状态均为 `device`。 - 真机重连通过:主动断开 Wi-Fi ADB 会话后点击搜索,自动重连并勾选 `192.168.0.173:5555`。 - 实施中发现 Wi-Fi ADB 会短暂进入 `unauthorized`,已增加后台稳定等待和手机授权提示。 - 当前阶段:已实现,等待用户物理拔掉 USB 数据线验收;工单保持开启。 ## 验收关闭 - 用户于 2026-08-07 确认验收通过。 - 本地归档状态已更新为“已完成”。 - 验收归档提交:`a6e3fe0`。
Author
Owner

工单已创建并同步到 #1、#2,现开始实施。现有 Admin、PDD UI 和未跟踪文件不纳入 #27 提交。

工单已创建并同步到 #1、#2,现开始实施。现有 Admin、PDD UI 和未跟踪文件不纳入 #27 提交。
Author
Owner

真机验证发现补充边界:执行 adb connect 后,192.168.0.173:5555 会短暂显示为 unauthorized,约 1 秒后变为 device。若立即刷新表格,会把仍在授权握手的设备误报为离线。

在 #27 范围内补充:

  • Wi-Fi connect 后在后台短暂等待目标 transport 变为 device,等待过程可取消且有超时;
  • 超时仍为 unauthorized 时,明确提示用户在手机上允许调试,不自动勾选;
  • 增加“短暂 unauthorized 后恢复”和“持续 unauthorized”测试。

不改变数据库、接口或页面布局。

真机验证发现补充边界:执行 `adb connect` 后,`192.168.0.173:5555` 会短暂显示为 `unauthorized`,约 1 秒后变为 `device`。若立即刷新表格,会把仍在授权握手的设备误报为离线。 在 #27 范围内补充: - Wi-Fi connect 后在后台短暂等待目标 transport 变为 `device`,等待过程可取消且有超时; - 超时仍为 `unauthorized` 时,明确提示用户在手机上允许调试,不自动勾选; - 增加“短暂 unauthorized 后恢复”和“持续 unauthorized”测试。 不改变数据库、接口或页面布局。
Author
Owner

#27 已实现,等待物理拔线验收。

  • 代码:5750397
  • 归档:c07fe56
  • Client 全量 95 项测试通过
  • 真机插线转换通过:USB、Wi-Fi 两台设备均为 device
  • 真机 ADB 会话断开后搜索自动重连通过
  • 发现并处理了短暂 unauthorized 与 USB transport 重启时序
  • 现有 Admin、PDD UI 和未跟踪文件未纳入提交

请按工单步骤物理拔掉 USB 后点击“搜索”。预期表格只剩 Wi-Fi 设备 192.168.0.173:5555,并保持勾选;通过后再关闭工单并同步 #1、#2。

#27 已实现,等待物理拔线验收。 - 代码:`5750397` - 归档:`c07fe56` - Client 全量 95 项测试通过 - 真机插线转换通过:USB、Wi-Fi 两台设备均为 `device` - 真机 ADB 会话断开后搜索自动重连通过 - 发现并处理了短暂 `unauthorized` 与 USB transport 重启时序 - 现有 Admin、PDD UI 和未跟踪文件未纳入提交 请按工单步骤物理拔掉 USB 后点击“搜索”。预期表格只剩 Wi-Fi 设备 `192.168.0.173:5555`,并保持勾选;通过后再关闭工单并同步 #1、#2。
ila closed this issue 2026-08-07 15:21: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#27