# STEP-097 A1 Android 专项验收报告 v1 ## 结论及范围 **A1 Android/Core 已完成本轮可执行检查点;iOS/Metal 运行测试按用户决定豁免。** 不将豁免写成实际 Metal PASS。STEP-097 总体仍进行中,A2/B/C 尚待实现和验证;无新软件发布。 - 仓库:`/Users/tei/dev/MapLibreParticleLab`,`particle/main`,源码提交 `8c006ac83d16c2683037f90484fd86fb917a9d78`。Integration `main` 核对 `318f8ccf911ac3136c3086a1d14e61f83e2d4bce`。 - Android/FZG1-2:直接 ADB `192.168.200.139:5555`,非 Win11 虚拟机。APK OpenGL Debug/x86_64,60,311,571 bytes,SHA-256 `48df19cf5a4c4250934efa2596423d3ad9571fe49a65b9b704a81cdb41f58671`。标准脚本编译成功、ZIP/ABI 校验通过;`install -r` 返回 Success,设备安装文件哈希一致。 - 构建记录 `git_dirty=true` 的原因是用户另行放在 `docs/40_任务/` 的未跟踪 STEP-098 MD;本次构建起始及源码提交无 tracked 修改,未将 STEP-098 纳入编译或提交。冻结 `.13` 未修改。 ## 01:同源同 tile Stencil — Android 实测 新入口为 `Step097StencilFixture`,单一 `step097-shared-polygon` GeoJSON tiled source 的四层同一 Polygon,运行中仅改变 R/C 连续 Segment 排列,不改来源、几何及图层视觉参数。 - 实测 RR、RCR、CRR 各两轮,稳定帧、REBUILD CURRENT、CACHE OFF/ON 与再次拓扑切换,共 **18 个检查点**,18 张 1920×1200 PNG 与 18 份 UI XML。 - 所有检查点均 `valid=true`、`fallback=false` 且实际策略序列匹配当前选项;缓存 OFF 时各 R 报告 fallback,ON 后重新构建,拓扑有效不变。代码回归脚本退出码 0;实时日志含 10 条 `STEP097_STENCIL_READY`,没有本次采集范围内的 FATAL/SIGSEGV/SIGABRT。 - 使用 AppKit 对原始 PNG 采样:18 张中心像素全部为 RGB `[193,176,119]`,区域外像素全部为 `[27,49,75]`,中心与区域外有明显差异。两种采样均一致,不以截图文字代替像素核验。 - 以上证明这组固定 same-source scene 在指定采样点和可见完整画面未出现异常;它不是对所有 tile/camera/pitch/zoom 组合的数学证明。 证据在忽略目录 `artifacts/maplibre-particle/step097-a1-fzg1/`:`run-stencil.log`、`pixel-check.log`、`after/*.png`、`after/*.xml`、`after/live-logcat.txt`、`after/step097-events.txt`、`after/fatal-events.txt`、`after/observations.json`、`install.log`、`installed.sha256`。 ## 02:Metal 附件 — 源码与编译,不执行 iOS runtime Metal 宿主测试二进制中包含 `MetalRetainedAttachments.*` 两个 GTest,Metal host CMake 增量编译退出码 0。当前 Mac 没有可用 `MTL::CreateSystemDefaultDevice()`,两个测试均按守卫 SKIP;没有将 0/2 误记为 PASS。针对 `metal-cpp` 对象指针解引用的最小编译修正已提交 `8c006ac83`。 用户于 2026-09-26 明确决定:本轮不执行 iOS 测试,Android 验收通过后 iOS 按其决定视作接受。记录为 `USER_ACCEPTED_WITHOUT_IOS_RUNTIME_TEST`,不宣称 iOS GPU/Metal 实际验证。 ## 03:绘制异常恢复 — 原生测试 `RenderOrchestratorError.*` 两个新增原生测试实际执行 **2/2 PASS,exit 0**,覆盖 opaque/translucent 绘制异常、错误上报、失败 cache 不发布/不复用及干净重试恢复。日志:`artifacts/maplibre-particle/step097-a1-fzg1/render-exception.log`。本次不将 GTest 扩写为 Android GPU 真实异常注入 PASS。 ## 19:资源释放归属 — 已有结果 `OldCacheReleaseCannotChargeReplacementAtSameIndex` 已在此前重新编译的 Mac Core 原生 runner 实测 **1/1 PASS**;诊断组 **5/5 PASS**。FZG1 资源辅助冒烟 20 个检查点已经单独报告。精确 revision 归属由原生 GTest 负责,不据设备摘要断言不存在 GPU 内存泄漏。 ## A1 交接与限制 A1 在 Android/Core 验证和用户 iOS 豁免口径下可进入 A2;保留 B/D `topPresent=true` 的旧诊断疑点,不将其冒充已修复。下一阶段按原任务书 A2→B→C 严格串行;每阶段 Codex 实现/测试入口,RDC 负责实际构建、执行与独立审查;不加入 Jest、不覆盖 `.13`。