4.4 KiB
4.4 KiB
149 Client:内置指定 ADB 并统一运行路径和缺失提示
- 类型:需求
- 父级大工单:#1
- 所属 MVP / 版本:#2 / Client 可运行任务闭环
- 状态:已完成,待用户验收
- 日期:2026-08-11
- Gitea 工单:#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.pyC:/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。
相关提交
8f2037dfeat: 内置并统一使用项目 ADB (#149)