启动时自动恢复已保存的 Android 设备 #26

Closed
opened 2026-08-07 14:48:56 +08:00 by ila · 2 comments
Owner

基本信息

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

要解决什么

复现步骤

  1. 搜索到 Wi-Fi Android 设备并勾选;
  2. 点击“保存”,数据库写入 android.selected_serial;
  3. 关闭并重新启动 Client;
  4. Android 设备表格仍为空,必须再次手工点击“搜索”。

已确认保存本身正常,当前开发数据库中存在已保存的 Wi-Fi 设备号。根因是页面启动时只恢复设备号和提示文字,没有自动执行 ADB 重连或搜索。

做什么 / 不做什么

  • 做:
    • 页面完成初始化后,若存在已保存 Android 设备号,自动启动后台恢复;
    • 已保存 Wi-Fi 设备(IP:端口)先执行 adb connect,再搜索;
    • 已保存 USB 设备只执行搜索,不尝试网络连接;
    • 搜索成功后刷新列表,并沿用现有逻辑自动勾选已保存且在线的设备;
    • 恢复期间禁用冲突命令,防止手动搜索、保存或转换重复执行;
    • 失败时保留已保存配置,显示可恢复提示,用户仍可手动搜索或重试;
    • 页面关闭时取消后续步骤并忽略迟到结果;
    • 增加服务和离屏 Qt 自动测试。
  • 不做:
    • 不保存 ADB 搜索列表、在线状态、型号或 Android 版本;
    • 不修改 SQLite 表结构和现有设置键;
    • 不自动保存其他设备;
    • 不自动执行 USB 转 Wi-Fi;
    • 不实现 Android 11 配对码流程;
    • 不修改 Admin、PDD 自动化和采购流程;
    • 不增加第三方依赖;
    • 不顺带实现无线地址输入框的“连接”按钮。

怎么做

  1. 在 AndroidDeviceService 增加“恢复已保存设备”方法:
    • Wi-Fi 序列号先调用现有安全连接逻辑,再执行搜索;
    • USB 序列号直接执行搜索;
    • 所有命令继续使用参数列表和现有超时、错误转换。
  2. 复用现有搜索 Worker,增加可选的“恢复设备号”输入,不再创建第二套搜索线程状态。
  3. 页面加载设置完成后使用 Qt 排队调用启动恢复,避免在 QWidget 构造过程中执行阻塞工作。
  4. 恢复与普通搜索共享忙碌、按钮互斥、结果刷新、自动勾选和关闭清理。
  5. 启动提示区分“正在恢复”“已恢复并自动选择”“设备未连接/恢复失败”,不弹模态框。
  6. 这是已有页面的启动行为修复,不调整布局,按 Windows UI/UX 规范跳过 HTML 原型。

预计修改:

  • 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

验收标准

  • 没有已保存设备时,启动不自动执行 ADB;
  • 已保存 Wi-Fi 设备时,启动在后台依次执行 adb connect IP:端口 和搜索;
  • 已保存 USB 设备时,启动只搜索,不执行 adb connect;
  • 恢复成功后表格显示最新设备,并自动勾选已保存设备;
  • Wi-Fi 已经连接时也能正常恢复;
  • 恢复失败时保留 android.selected_serial 并显示可重试提示;
  • 恢复期间防止重复搜索和其他冲突命令,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"
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

真机验收:

  1. 保存在线 Wi-Fi 设备并关闭 Client;
  2. 保持手机与电脑在同一 Wi-Fi,重新启动 Client;
  3. 不点击“搜索”,确认表格自动出现并勾选已保存设备;
  4. 断开 Wi-Fi ADB 后重启,确认配置保留且错误可恢复;
  5. 保存 USB 设备后重启,确认只搜索当前 USB 连接。

实施记录

  • 代码提交:dc9b000 fix: 启动时恢复已保存的 Android 设备 (#26)
  • 文档提交:ffaeb55 docs: 归档任务 #26
  • Client 全量 92 项自动化测试通过;语法检查和差异检查通过。
  • 真机启动恢复通过:未点击“搜索”,自动连接并勾选 192.168.0.173:5555,识别型号 PKG110、Android 16,状态为 device。
  • 当前阶段:已实现,等待用户在可见客户端中验收;工单保持开启。

验收关闭

  • 用户于 2026-08-07 确认验收通过。
  • 本地归档状态已更新为“已完成”。
  • 验收归档提交:a6e3fe0。
## 基本信息 - 类型:缺陷 - 父级大工单:#1 - 所属 MVP / 版本:#2 / MVP - 阶段:3. Admin Mock/Gateway 闭环 - 依赖:#21、#22、#25 - 当前状态:验收通过 ## 要解决什么 ### 复现步骤 1. 搜索到 Wi-Fi Android 设备并勾选; 2. 点击“保存”,数据库写入 `android.selected_serial`; 3. 关闭并重新启动 Client; 4. Android 设备表格仍为空,必须再次手工点击“搜索”。 已确认保存本身正常,当前开发数据库中存在已保存的 Wi-Fi 设备号。根因是页面启动时只恢复设备号和提示文字,没有自动执行 ADB 重连或搜索。 ## 做什么 / 不做什么 - 做: - 页面完成初始化后,若存在已保存 Android 设备号,自动启动后台恢复; - 已保存 Wi-Fi 设备(`IP:端口`)先执行 `adb connect`,再搜索; - 已保存 USB 设备只执行搜索,不尝试网络连接; - 搜索成功后刷新列表,并沿用现有逻辑自动勾选已保存且在线的设备; - 恢复期间禁用冲突命令,防止手动搜索、保存或转换重复执行; - 失败时保留已保存配置,显示可恢复提示,用户仍可手动搜索或重试; - 页面关闭时取消后续步骤并忽略迟到结果; - 增加服务和离屏 Qt 自动测试。 - 不做: - 不保存 ADB 搜索列表、在线状态、型号或 Android 版本; - 不修改 SQLite 表结构和现有设置键; - 不自动保存其他设备; - 不自动执行 USB 转 Wi-Fi; - 不实现 Android 11 配对码流程; - 不修改 Admin、PDD 自动化和采购流程; - 不增加第三方依赖; - 不顺带实现无线地址输入框的“连接”按钮。 ## 怎么做 1. 在 `AndroidDeviceService` 增加“恢复已保存设备”方法: - Wi-Fi 序列号先调用现有安全连接逻辑,再执行搜索; - USB 序列号直接执行搜索; - 所有命令继续使用参数列表和现有超时、错误转换。 2. 复用现有搜索 Worker,增加可选的“恢复设备号”输入,不再创建第二套搜索线程状态。 3. 页面加载设置完成后使用 Qt 排队调用启动恢复,避免在 QWidget 构造过程中执行阻塞工作。 4. 恢复与普通搜索共享忙碌、按钮互斥、结果刷新、自动勾选和关闭清理。 5. 启动提示区分“正在恢复”“已恢复并自动选择”“设备未连接/恢复失败”,不弹模态框。 6. 这是已有页面的启动行为修复,不调整布局,按 Windows UI/UX 规范跳过 HTML 原型。 预计修改: - `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] 没有已保存设备时,启动不自动执行 ADB; - [x] 已保存 Wi-Fi 设备时,启动在后台依次执行 `adb connect IP:端口` 和搜索; - [x] 已保存 USB 设备时,启动只搜索,不执行 `adb connect`; - [x] 恢复成功后表格显示最新设备,并自动勾选已保存设备; - [x] Wi-Fi 已经连接时也能正常恢复; - [x] 恢复失败时保留 `android.selected_serial` 并显示可重试提示; - [x] 恢复期间防止重复搜索和其他冲突命令,Qt 主线程保持响应; - [x] 页面关闭后的迟到结果不访问已销毁控件; - [x] 搜索列表和设备属性仍不写入数据库; - [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" 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 ``` 真机验收: 1. 保存在线 Wi-Fi 设备并关闭 Client; 2. 保持手机与电脑在同一 Wi-Fi,重新启动 Client; 3. 不点击“搜索”,确认表格自动出现并勾选已保存设备; 4. 断开 Wi-Fi ADB 后重启,确认配置保留且错误可恢复; 5. 保存 USB 设备后重启,确认只搜索当前 USB 连接。 ## 实施记录 - 代码提交:`dc9b000` `fix: 启动时恢复已保存的 Android 设备 (#26)` - 文档提交:`ffaeb55` `docs: 归档任务 #26` - Client 全量 92 项自动化测试通过;语法检查和差异检查通过。 - 真机启动恢复通过:未点击“搜索”,自动连接并勾选 `192.168.0.173:5555`,识别型号 `PKG110`、Android 16,状态为 `device`。 - 当前阶段:已实现,等待用户在可见客户端中验收;工单保持开启。 ## 验收关闭 - 用户于 2026-08-07 确认验收通过。 - 本地归档状态已更新为“已完成”。 - 验收归档提交:`a6e3fe0`。
Author
Owner

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

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

#26 已实现,现等待验收。

  • 代码提交:dc9b000
  • 任务归档:ffaeb55
  • Client 全量 92 项测试通过
  • 语法检查、git diff --check、进入 Qt 事件循环的离屏主窗口启动/退出冒烟通过
  • 真机验证通过:启动后自动恢复并勾选 192.168.0.173:5555,识别为 PKG110 / Android 16 / device
  • 恢复失败不会删除数据库中的已保存设备号,可点击“搜索”重试
  • 现有 PDD UI 和未跟踪文件没有纳入本工单提交

建议验收:保持手机与电脑同一 Wi-Fi,关闭并重新打开 Client,不点击“搜索”,确认 Android 设备表自动出现并勾选已保存设备。工单保持开启,用户验收后再关闭并同步 #1、#2。

#26 已实现,现等待验收。 - 代码提交:`dc9b000` - 任务归档:`ffaeb55` - Client 全量 92 项测试通过 - 语法检查、`git diff --check`、进入 Qt 事件循环的离屏主窗口启动/退出冒烟通过 - 真机验证通过:启动后自动恢复并勾选 `192.168.0.173:5555`,识别为 `PKG110 / Android 16 / device` - 恢复失败不会删除数据库中的已保存设备号,可点击“搜索”重试 - 现有 PDD UI 和未跟踪文件没有纳入本工单提交 建议验收:保持手机与电脑同一 Wi-Fi,关闭并重新打开 Client,不点击“搜索”,确认 Android 设备表自动出现并勾选已保存设备。工单保持开启,用户验收后再关闭并同步 #1、#2。
ila closed this issue 2026-08-07 15:21:08 +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#26