5.3 KiB
Mobile 验证架构
状态:预实现架构。本文定义已批准的目标契约,不表示当前仓库已经包含或发布
AtomUI.Mobile.Controls。
Mobile 验证按 Contract、Headless、Visual、Platform 和 Release 五层组织。某一层通过不能替代更高层证据;iOS 与 Android 分别记录,平台 Host 和测试项目实际存在前不写虚构命令。
五层验证
| 层级 | 证明内容 | 不能证明 |
|---|---|---|
| Contract | Public API、默认值、Token key、pseudo-class、TemplatePart、Semantic Part、event、关闭原因 | 视觉、触摸和平台生命周期 |
| Headless | 状态机、属性优先级、选择模型、导航事务、手势仲裁、资源释放 | Simulator/Emulator 或真机体验 |
| Visual | Light/Dark、字号缩放、方向、Safe Area、键盘和关键状态基线 | 系统返回、IME、屏幕阅读器真实性 |
| Platform | Simulator/Emulator 和真机触摸、IME、返回、生命周期、无障碍 | Release 裁剪和发布产物 |
| Release | iOS Release/AOT 与 Android Release trim/AOT 的构建、安装和启动 | 未覆盖设备的全部体验 |
双平台证据
| 证据维度 | iOS | Android |
|---|---|---|
| Build | 目标 TFM/RID 编译 | 目标 TFM/ABI 编译 |
| Virtual device | Simulator 场景 | Emulator 场景 |
| Physical device | 触摸、旋转、IME、前后台 | 触摸、旋转、IME、Activity 重建 |
| Accessibility | VoiceOver | TalkBack |
| Release | AOT 包安装和启动 | trim/AOT 包安装和启动 |
iOS-first 允许实现时间不同,不允许用 iOS 证据填充 Android 列。公共 API 只有在两个平台的对应验证路径存在后才能标记稳定。
无障碍
- AutomationPeer 暴露正确 role、name、value、state 和 action。
- Modal/Overlay 具有焦点圈闭、返回/escape 和正确阅读顺序。
- VoiceOver 与 TalkBack 分别在真机验证。
- 系统字号缩放不造成截断、重叠或焦点目标消失。
- platform profile 提供 iOS 44 pt、Android 48 dp 的最小触控目标策略;Control 不直接判断平台。
- Reduce Motion 保持终态、焦点和事件顺序,只降级非必要动效。
IME 与输入
至少覆盖英文、中文和日文组合输入,以及 emoji、secure input、return action、selection、焦点切换和键盘反复显示/隐藏。 Input、TextArea、SearchBar、PasscodeInput、VirtualInput 和 NumberKeyboard 共享明确的 IME ownership 与 viewport 更新规则。
输入验证继续以 DataValidationErrors 为最高优先级。平台 IME 错误、业务异步错误和表单验证错误必须保持不同 owner,不能
互相覆盖或被 Overlay 关闭吞掉。
Viewport 与布局
覆盖:
- 刘海、圆角、system bar 和零 inset 退化。
- 横竖屏、iPad 多任务和 Android multi-window。
- 输入面板打开、关闭、切换输入法和遮挡变化。
- 字体缩放、display scale 和宽/窄 viewport。
- Overlay 与页面同时响应 snapshot 更新。
平台状态变化必须在下一次有效布局前统一进入 MobileViewportContext,不能由 Control 使用 timer 或轮询补偿。
资源与生命周期
- Overlay、Picker、ImageViewer 和虚拟列表执行 1,000 次压力循环后不保留 session、owner、template part 或页面。
OnApplyTemplate、detach、owner 变更、container recycle 和 host detach 都有对应释放验证。- 进入后台暂停 transient timeout 和非必要动效;恢复不重复完成 Task 或 push 页面。
- Android Activity recreation 与 iOS host recreation 使用同一恢复不变量。
- 不允许 static event、进程级 mutable singleton 或 timer 持有 TopLevel 和 Control。
性能
- Drag、scroll、pinch 和 animation sampling 热路径不产生逐帧托管分配。
- 60 Hz 基线设备的稳定交互 p95 frame time 目标不超过 16.7 ms。
- 标准场景不允许未归因的 50 ms 以上主线程停顿。
- 每个波次记录包体、启动、布局和分配基线;超过 5% 的变化必须解释。
- 性能声明必须附设备、构建类型、场景、采样方法和日期。
AOT 与 Trimming
- 内置注册使用显式 descriptor 或 Source Generator,不扫描程序集。
- 不新增 ReflectionBinding、字符串成员访问或动态 factory。
- Analyzer 通过不能替代真实 iOS/Android Release publish。
- Adapter、Token、Localization、ControlTheme 和 DataTemplate 在裁剪后仍可发现。
- Release 产物必须实际安装和启动,不能只保留 publish 成功日志。
单能力完成证据
一项能力只有同时具备以下证据才可以从兼容清单提升为完成:
- Public API 与能力映射已经评审。
- Contract 与 Headless tests 通过。
- Light/Dark、字号缩放和关键状态视觉基线通过。
- 触摸、手势、键盘和返回行为通过适用场景。
- AutomationPeer 与屏幕阅读器证据存在。
- iOS 与 Android 对应平台状态分别记录。
- Release/AOT/trim、资源释放和性能门禁通过。
- Gallery ShowCase、API、Token 和 Control 文档同步。
当前验证状态
当前没有 AtomUI.Mobile.Controls 项目,因此本文件只定义验证不变量,没有 Mobile Contract、Headless、Platform 或 Release
通过结论。现有 Desktop LLMS、Desktop Control 测试或 iOS Demo 环境经验不能替代上述 Mobile 证据。