Files
ring-health-app/docs/verification-m1.md
T
cuiluzhengandClaude Code 9c233e5750 docs: 补充 M1 验收记录与页面清单
Task 14 收尾(几乎不含生产代码改动):

- 清扫三条孤儿字符串:`placeholder_workout_history` / `placeholder_device_settings` /
  `placeholder_metric_detail`。grep 全 `app/src` 确认三者均无调用点后删除;
  顺带逐条核对了 `strings.xml` 其余字符串,除 manifest 引用的 `app_name` 外全部有调用点,
  未发现别的漏接线(不是顺手一起删,是先查清才决定)。
- 按 ledger R31,给 `MockRingDeviceRepository.setFunctionEnabled` 补中文 KDoc,
  写明「必须返回新列表」及其原因(`DeviceViewModel.stateIn(initialValue=…)` 在构造时
  冻结 List 引用,原地改写会让 `DeviceViewModelTest` 第一条用例退化成自我确认)。

验证:`./gradlew :app:testDebugUnitTest` 21 项全绿(FormattersTest 7 + MockDataProviderTest 5
+ HomeViewModelTest 1 + WorkoutViewModelTest 1 + DeviceViewModelTest 2 +
MetricDetailViewModelTest 3 + RoutesTest 2);`./gradlew clean assembleDebug` BUILD SUCCESSFUL,
产物 app-debug.apk(18,907,329 字节)。

新增 `docs/verification-m1.md` 记录 M1 验收。**人工验收全表标注「未执行 —— 无设备」**:
本机无模拟器镜像、无连接真机(`adb devices` 为空;`~/.android/avd` 下两个 AVD 只是指向
已删除旧 SDK 的空壳,不可启动),IDE Preview 亦无法打开。记录中含覆盖缺口声明:
M1 全部运行时行为目前只有编译期与单元测试保证,`assembleDebug` 成功不代表界面正确或不会崩溃。

README 补 M1 页面清单表,路由与 `core/navigation/Routes.kt` 逐条核对一致;
并核对 `profile_check_update_desc` 的手抄版本号 `0.1.0` 与 build.gradle.kts 的
`versionName` 一致(计划 3682 行交办项)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-10 12:54:40 +08:00

5.9 KiB
Raw Blame History

M1 静态页面验收记录

环境

  • 记录日期:2026-09-10
  • 构建版本:0.1.0 (versionCode 1)
  • 构建机:Windows 11,JDK 17.0.12,Android SDK D:\Android\Sdk(仅 platform-tools / platforms;android-36 / build-tools;36.1.0)
  • 测试设备:无 —— 本机没有安装任何模拟器镜像,也没有连接真机

补充证据(说明「无设备」不是随口一说,而是逐项查过的):

$ ls D:\Android\Sdk
build-tools  cmdline-tools  licenses  platform-tools  platforms
                # 没有 emulator/,也没有 system-images/

$ adb devices
List of devices attached
                # 空列表,没有连接真机

C:\Users\10314\.android\avd\ 下残留着两个 AVD 定义(Medium_Phone_API_36.1、 Pixel_9_Pro),但它们是不可用的空壳:二者都指向已删除的旧 SDK C:\Users\10314\AppData\Local\Android\Sdk(其 emulator\emulator.exe 与 system-images\android-36.1\google_apis_playstore\x86_64\ 均已不存在),且属于另一个项目 (D:\work\xiangmu\mediq-app)。不要因为看到 AVD 目录就以为本机可以起模拟器。 另注:当前 shell 的 ANDROID_HOME 仍指向那个已删除的旧路径,构建实际靠 local.properties 的 sdk.dir=D:\Android\Sdk 生效。

自动化验证(已执行)

  • 单元测试:./gradlew :app:testDebugUnitTest —— 21 项全绿 (FormattersTest 7 + MockDataProviderTest 5 + HomeViewModelTest 1 + WorkoutViewModelTest 1
    • DeviceViewModelTest 2 + MetricDetailViewModelTest 3 + RoutesTest 2)
  • 构建:./gradlew clean assembleDebug —— BUILD SUCCESSFUL, 产物 app/build/outputs/apk/debug/app-debug.apk(18,907,329 字节)
  • 未执行:各页面的 @Preview 在 Android Studio 中渲染。本机没有 IDE GUI,agent 无法打开 Preview 面板,这一项与人工验收一样是未执行的 —— 不要把它写进「已执行」段落 (旧稿把它列在上面这一节里,那等于声称验证过一件没做过的事)。

人工验收(未执行 —— 无设备)

下表全部未打勾。这份清单已原样保留,交给有设备的人执行;不要在没有实测的情况下填入结果。

项 结果 备注
应用启动无崩溃 未执行 无设备
四 Tab 切换 未执行 无设备
重按已高亮的父 Tab 的行为 未执行 需实测:推测会停在子页而非回到 Tab 根
每个页面的 @Preview 可渲染 未执行 需在 Android Studio 中逐个打开确认
次要文字灰度一致 未执行 不得出现 TextSecondary 与 onSurfaceVariant 混用
首页:设备状态条 / 步数大环 8,426 / 六个指标卡(血压“未开启”) 未执行 无设备
指标详情页:周/月切换(7 根 / 30 根柱子) 未执行 无设备
睡眠详情:分期卡片只在睡眠指标出现,入睡/起床读起来像「一晚」 未执行 无设备
运动页 / 运动历史页 未执行 无设备
设备页 / 设备设置开关(返回后状态保持) 未执行 无设备
我的页 未执行 无设备
旋转屏幕、深色系统设置下不崩溃 未执行 无设备

需在有设备时重点确认的项(原清单细目,逐条保留)

  • 应用启动无崩溃,底部四个 Tab 显示为 健康 / 运动 / 设备 / 我的
  • 四个 Tab 可自由切换,切换后状态保留、无闪烁
  • 重按已高亮的父 Tab 的行为:实现为 popUpTo(start){saveState} + restoreState, 推测会恢复到该 Tab 保存的子页栈(停在子页而非回到 Tab 根)。请实测并记录实际行为; 若实测是「停在子页」而产品希望「回到根」,那是一个独立的小改动,记下来即可
  • 首页:步数大环显示 8,426,目标 10,000,环按比例填充
  • 首页:点击任一指标卡进入详情页,标题为该指标中文名
  • 详情页:返回后回到首页
  • 运动页:显示“开始运动”卡片 + 5 条运动记录;「查看全部」进入历史页后底部导航栏仍可见
  • 设备页:戒指卡片显示电量 78%、固件版本 1.0.5
  • 睡眠卡片的入睡/起床时间读起来像「一晚」(如 入睡 22:41 / 起床 06:41),而不是跨好几天。 阶段一按「最后一个数据点往前 8 小时」演示(R29);若显示成跨天,说明 DEMO_SLEEP_WINDOW_MILLIS 那段被改坏了

已知限制(阶段一有意为之)

  • 数据全部为 Mock,不连蓝牙、不连后端
  • 血压恒为“未开启”占位(HealthSummary.bloodPressure = null)
  • 设备设置页的开关只改内存状态,重启即重置(对应 M2 的协议 0502/0504)
  • 睡眠分期条与入睡/起床时间是演示值(固定比例 + 最后一个数据点往前 8 小时),无真实分期数据
  • 详情页统计摘要一律保留一位小数(步数因此显示为「平均 7512.3」这类精度过剩的形式)
  • 仅浅色模式

覆盖缺口声明

M1 的全部运行时行为目前只有编译期与单元测试保证,没有任何一次真机/模拟器运行。 assembleDebug 成功只说明代码能编译、能打包,不说明界面正确、不说明不会崩溃。 这是本机没有设备导致的已知缺口(ledger Ruling R21),不是「已验证通过」。 首次拿到设备时,请从上面那张人工验收表开始逐项补齐。

具体而言,没有任何一行 M1 的 Compose 界面代码被真正渲染过:导航图能否起来、 四个 Tab 是否显示正确文案、MetricBarChart 的柱子数量、RingProgress 的填充比例、 睡眠分期卡片是否只在睡眠指标下出现、次要文字灰度是否统一 —— 这些全部未经运行时检验。 单元测试覆盖的是 Formatters 的纯函数、MockDataProvider 的数据形状,以及七个 ViewModel 的状态流;它们不经过 Compose 渲染管线,也不能发现布局、主题或导航层面的错误。