大屏问题排查:窗口模式、适配与多窗口
2026/8/9大约 4 分钟大屏/折叠屏/自由窗口Android 14大屏排障多窗口适配
大屏问题排查:窗口模式、适配与多窗口
前五章把大屏机制讲完了。这一章把它们串成排障链:布局错乱、状态丢失、分屏异常、 厂商差异,按什么顺序查、看什么证据。
先记录 windowingMode、实际 bounds 和 Configuration,再复现尺寸切换与 Activity 重建。 只有 AOSP 基线正常而目标设备异常时,才把厂商扩展作为主要分支继续调查。
先记录实际 windowingMode 与窗口边界
| 常见误解 | 正确理解 |
|---|---|
| 大屏问题都是布局问题 | 可能是窗口模式、Configuration、状态保存或厂商扩展 |
| 在手机验证过就够 | 尺寸等级与窗口模式变化只在目标环境出现 |
| 状态丢失是系统 bug | 多为应用未正确处理重建与保存 |
核心结论
- 排障顺序:窗口模式 → Configuration → 布局与状态 → 厂商差异。
dumpsys activity/window看模式与 bounds;wm size模拟尺寸。- 布局错乱先确认尺寸等级与资源选择。
- 状态丢失查重建与 onSaveInstanceState。
- 厂商独占问题先确认基线行为再定位扩展。
排障主链
逐步解释:
- 窗口模式:确认是分屏、Freeform 还是 PiP。
- Configuration:确认尺寸与密度变化是否被响应。
- 布局与状态:检查资源选择与状态保存。
- 厂商差异:对比 AOSP 与厂商行为。
常用命令与证据
环境:开发设备或模拟器;以下命令不需要 root。
adb shell dumpsys activity activities | grep -iE "windowingMode|bounds"
adb shell dumpsys window windows | grep -iE "Window #|bounds"
adb shell wm size
adb shell wm density
adb shell settings put global overlay_display_devices 1920,1080,240
adb logcat -v threadtime | grep -E "Configuration|ActivityRecord|Relayout"| 证据 | 回答的问题 |
|---|---|
| windowingMode | 当前窗口形态 |
| bounds | 窗口实际尺寸 |
| wm size/density | 模拟环境 |
| Configuration 日志 | 配置变化是否触发 |
| ActivityRecord | 是否重建 |
常见场景与定位思路
场景一:平板/大屏布局错乱
先看窗口 bounds 与尺寸等级,再查资源目录(layout-sw600dp 等)。错乱多为布局断点 缺失或固定尺寸写死。
场景二:折叠展开状态丢失
确认 Activity 是否重建,onSaveInstanceState 是否保存关键状态。自处理场景检查 configChanges 声明与 onConfigurationChanged 实现。
场景三:分屏窗口过小
查最小窗口尺寸与 fixedOrientation 声明;分屏下固定方向会引发系统策略或体验问题。
场景四:仅某厂商设备异常
先在 AOSP 模拟器验证基线行为,再对比厂商设备。差异集中在厂商扩展层时,按厂商 策略调整适配,而不是改 AOSP 假设。
常见误区
- “手机验证过就够”:尺寸等级与窗口模式要目标环境验证。
- “布局错乱一定是资源问题”:先确认窗口模式与配置。
- “状态丢失是系统 bug”:多为保存恢复缺失。
- “厂商行为 = 标准行为”:先确认 AOSP 基线。
延伸问题
- 如何建立大屏适配的自动化回归?
- 多窗口下输入与焦点如何验证?
- 厂商桌面模式如何纳入测试矩阵?
- 折叠屏显示特征(铰链)如何参与排障?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
WindowConfiguration.java | 窗口模式 | 形态 |
Activity.java | 配置回调/保存 | 适配 |
WindowManagerService.java | bounds | 窗口尺寸 |
wm 命令 | 命令行 | 模拟环境 |
公共路径沿用本系列各章。行号以 r75 检索为准。
窗口之外的通用系统证据,见 系统调试与排障。