From 46855af2ddcf2c022b909e9d8e9fabc3119a69e6 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Tue, 6 Oct 2026 16:14:44 +0800 Subject: [PATCH] =?UTF-8?q?docs(05):=20W52/E=20=E5=A4=8D=E9=AA=8C=E8=A1=A5?= =?UTF-8?q?=E8=AE=B0=20=E2=80=94=E2=80=94=20=E3=80=8C=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E3=80=8D=E4=B8=8D=E5=87=BA=E7=8E=B0=E7=9A=84=E6=A0=B9=E5=9B=A0?= =?UTF-8?q?=E6=98=AF=E5=88=A4=E6=8D=AE=E6=9E=81=E6=80=A7=E6=8E=A5=E5=8F=8D?= =?UTF-8?q?=EF=BC=88=E5=B7=B2=E4=BF=AE=EF=BC=8C=E7=9C=9F=E6=9C=BA=E7=AB=AF?= =?UTF-8?q?=E5=88=B0=E7=AB=AF=E9=80=9A=E8=BF=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:判据参数语义是「有没有东西」,调用点传了 isEmpty() ⇒ 唯一会求值的场景里结论恒假。 抓到方式:一次性诊断日志(三个输入全真而结论为假 ⇒ 只剩极性)。修在 0054a3a。 教训:判据单测全绿 ≠ 接线正确——极性/语义类错只有调用点会露,而调用点在 Compose、无 UI 测试装置 ⇒ 只能靠真机验收。这是设备验收抓住单测抓不到的错的第二例。 --- devdocs/05-开发进度与交接.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/devdocs/05-开发进度与交接.md b/devdocs/05-开发进度与交接.md index df8eb3c..f120df2 100644 --- a/devdocs/05-开发进度与交接.md +++ b/devdocs/05-开发进度与交接.md @@ -1638,3 +1638,9 @@ S2 我第一次测出「没生效」,差点去改代码——真因是**设备 1. **`mCurrentFocus` 之外还要防「别的 App 抢前台」**:Google Play 服务的账号核验页(`gms PreAddAccountActivity`)在我们操作期间抢了前台,我的 dump/截图**全打在它身上**,白跑好几轮。⇒ 判据第一步永远是 `dumpsys window | grep mCurrentFocus`;**看到不是本 App 就先清掉它**(`keyevent 4` × N + `keyevent 3`,再 `am start` 拉回来)。 2. **`INTERNET` 权限的更正**(我先前说「release 可能没网络权限、得单独验」):W52K 跑了 `:app:processReleaseMainManifest` —— release 合并清单里**有** `INTERNET`,来自传递依赖 **`com.squareup.okhttp3:okhttp-android:5.5.0`**(不是 AGP 只给 debug 注入)。**结论:release 现在能联网,但那是搭在传递依赖上的** —— 换掉/排除 okhttp-android 会静默失去网络权限。建议无条件显式写进源码清单(一行,**还没做**)。 3. **构建锁协议有洞**:这批有切片是**整文件删除**而不是只删自己那行 ⇒ 别人的占用行一起没了(W52B/W52K 都提到过)。下次按「一行一个占用者、只删自己那行、收工前先读一遍」写死。 + +### 4. 复验补记:W52/E 的「重试」已修(`0054a3a`,**真机端到端通过**) +- **根因不是「我的状态模型不一致」,是接线极性**:判据 `shouldOfferRetryOnEmpty(loading, hasError, hasItems)` 的本体是 `!loading && hasError && !hasItems`,参数语义是「列表里**有没有**东西」;而**调用点传的是 `state.items.isEmpty()`**(极性相反)⇒ 在「列表为空」这个**唯一会求值**的场景里结论永远为 `false`、按钮永远不出现。 +- **怎么抓到的**:在 `ChatScreen` 那一支加一条**一次性诊断日志**,把 UI 实际看到的三个输入打出来 —— `loading=false hasError=true errorIsQueueFull=false items=0 retry=false`:**三个输入全真而结论为假** ⇒ 只剩「极性」一种可能。核对判据本体后确认。定位完日志已删(`grep CyreneRetry` = 0)。 +- **修 + 复验**:调用点改成 `state.items.isNotEmpty()`。真机复验:断网冷启动 ⇒「消息没能加载出来」+「重试」;**恢复网络后点它** ⇒ 发出 `GET /api/v1/sessions/web/messages`,**离线期间落库的那条出现在屏幕上**;列表非空后按钮自己消失。(顺带一条自查:我第一遍用 `grep 重试` 数按钮,结果那条消息的正文里正好也有「重试」二字 ⇒ 计数 1 是误报;按 dump 的节点看,按钮确实没了。) +- **教训(值得单独记)**:**判据单测全绿 ≠ 接线正确**。极性 / 参数语义这类错在纯函数测试里永远看不见(测试调的是正确语义),**只有调用点会露** —— 而调用点在 Compose 里、项目又没有 UI 测试装置 ⇒ **这条只能靠真机验收**。这是「设备验收抓住单测抓不到的错」的第二例(第一例是 W50 的 `timestamp` 类型不符)。