打开你的 AndroidManifest.xml,搜一下 screenOrientation。
搜到了对吧?很多 App 都有。写 portrait 锁竖屏,写 landscape 锁横屏,简单粗暴地回避了屏幕旋转和多窗口带来的适配问题。
这条路,在 Android 17 上走不通了。

发生了什么
从 Android 16 开始,Google 就在推大屏自适应布局。当时的策略是:600dp 以上的大屏设备默认忽略方向锁定和尺寸限制,但给了开发者一个 opt-out 的口子------你可以声明豁免,继续用老方式。
Android 17 把这个口子堵死了。
targetSdk 升到 37 之后,以下 Manifest 属性和 API 在大屏上全部失效:
xml
<!-- 全部被忽略 -->
android:screenOrientation="portrait"
android:screenOrientation="landscape"
android:resizeableActivity="false"
android:minAspectRatio="..."
android:maxAspectRatio="..."
setRequestedOrientation() 这个运行时 API 也一样------调了没用。
系统会直接让你的 App 在全屏、分屏、自由窗口等各种模式下正常拉伸和显示。不管你愿不愿意。
影响范围到底多大
先看「大屏」的定义:最小宽度 ≥ 600dp 的设备。
包括:
- 平板电脑
- 折叠屏展开状态
- 桌面模式(DeX、窗口化投屏等)
两个例外:
- 在 Manifest 中声明了
android:appCategory="game"的游戏应用 - 最小宽度不到 600dp 的设备(普通手机不受影响)
用户仍然可以在系统设置里手动覆盖行为,但开发者层面已经没有逃生通道了。
时间线:
- 现在:Android 17 Beta 1 已可测试
- 2026 年 Q2:正式版发布
- 2027 年 8 月:Google Play 要求新应用和更新必须 target SDK 37
看起来还有时间?别乐观。大屏适配不是改两行 Manifest 的事。
你的 App 会出什么问题
如果你的 App 之前一直锁着竖屏方向,在大屏上强制拉伸后,大概率会遇到以下问题:
界面被拉变形
原来竖屏下好好的布局,横过来或放到平板上就全乱了。按钮跑到屏幕外面,内容被拉得惨不忍睹。
相机预览变形
相机类 App 是重灾区。传感器方向和显示方向不一致,预览画面会出现拉伸、旋转错误。
状态丢失
窗口尺寸变化会触发配置变更。如果你没有正确保存和恢复状态,用户操作到一半的数据就没了。分屏、折叠屏展开/合上、自由窗口拖拽------这些场景都会触发。
怎么改:实战方案
布局适配:约束最大宽度
不需要把所有页面都改成双栏布局。最简单有效的做法是给内容区设一个最大宽度,让它在大屏上居中显示。
Compose 写法:
kotlin
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.TopCenter
) {
Column(
modifier = Modifier
.widthIn(max = 480.dp)
.fillMaxWidth()
.padding(horizontal = 16.dp)
) {
// 你的内容
}
}
XML 写法:
xml
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxWidth="480dp"
android:layout_gravity="center_horizontal">
<!-- 你的内容 -->
</LinearLayout>
</ScrollView>
这样你的 App 在手机上看起来完全没变化,在大屏上也不会被拉得面目全非。
相机预览:用 CameraX
如果你还在直接用 Camera2 API 处理预览旋转,现在是时候切到 Jetpack CameraX 了。它会自动处理传感器方向和宽高比适配。
如果不想迁移整个相机模块,至少可以用 CameraViewfinder 组件(向下兼容到 API 21),处理预览显示的适配问题。
状态保存:别偷懒
确保关键页面的状态通过以下方式保存:
- Compose:
rememberSaveable - View 体系:
onSaveInstanceState()/ViewModel+SavedStateHandle
窗口尺寸变化 = 配置变更 = 可能触发 Activity 重建。 在大屏场景下,这种变化会非常频繁。
测试清单
在改代码之前,先跑一轮测试看看现状有多惨:
环境准备:
- Android 17 Beta 1 模拟器
- 选 Pixel Tablet 或 Pixel Fold 的设备配置
targetSdkPreview = "CinnamonBun"
必测场景:
| 场景 | 要验证的内容 |
|---|---|
| 平板横屏 | 布局是否正常,按钮是否可点 |
| 分屏模式 | 窗口压缩到一半宽度,内容是否溢出 |
| 自由窗口拖拽 | 连续调整窗口大小,App 是否崩溃 |
| 折叠屏展开/合上 | 状态是否保留,布局是否自动切换 |
| 旋转 | 横竖屏切换,数据是否丢失 |
工具推荐:
- Compose UI Check:自动化布局审计,帮你扫描潜在的适配问题
- DeviceConfigurationOverride:模拟不同的显示特性,不需要真机
如果你不想升 targetSdk 到 37,也可以在 Android 16 设备上通过应用兼容性框架 开启 UNIVERSAL_RESIZABLE_BY_DEFAULT 来提前测试效果。
适配优先级建议
不是所有页面都需要一步到位。建议按这个优先级来:
P0 - 必须立刻修:
- 崩溃或 ANR 的页面
- 相机预览变形
- 关键流程(登录、支付、核心功能)布局错乱
P1 - 尽快修:
- 列表页、详情页的内容溢出
- 弹窗/对话框在大屏上的定位异常
P2 - 可以排期:
- 双栏/多栏布局优化
- 大屏专属的交互体验提升
先保证「不崩不变形」,再追求「用得好」。
写在最后
Google 从 Android 12L 开始喊大屏适配,喊了好几年。
Android 16 给了缓冲期,Android 17 彻底关门。再加上 2027 年 8 月的 Google Play 硬性要求,留给开发者的窗口期其实也就一年多。
好消息是,对于大多数 App 来说,最低成本的适配方案就是加个 widthIn(max = 480.dp) ------10 分钟搞定,效果立竿见影。先把这一步做了,后面再慢慢优化。
你的 App 在平板上试过吗?欢迎评论区分享翻车经历。
#Android17 #大屏适配 #Android开发 #Compose #移动开发 #程序员