Android 17 折叠屏与大屏 APP 加固验收矩阵 V1(未执行模板)
这是一份 Android 17 折叠屏、大屏、多窗口与桌面窗口的 APP 加固验收模板,不是御盾兼容性实测报告。模板中的每一个结果都默认标记为“未执行”;只有绑定真实业务提交、系统、窗口状态、原始 Release、基础保护、目标保护和最终发布物并完成对应业务步骤后,项目团队才可以把状态改成“通过”“失败”或“阻断”。
模板用途
项目常用一句“折叠屏兼容”概括多个完全不同的状态,导致问题无法复现。Android 官方指出,目标 API 37 的应用在符合条件的大屏上不再能依赖旧方向、可调整大小和宽高比限制退出自适应行为;同一设备又可能因为外屏、展开、旋转、分屏和桌面窗口获得不同的可用区域。矩阵的目标是把这些条件与候选包身份、业务路径和发布决定放到同一张表,而不是制造一个笼统的通过率。
本模板适合研发、QA、安全和发布团队共同使用。研发维护平台与应用实现,QA 定义可复现步骤与视觉阈值,安全团队管理保护候选与边界,发布负责人决定阻断、降级或回滚。需要先理解规则与归因方法,可阅读Android 17 大屏和折叠屏 APP 加固验收指南。
读者对象
适用于 Android 研发负责人、移动 QA、安全工程师、跨平台技术负责人和发布负责人。团队应先约定谁提供原始 Release、谁生成保护产物、谁控制正式签名、谁执行窗口与业务路径、谁拥有阻断和回滚权限。模板不能由单一角色在缺少真实执行时自行填写“通过”。
核心结论
- 折叠屏兼容必须绑定目标 API、窗口条件、折叠姿态和真实业务步骤;设备名称不能代替这些条件。
- 原始 Release、基础保护、目标保护和最终发布物要按同一业务提交逐级对照。
- 首页启动、一次展开或静态截图不能代表 Camera、Surface、WebView、支付和状态恢复通过。
- 未执行、未覆盖与不适用均不是通过;公开结论只能覆盖实际记录的格子。
- 御盾可以参与保护产物与发布证据,不能替应用团队完成自适应布局或替服务端决定业务结果。
状态枚举
| 状态 | 含义 | 是否可当作兼容证据 |
|---|---|---|
| 未执行 | 尚未在真实候选与目标环境运行 | 否 |
| 未覆盖 | 已明确不在本轮范围,但仍可能影响发布 | 否 |
| 通过 | 在记录的环境和步骤中符合预设阈值 | 仅限该范围 |
| 失败 | 可复现地不符合阈值 | 否,需归因 |
| 阻断 | 失败或证据缺失使候选不得发布 | 否 |
| 不适用 | 经确认该业务没有该组件或路径 | 需说明依据 |
“空白”“没有发现问题”和“测试人员没有反馈”都不是状态。对外页面不得把未执行和未覆盖合并为通过,也不得用某一台设备的一次结果宣称覆盖全部 Android 17 大屏。
技术拆解
候选对象登记
| 字段 | A 旧稳定 Release | B API 37 原始 Release | C 基础保护 | D 目标保护 | E 最终发布物 |
|---|---|---|---|---|---|
| 业务提交 | 待填写 | 待填写 | 与 B 对应 | 与 B 对应 | 与 D 对应 |
| targetSdk | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
| 构建工具版本 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
| 候选摘要 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
| 签名责任 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
| 保护策略 | 不适用 | 不适用 | 待填写 | 待填写 | 待填写 |
| 渠道或商店 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
| 回滚对象 | 待填写 | 待填写 | 待填写 | 待填写 | 待填写 |
正式执行时,不能用 Debug、不同分支、不同 SDK 或不同业务数据替代同一 Release 线。对外脱敏报告可以隐藏摘要和签名细节,但内部发布台账必须能回答每一列属于哪个真实对象。
大屏与窗口状态矩阵
| 场景 | B 原始 Release | C 基础保护 | D 目标保护 | E 最终发布物 | 关键观察 |
|---|---|---|---|---|---|
| 普通手机竖屏 | 未执行 | 未执行 | 未执行 | 未执行 | 启动、导航、输入 |
| 大屏竖屏 | 未执行 | 未执行 | 未执行 | 未执行 | 布局宽度、控件位置 |
| 大屏横屏 | 未执行 | 未执行 | 未执行 | 未执行 | 方向、双栏、动画 |
| 折叠外屏 | 未执行 | 未执行 | 未执行 | 未执行 | 紧凑窗口与状态 |
| 展开内屏 | 未执行 | 未执行 | 未执行 | 未执行 | 重排、折痕与恢复 |
| 书本姿态 | 未执行 | 未执行 | 未执行 | 未执行 | 铰链两侧内容 |
| 桌面姿态 | 未执行 | 未执行 | 未执行 | 未执行 | 控件区域与输入 |
| 分屏 | 未执行 | 未执行 | 未执行 | 未执行 | 连续调整与可见性 |
| 自由窗口 | 未执行 | 未执行 | 未执行 | 未执行 | 最小、最大、拖动 |
| 连接显示器 | 未执行 | 未执行 | 未执行 | 未执行 | 显示方向与资源 |
| 前后台恢复 | 未执行 | 未执行 | 未执行 | 未执行 | 会话、导航与表单 |
| 进程重建恢复 | 未执行 | 未执行 | 未执行 | 未执行 | 保存状态与幂等 |
每一格的执行记录应附带系统版本、窗口宽高或尺寸类别、折叠姿态、方向、首次失败步骤、预期与实际结果。视觉问题应绑定可复核截图或视频的受控引用,但公开内容不能包含客户资料、账号、设备标识或生产日志。
组件与业务路径矩阵
| 组件或路径 | 原始 Release | 基础保护 | 目标保护 | 核心判定 |
|---|---|---|---|---|
| 冷启动与首页 | 未执行 | 未执行 | 未执行 | 无异常退出,首屏状态正确 |
| 登录与账号恢复 | 未执行 | 未执行 | 未执行 | 输入、会话、旋转恢复正常 |
| 表单与提交 | 未执行 | 未执行 | 未执行 | 状态不丢失,不重复提交 |
| CameraX/Camera2 | 未执行 | 未执行 | 未执行 | 预览、拍摄、旋转和恢复正确 |
| Surface/视频 | 未执行 | 未执行 | 未执行 | 尺寸、画面、播放状态正确 |
| WebView | 未执行 | 未执行 | 未执行 | 重排、桥接、页面状态正常 |
| 地图与定位 | 未执行 | 未执行 | 未执行 | 地图尺寸、手势与标记正常 |
| Native SDK | 未执行 | 未执行 | 未执行 | 加载、回调和窗口变化正常 |
| Flutter/RN/KMP | 未执行 | 未执行 | 未执行 | 插件、桥接和重组路径正常 |
| Unity | 未执行 | 未执行 | 未执行 | 渲染面、输入和生命周期正常 |
| 支付与高价值动作 | 未执行 | 未执行 | 未执行 | 服务端幂等与结果一致 |
| 覆盖升级与回滚 | 未执行 | 未执行 | 未执行 | 签名一致、数据保留、可回滚 |
项目可删除不适用行,但必须写明理由。首页通过不能替代支付、相机、文档或真实高价值路径;普通手机结果也不能替代折叠与多窗口结果。
归因与发布门禁
归因从 B 开始。B 失败时,先修 Android 17 平台、布局、生命周期或 SDK 问题;B 正常而 C 失败时,检查最小保护、构建与初始化差异;C 正常而 D 失败时,只调整一个目标保护变量;D 正常而 E 失败时,检查签名、渠道、商店生成物和最终安装对象。任何阶段都不得用另一包体的结果替代当前候选。
建议阻断条件包括:原始 Release 在目标环境未通过、基础保护首次出现关键路径失败、目标保护导致不可接受的视觉或稳定性回归、最终发布物身份不明、覆盖升级失败、关键状态未执行却被误标为通过。发布负责人应同时保存回滚对象和触发条件。
事实依据与脱敏证据
| 编号 | 公开依据 | 支持的事实 | 本模板如何使用 |
|---|---|---|---|
| 1 | Android 17 方向与 resizability | API 37 大屏旧限制与例外 | 定义平台条件和常见风险 |
| 2 | Android 17 准备指南 | Android 17 移除临时退出路径并给出 API 37 规划 | 区分当前要求与未来准备 |
| 3 | Window size classes | 窗口可用区域动态变化 | 记录窗口而非只记录设备 |
| 4 | Foldables quality | 折叠姿态、相机、多窗口与多实例测试 | 构成状态和组件矩阵 |
| 5 | Fold awareness | 折痕、铰链与姿态信息 | 检查内容布局区域 |
| 6 | Google Play target API | 当前 2026 API 36 要求 | 避免误报 API 37 截止 |
御盾可以在授权范围内参与真实保护产物的对照、异常归因、发布门禁和回滚证据,不替代应用团队的大屏布局、相机实现、第三方 SDK 修复、商店审核或服务端业务裁决。本模板没有任何现场结果,不构成兼容性承诺。
工程落地
开始执行前,先冻结构建输入、targetSdk、框架与 SDK 版本,生成原始 Release,再按同一输入生成基础保护和目标保护。为每次执行分配记录编号,把窗口尺寸、尺寸类别、折叠姿态、方向和首个失败步骤写入同一条记录。涉及正式商店时,最终安装对象应另列一列,不能用上传前 AAB 或中间 APK 的结果替代。
执行结束后按“平台与原包、基础保护、目标保护、最终发布”顺序归因,并由不同负责人复核。若结果不能复现、截图含敏感内容、候选身份不清或回滚对象缺失,状态应保持阻断或未覆盖,而不是为了发布进度改成通过。
攻防视角
窗口变化可能让原本在小屏上不可见的控件、错误提示或调试内容进入画面,也可能因状态丢失造成重复提交、流程跳转和客户端与服务端不一致。防守不能靠固定竖屏长期掩盖这些问题:应用负责布局与状态,客户端保护负责关键分支与完整性,服务端负责幂等、权限和最终业务结果。兼容性通过不等于保护强度通过,两类证据应分别验收。
风险边界
本模板没有设备、应用或保护策略的现场结果,不代表御盾或任何第三方产品已经兼容 Android 17 大屏。Android 17 规则存在 targetSdk、显示条件、游戏和用户设置等边界;Google Play 当前 2026 年要求仍是 API 36。实施时必须重新核对官方文档,并只对实际执行范围作结论。
常见误区
- 把“折叠屏”当成一个固定状态,不记录外屏、展开、姿态和窗口尺寸;
- 用旧线上包和新保护包直接比较,忽略 targetSdk、SDK 与构建工具变化;
- 只测首页启动,不测 Camera、Surface、WebView、支付和状态恢复;
- 全部关闭保护后业务恢复,就宣布某一保护模块有问题;
- 把未执行、未覆盖或空白格自动统计为通过;
- 用一台设备的一次结果对外宣称所有 Android 17 折叠屏兼容。
FAQ
这份矩阵可以直接写“御盾 Android 17 已兼容”吗?
不可以。模板只定义对象、步骤与状态。没有绑定真实候选并执行的项目必须保持“未执行”或“未覆盖”。
为什么要保留基础保护包?
基础保护帮助判断最小保护范围是否正常;如果直接比较原包和最高目标策略,出现异常时很难定位是构建、SDK、Native 还是哪一层策略造成差异。
游戏属于例外,还要测吗?
要。例外仅说明 Android 17 大屏方向和 resizability 规则的适用边界,不代表游戏的 Unity Surface、输入、折叠姿态、分屏、状态恢复与最终发布物无需测试。
如何申请真实矩阵?
可通过御盾内测申请提交原始 Release、候选范围、目标系统、窗口状态和关键业务路径。测试范围、数据处理、未覆盖项和发布责任应在 PoC 前书面确认。
结语
矩阵的价值不是让每一格尽快变绿,而是让每一个“通过”都有对象、条件和步骤,让每一个“未覆盖”都不会被隐藏。先固定原始 Release,再逐级进入基础保护、目标保护和最终发布物,才能把 Android 17 平台变化、应用自适应缺陷、第三方组件与保护差异分开,形成可发布、可降级和可回滚的工程结论。