Client:内置指定 ADB 并统一运行路径和缺失提示 #149

Closed
opened 2026-08-11 11:46:37 +08:00 by ila · 3 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:#2 / Client 可运行任务闭环
  • 阶段:Windows 打包与 Android 设备运行环境

要解决什么

Client 的设备搜索、连接、USB 转 WiFi 和应用检测目前直接执行系统 PATH 中的 adb。开发机依赖 D:\\Portable\\adb,但用户电脑不一定安装或配置 ADB,打包后行为也可能因系统 ADB 版本不同而变化。

需要把用户指定目录中的必要 ADB 文件纳入 Client 项目和安装包,后续所有 Client ADB 命令只使用项目内的固定可执行文件;运行时检测不到内置 ADB 时,在软件中显示容易关闭的中文错误弹窗并中断本次设备操作。

做什么 / 不做什么

  • 做:从 D:\\Portable\\adb 复制 adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll 到 Client 统一的只读资源目录。
  • 做:记录该来源 ADB 的版本和来源说明;当前文件显示为 ADB 1.0.32,后续升级必须整体替换并重新验证。
  • 做:打包脚本把上述三个文件一起放入发布包,并在构建检查中验证三者都存在。
  • 做:提供一个易懂的统一 ADB 路径解析入口;源码运行和打包运行均返回项目内 ADB 的绝对路径。
  • 做:设备搜索、连接、断开、USB 转 WiFi、PDD 安装检测以及 Client 内正式使用的 ADB 命令全部调用统一入口,不再执行裸命令 adb。
  • 做:启动或首次需要 ADB 时进行只读完整性检查;缺少 adb.exe 或配套 DLL 时,通过 Qt 信号回到主线程,在软件中央显示中文错误弹窗,并中断本次设备搜索、采集或采购。
  • 做:错误信息说明缺少的文件和重新安装建议;弹窗使用明显按钮,容易关闭。
  • 不做:不复制 fastboot.exe、APK、aapt-arm-pie 等本任务不需要的文件。
  • 不做:内置 ADB 缺失时不回退系统 PATH,避免不同电脑执行不同版本。
  • 不做:不改 uiautomator2 业务流程、不绕过 PDD 安全机制、不触发真实采购测试。
  • 不做:不硬编码开发机绝对路径到运行时代码;D:\\Portable\\adb 只作为本次复制来源。

怎么做

  • 建议资源目录为 client/vendor/android-platform-tools/windows/,包含三个运行文件和简短版本/来源说明。
  • 新增小型 ADB 运行时模块,通过项目的 app_dir() 解析源码与 PyInstaller 打包后的资源路径,返回绝对 adb.exe 路径并检查配套 DLL。
  • 修改 client/src/android_device_service.py,所有命令的首项改为统一解析后的绝对路径;相关诊断脚本如属于 Client 正式维护范围,也复用该入口。
  • 修改 client/packaging/build.ps1,明确复制资源并校验 adb.exe 和两个 DLL;避免依赖系统 PATH 或碰巧由其他依赖带入的 ADB。
  • 缺失检测在后台工作开始前完成,后台只返回结构化错误,主线程负责创建并显示 PyQt5 / Fluent 弹窗。
  • 补充路径解析、缺失文件、命令绝对路径和打包内容测试;测试使用临时假文件或 Mock,不启动真实 ADB 服务。

预计修改:

  • client/vendor/android-platform-tools/windows/
  • client/src/android_device_service.py
  • 新增统一 ADB 路径模块(文件名实施时按现有结构确定)
  • client/src/settings_ui_event.py 或现有设备操作错误展示边界
  • client/packaging/build.ps1
  • client/test/ 对应测试
  • 必要的 Client 上手/打包说明

不修改数据库结构和 Admin 接口。

验收标准

  • 项目包含指定来源的 adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll,不包含本任务无关的 fastboot 和 APK。
  • 所有 Client 正式 ADB 子进程命令都以项目内 adb.exe 的绝对路径启动,不依赖 PATH。
  • 清空测试进程 PATH 后,源码模式仍能解析项目内 ADB。
  • 发布包内同时存在 ADB 和两个配套 DLL,打包���本缺任一文件都会失败并指出文件名。
  • 发布包在未安装系统 ADB 的 Windows 环境中可以搜索 USB/WiFi 设备、连接设备、检测 PDD 和执行 USB 转 WiFi。
  • 内置 ADB 或任一配套 DLL 缺失时,不启动系统 ADB、不继续设备操作,并在软件中央显示容易关闭的中文错误弹窗。
  • ADB 缺失不会触发采集、采购或真实下单。
  • 现有 Android 设备相关自动化测试通过。

怎么验证

从 client/ 执行:

C:/Python310/python.exe -m unittest discover -s test -p "test_*android_device*py"
C:/Python310/python.exe -m unittest discover -s test -p "test_*packaging*py"
C:/Python310/python.exe -m py_compile src/android_device_service.py

打包验证:

powershell -ExecutionPolicy Bypass -File packaging/build.ps1

真机验证需单独执行:临时从测试进程 PATH 移除系统 ADB,使用一台 USB Android 设备验证搜索、PDD 检测、转 WiFi、拔线后 WiFi 保持连接。本工单不执行采购和下单。

风险和回退

  • 风险:指定来源为较旧的 ADB 1.0.32,可能与较新 Android 设备或其他正在运行的 ADB Server 不兼容;工单按用户指定版本交付,但必须记录真机验证结果。
  • 风险:只复制 adb.exe 会在部分 Windows 电脑缺 DLL 而启动失败,因此三个文件必须作为整体处理。
  • 风险:二进制文件增加仓库和发布包体积;提交前应记录文件哈希和来源,不把外部绝对路径写进运行时配置。
  • 回退:恢复统一入口前的版本并移除项目内二进制;若仅版本不兼容,应整体替换三个文件,不允许临时回退系统 PATH。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:#2 / Client 可运行任务闭环 - 阶段:Windows 打包与 Android 设备运行环境 ## 要解决什么 Client 的设备搜索、连接、USB 转 WiFi 和应用检测目前直接执行系统 PATH 中的 `adb`。开发机依赖 `D:\\Portable\\adb`,但用户电脑不一定安装或配置 ADB,打包后行为也可能因系统 ADB 版本不同而变化。 需要把用户指定目录中的必要 ADB 文件纳入 Client 项目和安装包,后续所有 Client ADB 命令只使用项目内的固定可执行文件;运行时检测不到内置 ADB 时,在软件中显示容易关闭的中文错误弹窗并中断本次设备操作。 ## 做什么 / 不做什么 - 做:从 `D:\\Portable\\adb` 复制 `adb.exe`、`AdbWinApi.dll`、`AdbWinUsbApi.dll` 到 Client 统一的只读资源目录。 - 做:记录该来源 ADB 的版本和来源说明;当前文件显示为 ADB 1.0.32,后续升级必须整体替换并重新验证。 - 做:打包脚本把上述三个文件一起放入发布包,并在构建检查中验证三者都存在。 - 做:提供一个易懂的统一 ADB 路径解析入口;源码运行和打包运行均返回项目内 ADB 的绝对路径。 - 做:设备搜索、连接、断开、USB 转 WiFi、PDD 安装检测以及 Client 内正式使用的 ADB 命令全部调用统一入口,不再执行裸命令 `adb`。 - 做:启动或首次需要 ADB 时进行只读完整性检查;缺少 `adb.exe` 或配套 DLL 时,通过 Qt 信号回到主线程,在软件中央显示中文错误弹窗,并中断本次设备搜索、采集或采购。 - 做:错误信息说明缺少的文件和重新安装建议;弹窗使用明显按钮,容易关闭。 - 不做:不复制 `fastboot.exe`、APK、`aapt-arm-pie` 等本任务不需要的文件。 - 不做:内置 ADB 缺失时不回退系统 PATH,避免不同电脑执行不同版本。 - 不做:不改 uiautomator2 业务流程、不绕过 PDD 安全机制、不触发真实采购测试。 - 不做:不硬编码开发机绝对路径到运行时代码;`D:\\Portable\\adb` 只作为本次复制来源。 ## 怎么做 - 建议资源目录为 `client/vendor/android-platform-tools/windows/`,包含三个运行文件和简短版本/来源说明。 - 新增小型 ADB 运行时模块,通过项目的 `app_dir()` 解析源码与 PyInstaller 打包后的资源路径,返回绝对 `adb.exe` 路径并检查配套 DLL。 - 修改 `client/src/android_device_service.py`,所有命令的首项改为统一解析后的绝对路径;相关诊断脚本如属于 Client 正式维护范围,也复用该入口。 - 修改 `client/packaging/build.ps1`,明确复制资源并校验 `adb.exe` 和两个 DLL;避免依赖系统 PATH 或碰巧由其他依赖带入的 ADB。 - 缺失检测在后台工作开始前完成,后台只返回结构化错误,主线程负责创建并显示 PyQt5 / Fluent 弹窗。 - 补充路径解析、缺失文件、命令绝对路径和打包内容测试;测试使用临时假文件或 Mock,不启动真实 ADB 服务。 预计修改: - `client/vendor/android-platform-tools/windows/` - `client/src/android_device_service.py` - 新增统一 ADB 路径模块(文件名实施时按现有结构确定) - `client/src/settings_ui_event.py` 或现有设备操作错误展示边界 - `client/packaging/build.ps1` - `client/test/` 对应测试 - 必要的 Client 上手/打包说明 不修改数据库结构和 Admin 接口。 ## 验收标准 - [ ] 项目包含指定来源的 `adb.exe`、`AdbWinApi.dll`、`AdbWinUsbApi.dll`,不包含本任务无关的 fastboot 和 APK。 - [ ] 所有 Client 正式 ADB 子进程命令都以项目内 `adb.exe` 的绝对路径启动,不依赖 PATH。 - [ ] 清空测试进程 PATH 后,源码模式仍能解析项目内 ADB。 - [ ] 发布包内同时存在 ADB 和两个配套 DLL,打包���本缺任一文件都会失败并指出文件名。 - [ ] 发布包在未安装系统 ADB 的 Windows 环境中可以搜索 USB/WiFi 设备、连接设备、检测 PDD 和执行 USB 转 WiFi。 - [ ] 内置 ADB 或任一配套 DLL 缺失时,不启动系统 ADB、不继续设备操作,并在软件中央显示容易关闭的中文错误弹窗。 - [ ] ADB 缺失不会触发采集、采购或真实下单。 - [ ] 现有 Android 设备相关自动化测试通过。 ## 怎么验证 从 `client/` 执行: ```powershell C:/Python310/python.exe -m unittest discover -s test -p "test_*android_device*py" C:/Python310/python.exe -m unittest discover -s test -p "test_*packaging*py" C:/Python310/python.exe -m py_compile src/android_device_service.py ``` 打包验证: ```powershell powershell -ExecutionPolicy Bypass -File packaging/build.ps1 ``` 真机验证需单独执行:临时从测试进程 PATH 移除系统 ADB,使用一台 USB Android 设备验证搜索、PDD 检测、转 WiFi、拔线后 WiFi 保持连接。本工单不执行采购和下单。 ## 风险和回退 - 风险:指定来源为较旧的 ADB 1.0.32,可能与较新 Android 设备或其他正在运行的 ADB Server 不兼容;工单按用户指定版本交付,但必须记录真机验证结果。 - 风险:只复制 `adb.exe` 会在部分 Windows 电脑缺 DLL 而启动失败,因此三个文件必须作为整体处理。 - 风险:二进制文件增加仓库和发布包体积;提交前应记录文件哈希和来源,不把外部绝对路径写进运行时配置。 - 回退:恢复统一入口前的版本并移除项目内二进制;若仅版本不兼容,应整体替换三个文件,不允许临时回退系统 PATH。
Author
Owner

状态:进行中。

已核对来源目录:三个运行文件齐全,adb.exe version 为 1.0.32,并已记录 SHA-256。实现将同时设置 ADBUTILS_ADB_PATH,这样直接 subprocess 命令和 uiautomator2/adbutils 都使用项目内同一个 ADB;缺失时启动弹窗提示且不回退 PATH。

状态:进行中。 已核对来源目录:三个运行文件齐全,`adb.exe version` 为 1.0.32,并已记录 SHA-256。实现将同时设置 `ADBUTILS_ADB_PATH`,这样直接 subprocess 命令和 uiautomator2/adbutils 都使用项目内同一个 ADB;缺失时启动弹窗提示且不回退 PATH。
Author
Owner

状态:已完成,待验收。

实现提交:8f2037d
归档提交:2a3224b
归档:docs/task/149-内置并统一使用项目ADB.md

验证结果:相关 144 项测试、语法检查、清空 PATH 的 adbutils 路径检查和 0.1.0 实际打包均通过;发布目录内三个 ADB 文件哈希与来源一致。未执行 adb devices、USB 转 Wi-Fi 和 uiautomator2 真机连接,避免重启当前 ADB Server 导致现有 Wi-Fi 设备临时掉线。

状态:已完成,待验收。 实现提交:`8f2037d` 归档提交:`2a3224b` 归档:`docs/task/149-内置并统一使用项目ADB.md` 验证结果:相关 144 项测试、语法检查、清空 PATH 的 adbutils 路径检查和 0.1.0 实际打包均通过;发布目录内三个 ADB 文件哈希与来源一致。未执行 `adb devices`、USB 转 Wi-Fi 和 uiautomator2 真机连接,避免重启当前 ADB Server 导致现有 Wi-Fi 设备临时掉线。
Author
Owner

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:ad44f83。现关闭工单。

用户于 2026-08-13 明确验收通过。本地归档状态已更新,批量验收记录提交:`ad44f83`。现关闭工单。
ila closed this issue 2026-08-13 15:57:59 +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#149