Client 领取任务后,到 Android 设备打开拼多多商品链接通常需要十几秒。当前缺少统一的分阶段耗时数据,无法判断主要时间消耗来自 Admin 请求、本地保存、ADB 检查、uiautomator2.connect()、PDD 前台检查、app_wait()、open_url(),还是首次控件树读取。
uiautomator2.connect()
app_wait()
open_url()
现有调用链还可能重复执行等价的设备和应用状态检查。应先建立可比较的基线,再做不改变线程架构和采购安全行为的低风险去重,避免直接引入长生命周期会话后仍无法证明收益。
app_current()
dump_hierarchy()
uiautomator2.Device
pdd_data
time.monotonic()
time.perf_counter()
预计修改文件(Codex 实施前须按实际代码再次确认):
client/src/task_dispatcher.py
client/src/pdd_device_service.py
client/src/pdd_collect_service.py
client/src/pdd_u2_purchase_adapter.py
docs/client/
从 client/ 目录执行:
client/
C:/Python310/python.exe -m unittest discover -s test -p "test_*.py"
真机验证:
状态:待实施。本工单交给 Codex 按正文方案实施;本轮仅完成建单与父工单回填,未修改代码、未提交 Git。#110 必须依据本工单的真机耗时数据决定是否进入实施。
开始实施。代码确认的重复点为:PddDeviceService.connect() 已调用一次 app_current() 校验设备,采集和采购打开商品页时又立即调用;PDD 已在前台时仍固定调用 app_wait()。本次将复用同一设备会话刚取得的应用状态,并仅在本轮确实启动 PDD 后执行前台等待。显式 ADB 连接检查当前每轮只有一次,予以保留并计时,不会为了性能删除新鲜连接校验。
PddDeviceService.connect()
计时采用单调时钟和白名单 JSONL 事件,只包含 task_id、稳定操作名、毫秒耗时和结果分类;不记录 URL、控件树、异常正文或任何凭据。设备、商品页、验证码/风控/登录及采购安全门禁保持不变,真实下单默认开关不变。
同一台 Wi-Fi ADB 设备、同一商品页完成 5 次冷启动和 5 次热启动;只启动/停止 PDD、打开链接和读取控件树,未点击规格、下单或付款。以下单位均为毫秒(中位数 / P95):
说明:商品页就绪包含首次控件树,端到端又包含所有阶段,嵌套区间不能直接相加。该 OPPO/ColorOS 设备即使 PDD 已在屏幕前台,app_current() 仍可能报告系统设置页,因此热启动测量中的“启动或等待”仍约 0.9 秒;代码继续保留控件树包名兜底和安全页识别。
结论:原调用链相邻执行两次 app_current(),本次复用设备会话首次结果后,按热启动中位数预计直接减少约 10.58 秒。优化后剩余 uiautomator2.connect() 中位数仅 203 毫秒,约占端到端 1.4%;跨任务持久 Device 会话仍须逐任务检查应用和页面,不能安全省掉 10.58 秒的状态检查。因此 #110 当前判定 No-Go:未达到 2 秒或 20% 门槛。后续若继续优化,应独立研究这台设备 app_current() 的 10 秒延迟和焦点误报,不应先引入长生命周期会话。
ba0706d
perf: 量化商品页打开耗时并去重检查 (#109)
29b4491
docs: 归档任务 #109
docs/task/109-量化领取到商品页耗时并消除重复设备检查.md
OK
py_compile
git diff --check
未验证部分已写入归档:未用 10 条真实 Admin 任务验证完整日志;真机未主动触发验证码/风控/登录失效;离屏窗口立即关闭存在既有在线更新 Worker 迟到回调警告。
本工单保持开启等待用户验收;它属于 MVP 后续,不更新 #2。用户验收通过后再关闭并同步父级 #1。
用户已于 2026-08-11 明确验收通过。
eca9289
No dependencies set.
The note is not visible to the blocked user.
基本信息
要解决什么
Client 领取任务后,到 Android 设备打开拼多多商品链接通常需要十几秒。当前缺少统一的分阶段耗时数据,无法判断主要时间消耗来自 Admin 请求、本地保存、ADB 检查、
uiautomator2.connect()、PDD 前台检查、app_wait()、open_url(),还是首次控件树读取。现有调用链还可能重复执行等价的设备和应用状态检查。应先建立可比较的基线,再做不改变线程架构和采购安全行为的低风险去重,避免直接引入长生命周期会话后仍无法证明收益。
做什么 / 不做什么
做
uiautomator2.connect();app_current();open_url();dump_hierarchy();app_current()结果;app_wait();不做
uiautomator2.Device或修改 Worker/QThread 生命周期。pdd_data。已确认的实现方案
time.monotonic()或time.perf_counter(),避免系统时间调整影响结果。app_current()、app_wait()和相邻 ADB 检查做最小去重。uiautomator2.connect()+ 可避免的重复设备/应用检查”的中位耗时不少于 2 秒,或占领取后到商品页就绪总耗时的 20% 以上,则进入持久会话工单;否则先优化实际占比最高的阶段,不为了复用而复用。预计修改文件(Codex 实施前须按实际代码再次确认):
client/src/task_dispatcher.pyclient/src/pdd_device_service.pyclient/src/pdd_collect_service.pyclient/src/pdd_u2_purchase_adapter.pydocs/client/文档验收标准
验证方式
从
client/目录执行:真机验证:
风险和回退
状态:待实施。本工单交给 Codex 按正文方案实施;本轮仅完成建单与父工单回填,未修改代码、未提交 Git。#110 必须依据本工单的真机耗时数据决定是否进入实施。
开始实施。代码确认的重复点为:
PddDeviceService.connect()已调用一次app_current()校验设备,采集和采购打开商品页时又立即调用;PDD 已在前台时仍固定调用app_wait()。本次将复用同一设备会话刚取得的应用状态,并仅在本轮确实启动 PDD 后执行前台等待。显式 ADB 连接检查当前每轮只有一次,予以保留并计时,不会为了性能删除新鲜连接校验。计时采用单调时钟和白名单 JSONL 事件,只包含 task_id、稳定操作名、毫秒耗时和结果分类;不记录 URL、控件树、异常正文或任何凭据。设备、商品页、验证码/风控/登录及采购安全门禁保持不变,真实下单默认开关不变。
真机基线与 Go/No-Go
同一台 Wi-Fi ADB 设备、同一商品页完成 5 次冷启动和 5 次热启动;只启动/停止 PDD、打开链接和读取控件树,未点击规格、下单或付款。以下单位均为毫秒(中位数 / P95):
uiautomator2.connect()app_current()open_url()dump_hierarchy()说明:商品页就绪包含首次控件树,端到端又包含所有阶段,嵌套区间不能直接相加。该 OPPO/ColorOS 设备即使 PDD 已在屏幕前台,
app_current()仍可能报告系统设置页,因此热启动测量中的“启动或等待”仍约 0.9 秒;代码继续保留控件树包名兜底和安全页识别。结论:原调用链相邻执行两次
app_current(),本次复用设备会话首次结果后,按热启动中位数预计直接减少约 10.58 秒。优化后剩余uiautomator2.connect()中位数仅 203 毫秒,约占端到端 1.4%;跨任务持久 Device 会话仍须逐任务检查应用和页面,不能安全省掉 10.58 秒的状态检查。因此 #110 当前判定 No-Go:未达到 2 秒或 20% 门槛。后续若继续优化,应独立研究这台设备app_current()的 10 秒延迟和焦点误报,不应先引入长生命周期会话。实施完成,等待用户验收
ba0706dperf: 量化商品页打开耗时并去重检查 (#109)29b4491docs: 归档任务 #109docs/task/109-量化领取到商品页耗时并消除重复设备检查.mdOK、py_compile和git diff --check通过。uiautomator2.connect()中位数 203 ms、占端到端约 1.4%,前置门槛未达到,已回写 No-Go,保持不实施。未验证部分已写入归档:未用 10 条真实 Admin 任务验证完整日志;真机未主动触发验证码/风控/登录失效;离屏窗口立即关闭存在既有在线更新 Worker 迟到回调警告。
本工单保持开启等待用户验收;它属于 MVP 后续,不更新 #2。用户验收通过后再关闭并同步父级 #1。
用户已于 2026-08-11 明确验收通过。
eca9289