1
T-101
ila edited this page 2026-08-07 16:36:23 +08:00

同步来源:docs/tasks/T-101.md · commit afc651f75a3a


id: T-101 title: 固定任务跑通拼多多关键词搜索 phase: 1 deps:

  • T-002
  • T-003 status: DONE created: 2026-07-25 context_ref: 1c1c158149 work_branch: main write_paths:
  • android-buyer/app/build.gradle.kts
  • android-buyer/app/src/main/java/com/roubao/autopilot/MainActivity.kt
  • android-buyer/app/src/main/java/com/roubao/autopilot/accessibility/**
  • android-buyer/app/src/main/java/com/roubao/autopilot/pinduoduo/**
  • android-buyer/app/src/main/java/com/roubao/autopilot/ui/screens/SearchProbeScreen.kt
  • android-buyer/app/src/main/java/com/roubao/autopilot/workflow/**
  • android-buyer/app/src/test/java/com/roubao/autopilot/pinduoduo/**
  • android-buyer/app/src/test/java/com/roubao/autopilot/workflow/WorkflowRunnerTest.kt
  • docs/00-ai-start-here.md
  • docs/02-requirements.md
  • docs/03-tech-stack.md
  • docs/04-architecture.md
  • docs/05-coding-rules.md
  • docs/current-state.md
  • docs/tasks/T-101.md
  • progress.md

问题 / 背景

Phase 0 已证明设备、无障碍、workflow 和任务输入可用,但尚未让肉包执行任何真实 拼多多动作。最高风险假设是:在拼多多 8.17.0 上,能否只依赖可访问性语义稳定打开 搜索、输入固定关键词并确认进入结果页,同时对异常页面安全停止。

关联需求与交互

  • 功能:F-004 的关键词搜索部分、F-007 安全失败。
  • 用户故事:US-004、US-006。
  • 交互:Android“探针”页,用户显式点击开始和停止。
  • 架构:WorkflowRunner + PinduoduoSearchAutomation + 无障碍 driver。

方案

  1. 使用固定脱敏关键词,不读取真实订单标题,也不调用 VLM。
  2. 把页面文本分类和搜索 workflow adapter 保持为纯 Kotlin 可测边界。
  3. 无障碍 driver 只对 com.xunmeng.pinduoduo 操作,使用 resource ID、editable、 文本和 content description,不使用屏幕坐标。
  4. 步骤为打开 App、进入搜索、输入并提交、验证结果页;每步有 timeout 和最多一次 retry。
  5. 登录、验证码、风控、支付边界立即 BLOCKED;未知页面连续观察后安全停止。
  6. Android“探针”页展示当前步骤、终态和停止按钮;不执行商品点击或下单。

验收要点

  • 用户显式点击后打开拼多多并提交固定关键词。
  • 成功条件是识别到搜索结果页,不以“点击已发出”冒充成功。
  • 全流程不用坐标,不进入商品详情、不提交订单、不支付。
  • 登录、验证码、风控、未知页和支付边界产生可区分的 BLOCKED。
  • 每步 timeout、retry 和用户停止由 T-003 runner 执行。
  • 页面分类和 adapter 使用 Fake driver 有自动化测试。
  • 拼多多 8.17.0 真机 smoke 通过并保存不含私有内容的证据。
  • lintDebug test assembleDebug 通过。

边界

  • 不从真实 Shopee 标题生成搜索词;固定词只验证页面自动化。
  • 不浏览候选、不点击商品、不滚动结果列表。
  • 不使用 Shizuku shell、ADB 坐标、OCR 或 VLM 作为降级。
  • 不绕过登录、验证码、风控或平台提示。

执行记录

2026-07-25:任务开始

  • 基于 T-004 提交 1c1c158 开始。
  • 测试基线为 OnePlus PKG110、Android 16/API 36、拼多多 8.17.0;肉包采购无障碍 已启用并连接。

2026-07-25:实现

  • 增加纯 Kotlin 页面分类器和 PinduoduoSearchAutomation。页面节点必须同时可见、 启用并唯一匹配;结果页必须同时出现精确固定关键词、搜索头和至少 3 个排序控件。
  • 增加 Android 无障碍 driver。打开搜索只点击语义节点或其可点击祖先,输入只使用 ACTION_SET_TEXT,并从新的根节点重新读取精确文本后才算成功;没有坐标或 shell 降级。
  • workflow 固定执行打开 App、输入、提交和验证四步,沿用 T-003 的 timeout、有限 retry、停止和单实例约束。登录、验证码、风控、未知页面及订单/支付边界直接阻塞。
  • 新增“拼多多搜索探针”默认工作页,显示固定词、当前步骤、终态和开始/停止操作。 Activity 恢复后延迟复检无障碍连接,避免系统服务晚连接造成按钮状态滞后。
  • 修正 Debug fixture 资产与 lint model 的 Gradle 任务依赖,使完整验证不受增量任务 顺序影响。

2026-07-25:自动化验证

  • gradlew.bat lintDebug test assembleDebug --no-daemon 成功。
  • App Debug/Release、task contract 和导入器共 12 份报告、62 次测试,0 failure、 0 error、0 skipped。
  • 页面分类覆盖首页、输入页、精确结果页、隐藏/禁用伪节点以及登录、验证码、风控、 未知页和订单/支付边界;Fake driver 覆盖成功、瞬态 retry 和安全阻塞。
  • 普通 Debug APK 中 assets/probe-fixtures/ 条目数为 0。

2026-07-25:真机 smoke

  • 从肉包“开始搜索探针”按钮显式启动;App 使用固定脱敏词执行,未读取或显示私有 蝦皮样本。
  • 拼多多 8.17.0 结果页采集到 174 个可访问节点:精确关键词存在、结果页搜索头存在、 4 个排序控件存在、搜索输入框为 0、订单/支付边界为 0。
  • ACTION_SET_TEXT 后的新根节点精确回读通过,肉包最终显示 SUCCEEDED 且四步均 完成;logcat 未发现肉包崩溃或 ANR。
  • smoke XML/PNG 只保存在被忽略的 .local/t101-smoke/,未纳入 Git。重装后 ColorOS 出现一次系统无障碍“保持开启”确认,确认后服务正常绑定;产品代码没有绕过该权限。

后续

  • T-102 从当前结果页浏览并采集最多 5 个候选;仍不得无界滚动、点击下单或支付。
  • 从不属于已识别首页/输入页/当前固定词结果页的状态启动时,当前实现按 UNKNOWN_PAGE 安全阻塞,不猜测返回路径。