Files
cmautobuy/docs/task/149-内置并统一使用项目ADB.md
T

69 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 149 Client:内置指定 ADB 并统一运行路径和缺失提示
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:#2 / Client 可运行任务闭环
- 状态:已完成,用户验收通过
- 日期:2026-08-11
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/149
## 背景与目标
Client 原来直接执行系统 `Path` 中的 `adb`,开发机和发布电脑可能使用不同版本或找不到命令。本任务把用户指定的 ADB 和两个配套 DLL 纳入项目,后续直接 ADB 与 uiautomator2 都使用同一项目文件;文件缺失时中断设备操作并弹窗提示。
## 最终方案
- 从 `D:\Portable\adb` 复制 `adb.exe`、`AdbWinApi.dll`、`AdbWinUsbApi.dll` 到 `client/vendor/android-platform-tools/windows/`,记录版本 1.0.32 和三个 SHA-256。
- 增加 `adb_runtime.py`,通过 `app_dir()` 返回源码或 PyInstaller 资源目录中的绝对路径,统一检查三个文件。
- 直接 subprocess ADB 命令全部使用绝对路径;设置 `ADBUTILS_ADB_PATH`,强制 adbutils/uiautomator2 使用同一文件,不回退系统 `Path`。
- 启动时发现文件缺失,在主窗口中央显示只有明显“知道了”按钮的中文弹窗;设置页禁用依赖 ADB 的设备命令,不自动恢复已保存设备。
- 打包脚本显式收集并逐个验证三个文件;诊断工具也改用统一路径。
## 改了哪些
- `client/vendor/android-platform-tools/windows/`:内置 ADB、DLL 和版本哈希说明。
- `client/src/adb_runtime.py`、`client/src/db.py`:统一只读资源路径与完整性检查。
- `client/src/android_device_service.py`:全部命令改用项目 ADB 绝对路径。
- `client/src/pdd_device_service.py`:uiautomator2 连接前固定 adbutils 的 ADB 路径。
- `client/src/settings_ui_event.py`、`client/src/ui_main.py`:缺失时禁用设备命令并显示启动弹窗。
- `client/packaging/build.ps1`:收集并检查三个文件。
- `client/tools/`、`client/test/`:统一诊断路径并增加回归测试。
- `docs/client/`:更新上手、发布结构和界面规则。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 项目只复制三个必要 ADB 运行文件 | 通过 |
| 生产 ADB 子进程使用项目绝对路径 | 通过 |
| 清空 Path 后仍解析项目 ADB | 通过 |
| adbutils/uiautomator2 固定使用同一项目 ADB | 通过 |
| 打包脚本收集并检查 ADB 和两个 DLL | 通过 |
| 实际发布包包含三个同哈希文件 | 通过 |
| 文件缺失时弹窗并禁用设备命令 | 通过(自动化测试) |
| 缺失时不回退系统 Path | 通过 |
| USB/Wi-Fi 真机操作 | 未验证 |
## 测试
- 执行的命令:
- `C:/Python310/python.exe -m py_compile src/adb_runtime.py src/db.py src/android_device_service.py src/pdd_device_service.py src/settings_ui_event.py src/ui_main.py tools/measure_goods_open.py tools/test_pdd_home_deeplink.py`
- `C:/Python310/python.exe -m unittest discover -s test -p "test_adb_runtime.py"`
- `C:/Python310/python.exe -m unittest discover -s test -p "test_android_device_service.py"`
- `C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_device_service.py"`
- `C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_home_deeplink.py"`
- `C:/Python310/python.exe -m unittest discover -s test -p "test_packaging.py"`
- `$env:QT_QPA_PLATFORM='offscreen'; C:/Python310/python.exe -m unittest discover -s test -p "test_settings_ui_event.py"; C:/Python310/python.exe -m unittest discover -s test -p "test_pdd_ui_event.py"`
- 清空测试进程 `Path` 后调用 `configure_bundled_adb_environment()` 并核对 `adbutils.adb_path()`。
- `powershell -ExecutionPolicy Bypass -File packaging/build.ps1 -SkipInstall`
- 结果:相关测试共 144 项全部通过,语法检查和 0.1.0 实际打包通过;发布目录中三个文件哈希与来源一致。PyInstaller 输出已有的 uiautomator2 扩展和 `sip` 收集警告,但构建成功。
- **没验证到的部分**:没有运行项目 ADB 的 `devices`、USB 转 Wi-Fi 或 uiautomator2 真机连接,避免重启当前 ADB Server 后让已连接的 Wi-Fi 设备临时掉线;没有人工删除打包文件观察真实弹窗外观。
## 遗留问题
- 用户指定 ADB 为较旧的 1.0.32。若新 Android 设备出现兼容问题,应整体升级三个文件并重新验证,不能临时回退系统 `Path`。
## 相关提交
- `8f2037d` feat: 内置并统一使用项目 ADB (#149)