fix(APK 安装): 「推送不完整」是误报——adb 退出 ≠ 设备写完

用户报:安装 APK 显示「推送不完整(设备 3605447 / 本地 5933150 字节)」。

排查(220 现场 + 复现):这不是传输失败,是**检查时机太早**。
`adb exec-in` 把数据交给设备侧(adbd → shell → `cat >`)后,缓冲里的数据还在继续落盘:
同一份 5.9MB 的 APK,adb 刚返回时 stat 读到 3710967,紧接着 4264448,几秒后才是完整的
5933150(逐步实测)。旧实现只量一次就判失败,于是同一份文件在多台设备上"失败"了 8 次,
断点各不相同(2.7M/3.3M/3.6M/3.9M)—— 典型误报指纹。

修法(core/apk_manager.py):
- 新增 `_wait_remote_size()`:收尾**轮询**设备文件大小直到长齐(默认最长 20s);
  stat 取不到(机型差异)时返回 None,照旧跳过校验,不误报。
- 只有真不齐才退回 `adb push` 重传(原来直接判失败)。
- `_push_fallback` 也补一次大小校验:adb push 虽同步,但设备空间不足/被并发覆盖时
  "1 file pushed" 也可能是残缺的。

影响:这个误报不只是显示难看——它会让整台设备的安装直接失败(明明是好的包)。
This commit is contained in:
2026-09-14 09:08:37 +08:00
parent 5dc15e128e
commit 615f9cf0d5
2 changed files with 46 additions and 6 deletions
+6
View File
@@ -577,6 +577,12 @@
> 1. **推送到设备**:`推送中 62%(211.0/336.1 MB · 2.6 MB/s · 剩约 48s)` —— 用分块写
> (`adb exec-in`)拿字节级进度;不用 `adb push` 是因为它只在结束时吐一行汇总,
> 大包(抖音 336MB≈2 分钟)整个传输过程界面上只能干等
> ⚠️ **`adb exec-in` 返回 ≠ 设备上写完**:数据还在设备侧(adbd → shell → `cat >`)缓冲里
> 继续落盘。所以收尾必须**轮询文件大小直到长齐**(`_wait_remote_size`,最长 20s),
> 量一次就判"推送不完整"会把成功的传输误报成失败(2026-09-14 的真实案例:同一份
> 5.9MB 的 APK 在多台设备上报了 8 次假失败,实际文件最终都是完整的)。真不齐才退回
> `adb push` 重传。
> 2. **设备上安装**:`正在设备上安装...(大包要 1-2 分钟,无进度可读)` —— `pm install`
> 在设备端解包,系统没给进度接口
>