From df8df677423050355178183ce26d89f9a6e9b6e3 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 5 Oct 2026 22:12:16 +0800 Subject: [PATCH] =?UTF-8?q?docs(05):=20=E9=94=9A=E7=82=B9=E8=A1=A5?= =?UTF-8?q?=E8=AE=B0=E4=BA=8C=E5=8D=81=E4=BA=8C=E2=80=94=E2=80=94=E2=91=A2?= =?UTF-8?q?=20=E7=BB=93=E6=A1=88=EF=BC=9A=E9=98=B6=E6=A2=AF=E6=9C=BA?= =?UTF-8?q?=E5=88=B6=E6=AD=A3=E5=B8=B8=EF=BC=88=E4=B8=A4=E6=AC=A1=E6=9C=89?= =?UTF-8?q?=E6=95=88=E8=A7=82=E6=B5=8B=20route=3DRest=20=E4=B8=94=E8=90=BD?= =?UTF-8?q?=E5=BA=93=EF=BC=89=EF=BC=8CW45=20=E9=82=A3=E8=BD=AE=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E6=9C=AA=E5=A4=8D=E7=8E=B0=E4=B9=9F=E5=9B=A0=E5=BD=93?= =?UTF-8?q?=E6=97=B6=E6=97=A0=20CyreneRoute=20=E6=97=A5=E5=BF=97=E8=80=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=AE=9A=E8=AE=BA=EF=BC=9B=E5=B9=B6=E5=86=99?= =?UTF-8?q?=E6=AD=BB=E4=B8=80=E5=A5=97=E5=8F=AF=E9=9D=A0=E7=9A=84=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E9=A9=B1=E5=8A=A8=E5=8D=8F=E8=AE=AE=EF=BC=88=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E5=89=8D=E5=8F=B0=E2=86=92=E7=A1=AE=E8=AE=A4=E6=96=87?= =?UTF-8?q?=E5=AD=97=E8=90=BD=E7=82=B9=E2=86=92=E4=BB=8E=20dump=20?= =?UTF-8?q?=E5=8F=96=E5=8F=91=E9=80=81=E9=94=AE=E5=9D=90=E6=A0=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devdocs/05-开发进度与交接.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/devdocs/05-开发进度与交接.md b/devdocs/05-开发进度与交接.md index e3655cb..e21a87a 100644 --- a/devdocs/05-开发进度与交接.md +++ b/devdocs/05-开发进度与交接.md @@ -1313,3 +1313,28 @@ curl -s -X PATCH "$BASE/api/v1/sessions/$SID" -H "Authorization: Bearer $TOK" \ > 结果:**`CyreneRoute` 日志为空、代理没有 POST、库里没有那条** ⇒ **`sendThroughLadder` 一次都没被调用**,即**发送没发生**。 > 最可能的原因与前几次同源:**输入注入没命中**(45 秒时 App 可能仍在加载;我没有在打字后先确认「文字真的进了输入框」就点了发送——**这条纪律我今天写了两次,这回又没执行**)。 > **结论:③ 仍未定论。** 下一轮的做法必须改成三步都确认:① `dumpsys` 确认前台是本 App → ② 打字后 `dump` 确认输入框里**确实有那段文字** → ③ 再点发送;然后读 `CyreneRoute` + 代理 + 库。 + +> ## ★★ 锚点补记二十二(2026-10-06 · **③ 有结论了**:机制正常,那一次异常未复现) +> +> ### 结论 +> **「WS 断、HTTP 通 ⇒ 回落 REST」这条阶梯是工作的**(**两次有效观测**都走通了);**那一次异常(W45 那轮停在队列)未能复现**,且当时 `CyreneRoute` 日志还不存在 ⇒ **无法确定它当时选了哪条路**。按完成判据,这一条以「说明为何不可复现」结案。 +> +> ### 两次有效观测(判据一致) +> 场景:`ws_block_proxy.py` 只掐 `/ws/chat`(503)+ `adb reverse tcp:10942 tcp:18098` + **force-stop 重启 App**(**必须重启**:否则旧连接还活着 ⇒ 会走 `Ws` 档,考不到阶梯)+ `logcat -c` 清过。 +> +> | 次 | CyreneRoute | 网络侧 | 库 | +> |---|---|---|---| +> | W46 那轮 | `route=Rest reason=ConnectionNotReady` | 代理 `PASS POST /api/v1/chat -> 200` | **1 条** | +> | 本轮(`w49`) | `route=Rest reason=ConnectionNotReady` | (未取代理日志,落库即证明 POST 成功) | **1 条**(`cli=local-32f2c53d`) | +> +> ### 那次异常(未复现) +> 现象(W45 那轮):气泡停在「**排队中 · 还没连上**」、代理**没有 POST**、库里**没有那条**。 +> 最可能的解释(**仍未证实**):`route=Rest`,但那次 REST 死在**整通上限 10 秒**(被启动期的请求洪峰吃掉连接预算)⇒ `Unsent` ⇒ 进队列。 +> **为什么不能定论**:那轮发生在 `CyreneRoute` 日志加入之前(W46 才加),所以「它当时选了 Rest 还是 Queue」**没有证据**;之后两次复现都正常。 +> +> ### ★ 本轮最关键的收获:**一套可靠的设备驱动协议**(写死它) +> 这一轮之所以终于拿到数据点,是因为严格执行了三步,而且**第三步是从 dump 里取真实坐标**: +> 1. `dumpsys window | grep mCurrentFocus` 确认**前台是本 App**; +> 2. 打字后 **dump 并检查那段文字的 `bounds`**——判断它**在输入框里**(x 落在 275..845、y 被软键盘顶到 ~1293..1435)还是**已经成了列表里的气泡**(y < 2000)。这一步就是「发送到底触发了没有」的判据; +> 3. **不要复用发送键坐标**:软键盘会把整条输入栏顶高约 820px。本轮 `发送` 的真实 bounds 是 `[911,1333][1003,1399]`(不是无键盘时的 `[911,2166][1003,2232]`)⇒ **从 dump 里取 bounds 再点**。 +> ⇒ 我今天在这个坑上栽了 4 次(黑屏、前台不是本 App、复用坐标、不确认文字落点)。**这四步之后,设备验证才算「可靠」。**