题目背景
你负责一个包含旧 View、Jetpack Compose 和第三方 SDK 的 Android 应用。Android 16 对 target 16 及以上的应用移除 windowOptOutEdgeToEdgeEnforcement,应用必须正确处理窗口插入。请说明如何发现风险、修改布局、验证多设备形态并控制发布风险。
面试官考察点
- 是否区分“在 Android 16 上兼容运行”和“把 targetSdkVersion 提升到 16”。
- 能否系统检查状态栏、导航栏、输入法、刘海和滚动容器的 inset 处理。
- 是否能覆盖旧 View、Compose、库与 SDK 的组合测试。
- 能否设计兼容性开关、灰度发布和可观测回滚。
澄清问题
先确认当前 target/compile SDK、支持的 Android 版本、View 与 Compose 比例、横竖屏与折叠设备范围,以及是否使用全屏相机、地图或 WebView。询问现有截图测试、崩溃和布局投诉基线,并确认第三方 SDK 是否声明了 edge-to-edge 支持。
30 秒回答
我会分两阶段:先在不提升 target 的情况下用 Android 16 设备和兼容性开关暴露行为问题,再把 inset 修复与 target 升级分开。统一检查根布局、状态栏/导航栏、IME、手势区域和滚动内容,覆盖 View 与 Compose 组件。先发布兼容版本到小比例用户,监控崩溃、遮挡投诉和关键流程完成率;只有截图回归和设备矩阵通过后才提高 target。出现严重布局问题时回退版本或关闭受影响功能,不把 target 升级和大量新功能绑在一次发布里。
分步推导
1. 分离兼容性与目标升级
Android 官方迁移指南建议先在 Android 16 上测试现有应用,很多兼容修复无需立即更改 targetSdkVersion。之后再针对以 Android 16 为目标的行为变更升级配置,便于定位问题来源。
2. 建立 inset 清单
检查根容器是否消费系统栏 inset,顶部工具栏、底部导航、列表最后一项、输入框和弹窗是否会被遮挡。对 Compose 使用统一的 window inset 约定,对旧 View 避免同一层级重复 padding;为相机、地图和 WebView 单独定义安全区域。
3. 使用测试工具缩小范围
Android 16 的兼容性切换开关可在不改变 target 的情况下单独启用目标行为。把它接入自动化设备矩阵,覆盖 4 KB/16 KB 页面、横竖屏、三按钮/手势导航、折叠屏和不同字体缩放,并记录变更 ID 与截图差异。
4. 灰度与回滚
先发布只包含布局修复的兼容版本,再在 beta 和 1% 生产流量提升 target。监控启动崩溃、ANR、关键页面可点击率、底部遮挡投诉和第三方 SDK 错误。将 target 升级保持为独立变更;必要时回退到上一版本或暂时关闭受影响入口。
高质量示范回答
我会先锁定兼容性基线:在 Android 16 模拟器和真实设备安装当前线上版本,跑完整流程并截取边缘区域。然后用兼容性开关只打开 edge-to-edge 相关行为,定位是根布局、第三方 SDK 还是 target 升级造成的问题。实现上建立统一的 inset 处理层,明确哪些组件消费顶部、底部和 IME inset,避免 View 与 Compose 重复添加 padding;相机、地图、WebView 和弹窗各自做安全区域测试。先发布兼容修复版本,不改 target;当截图、可访问性、横竖屏、折叠设备和输入法测试通过后,再以独立变更提升 target,先 beta、再 1% 灰度。监控崩溃、ANR、核心转化和遮挡反馈,出现明显回归就回退版本或关闭新入口。这样既响应平台强制变化,又能保留清晰的故障归因和回滚路径。
常见误区
- 直接提升 targetSdkVersion,无法区分平台行为与代码改动的影响。
- 只修状态栏,忽略导航栏、IME、折叠屏、滚动末端和弹窗。
- 让多个布局层重复消费 inset,导致双倍留白。
- 只在模拟器测试,不验证第三方 SDK、真实设备和字体缩放。
- 把 edge-to-edge 迁移和大规模功能发布绑定,缺少独立回滚。
追问与应对
如果问“必须马上把 targetSdkVersion 改到 16 吗?”
回答:不必把兼容修复和 target 升级同时进行。先在 Android 16 上测试当前 target,修复兼容问题,再按 Google Play 要求和产品节奏独立升级 target。
如果问“如何处理第三方 SDK?”
回答:建立 SDK 清单,在真实设备和兼容性开关下验证;优先升级已支持 edge-to-edge 的版本,无法升级时在外层提供安全 inset 或隔离该页面。
如果问“如何确认修复没有破坏旧系统?”
回答:用同一套截图和关键流程矩阵覆盖最低支持版本、Android 15、Android 16、横竖屏、导航模式和字体缩放,比较可点击区域和内容遮挡,而不只看启动是否成功。