前言
近日,Android 17 正式发布:API Level 37,代号 CinnamonBun(肉桂卷)。
Pixel 用户已经能 OTA 升级,AOSP 源码也同步开放。

这不是版本号 +1,这是 Android 从「操作系统」转向「智能系统」的分水岭。
本文将回答 3 个开发者最关心的问题:
- 1:Android 17 更新了什么?
- 2:哪些 Breaking Changes 会让你的 App 在 6 月 16 日之后崩溃?
- 3:该如何高效升级?
Android 17 更新了什么?
Android 17 主要做了 3 件事: 
- 1:🟢 给你新弹药 --- AppFunctions、Continue On、EyeDropper、分代 GC、无锁 MessageQueue
- 2:🔴 给你划红线 --- 应用内存限制、大屏方向强制、Static Final 真不可变、CameraX 必升
- 3:🧪 给整代 Android 换地基 --- Compose 优先官宣、设备端 MCP
特别注意
- 正式版已推送,这一代不存在「等等再说」的选项
- 6 个月内 Google Play 就会强制 targetSDK 37。
更新1:智能系统,把 App 变成 Agent 可调用的工具
Android 17 最颠覆的改动,是它给整个生态加了一个新角色:设备端 MCP(Model Context Protocol)。

MCP是什么?
可以把它类比成「给 AI 用的 USB-C 接口」------任何 App 只要按规范暴露自己的能力,AI 就能即插即用地调用它,不用每家定制集成。
而 Android 17 落地 MCP 的方式,叫做 AppFunctions 。 
它解决了什么问题?
过去你想把 App 接入 Gemini,要么走 App Actions(深链 + 自定义意图),要么写一堆 BroadcastReceiver;门槛高、维护重,AI 还不一定调得动。
AppFunctions 的思路简单粗暴------用注解 + KDoc,让函数本身就是可被 AI 发现的工具:
kotlin
@AppFunction(isDescribedByKDoc = true) // 👈 关键注解
suspend fun createNote(
appFunctionContext: AppFunctionContext,
title: String, // 笔记标题
content: String // 笔记正文
): Note {
// ✅ 普通业务实现
return noteRepository.create(title, content)
}
写完上面这 6 行,Gemini 就能在用户说「帮我记一下今天会议要点」时,自动调用你的 createNote 函数------不需要你做任何 UI 跳转。
配套工具也都齐了
- 1:AppFunctions Agent Skill --- 自动分析你的工作流、生成 Kotlin 代码、优化 KDoc、给 ADB 测试命令;
- 2:测试代理 App --- 模拟 AI 调用你的函数,本地就能联调;
- 3:Gemini 集成(EAP) --- 私密预览中,可申请加入
goo.gle/eap-af。
为什么这件事比想象中重要
AppFunctions 是这次更新里最值得现在就开始投入的特性,没有之一*
不是因为 AI 多酷,而是因为入口在变。
过去 10 年,App 的入口是「图标 + 启动器」;接下来 5 年,入口会变成「AI 助手 + 工具列表」。谁先把自己变成可调用工具,谁就在新入口里占住坑位;谁还守着深链做小程序级别的接入,谁就会被绕开。
更新2:Adaptive-First,大屏设备必须适配

Google 给的数据:全球已经有 5.8 亿+ 大屏 Android 设备。平板、折叠屏、桌面模式、Googlebooks(基于 Android 的下一代 ChromeOS)------这些不再是「边缘场景」。
所以 Android 17 把大屏适配从「建议」升级成了「强制」。
⚠️ 大屏方向 / 可调整大小限制------直接被忽略
针对 targetSDK 37 的应用,在大屏设备(sw ≥ 600dp)上:
| Manifest 属性 | 在大屏上的命运 |
|---|---|
screenOrientation |
被忽略 |
setRequestedOrientation() |
被忽略 |
resizeableActivity=false |
被忽略 |
minAspectRatio / maxAspectRatio |
被忽略 |
也就是说,不管你写没写「只竖屏」,平板上就是任意方向 + 自由窗口大小。
豁免名单只有一个:用 android:appCategory="game" 声明的游戏。其他 App 一视同仁。
多任务直接升一档:App Bubbles + Bubble Bar
任意 App 长按启动器图标,都能变成一个浮在屏幕上的悬浮气泡(见上图):
- 1:手机上 → 气泡叠在前台 App 之上;
- 2:折叠屏 / 平板 → 任务栏新增「Bubble Bar」专区,气泡分类管理;
- 3:桌面模式 → 可使用 iPiP(Interactive Picture-in-Picture),永远置顶且可交互的固定窗口(不同于传统 PiP 的只读视频小窗)。
这意味着你的 App 要做好一件事------任何时候被切到小窗 / 浮窗 / 桌面 PiP,UI 都不能崩 。Compose 的 WindowSizeClass 不是装饰品了,是救命稻草。
Activity 重建行为也变了
默认情况下,下列配置变更不再重启 Activity ,改为通过 onConfigurationChanged() 回调:
- 1:
CONFIG_KEYBOARD/CONFIG_KEYBOARD_HIDDEN - 2:
CONFIG_NAVIGATION - 3:
CONFIG_TOUCHSCREEN - 4:
CONFIG_COLOR_MODE
好处是状态丢失少了;代价是------如果你的 App 依赖重建来重新加载资源,必须显式声明新的 manifest 属性:
xml
<activity
android:name=".SomeActivity"
android:recreateOnConfigChanges="keyboard|navigation" />
⚠️ 这个属性在 Android 16 以前不存在,旧版本编译会报错,记得用
tools:targetApi="37"屏蔽。
意义
大屏强制不是 Google「想推平板」,而是 ChromeOS-on-Android 战略的总开关。Googlebooks 上市那天,所有没适配的 App 都会被打回开发。
更新3:Continue On,跨设备接续的「官方深链」

苹果有 Handoff,Android 这次给了官方对标版------Continue On。
场景很直接:你在手机上读到一半的文章,平板拿起来就接着读;手机上写了一半的笔记,平板能直接拉起继续编辑。
接入只要两步:
kotlin
class ArticleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ✅ 1. 启用 Handoff
setHandoffEnabled(true, null)
}
// ✅ 2. 当用户在另一台设备点击接续时,返回当前状态
override fun onHandoffActivityDataRequested(
request: HandoffActivityDataRequest
): HandoffActivityData {
return HandoffActivityData.Builder()
.setDeepLink(Uri.parse("myapp://article/$articleId?pos=$readPosition"))
.setFallbackUrl(Uri.parse("https://web.example.com/article/$articleId"))
.build()
}
}
几个细节值得划重点:
- 1:走系统级 UI,不是你 App 内部画------通过启动器、任务栏等系统入口展示;
- 2:深链跳转 + Web 回退双保险------目标设备没装你 App 也能跳到网页;
- 3:按 Activity 实现,不是全局开关,可以精细控制哪些页面允许接续。
意义
这是 Android 生态级别的能力补齐,但前提是「用户家里有第二台 Android 设备」。投入产出比看你的用户画像,不必盲目跟。
更新4:Compose-First 官宣,View 系正式进入维护模式

这次 Google 终于把那句憋了 5 年的话说了出来:
「所有新的 API、库、工具、文档,只面向 Jetpack Compose 。传统 View 组件(
android.widget、Fragments、RecyclerView、ViewPager)进入维护模式,仅修关键 bug」。
翻译成开发者能听懂的话:
- 1:新 API 不再补 View 版本 --- 想用新能力?只能写 Compose
- 2:官方文档 Compose 优先 --- 搜索结果第一条永远是
@Composable - 3:XML to Compose Migration Skill 已上线 --- AI 自动迁移,不用一个个手改
Android 17 同期还配套放出了一系列 Compose 强化:
| 能力 | 含义 |
|---|---|
| NavigationSuiteScaffold | 自适应导航,自动切换 Bottom Bar / Rail / Drawer |
| Navigation 3 Scenes | ListDetailSceneStrategy、SupportingPaneSceneStrategy 多面板布局 |
| Compose 1.11 FlexBox & Grid | 终于补齐了 Web 都有 20 年的布局能力 |
| TrackpadInjectionScope | 触控板 / 鼠标的完整事件支持,给桌面环境用 |
| SecureTextFields(Compose 1.12) | 自动支持物理键盘密码保护 |
那 View 工程怎么办?
不用立刻全部重写,但要做 3 件事:
- 1:新页面强制 Compose --- 守住增量
- 2:核心页面优先迁移 --- 用
ComposeView局部嵌入,避免大爆炸式重构 - 3:接入 XML to Compose Skill --- Google 自己提供的 AI 迁移工具,能 Cover 60-70% 的机械转换工作
意义
从今天起,「会不会 Compose」不再是技能加分项,而是 Android 开发的入场券。
Breaking Changes,4 颗会炸的雷
下面这 4 项,只要你 targetSDK 改成 37,就必须处理。按踩雷概率从高到低排序。
🔴 雷 1:应用内存限制------MemoryLimiter 直接杀进程
Android 17 根据设备总 RAM,给每个 App 设了硬性内存上限,超限直接被杀。
判断自己是不是被它杀的,看 ApplicationExitInfo.getDescription():
kotlin
val am = getSystemService(ActivityManager::class.java)
val infos = am.getHistoricalProcessExitReasons(null, 0, 10)
infos.forEach { info ->
if (info.description?.contains("MemoryLimiter:AnonSwap") == true) {
// ⚠️ 被系统内存限制杀掉了
reportKilledByMemoryLimiter(info)
}
}
工具链上 Google 也准备好了:
- 1:R8 Configuration Analyzer(如上图)--- 帮你定位混淆配置导致的额外内存占用
- 2:LeakCanary 在 Android Studio Panda 中原生集成 --- 不用再单独引依赖
- 3:
TRIGGER_TYPE_ANOMALY--- 通过 ProfilingManager 在被杀之前自动抓堆转储
🔴 雷 2:无锁 MessageQueue------反射访问私有字段必崩
android.os.MessageQueue 在 Android 17 改成了无锁实现,能减少丢帧、改善启动时间。免费午餐,但有副作用------
通过反射读写 MessageQueue 私有字段的代码会直接崩溃。
最常见的踩雷场景:
- 1:自研性能监控库(监听卡顿)
- 2:某些老牌的 LeakCanary 衍生库
- 3:动态修复 / 热修复框架
如果你引了 BlockCanary、ANR-WatchDog、KOOM 这类库,全部检查升级版本,确认它们已经适配 Android 17。
🔴 雷 3:Static Final 真不可变------反射 / JNI 改字段直接抛异常
kotlin
class Config {
companion object {
const val API_URL = "https://prod.example.com"
}
}
// targetSDK 37 上:
val field = Config::class.java.getDeclaredField("API_URL")
field.isAccessible = true
field.set(null, "https://test.example.com")
// ⚠️ Throws IllegalAccessException
JNI 的 SetStaticObjectField 同样会立刻 crash。
谁会踩这个雷?测试框架、Mock 库、灰度切流工具、热修复------基本都用反射改 static final 来切换环境或修复线上 bug。把这些代码全部审一遍。
🔴 雷 4:CameraX 必须升 1.5.2+ / 1.6.0+
⚠️ 这是 Google 在博客里用加粗专门提醒 的一项:使用旧版 CameraX 的 App,在 Android 17 设备上会直接崩溃。
修复方式只有一行:
kotlin
// build.gradle.kts
dependencies {
implementation("androidx.camera:camera-camera2:1.5.2") // 或 1.6.0+
implementation("androidx.camera:camera-lifecycle:1.5.2")
implementation("androidx.camera:camera-view:1.5.2")
}
如果你用的是 Camera1 或 Camera2 原生 API,可以用 Google 提供的 Camera Migration Agent Skill,自动迁移到 CameraX。
意义
这 4 颗雷里,CameraX 必须 24 小时内修,反射/MessageQueue 排进本周,内存限制可以排到本月。次序错了,就是线上事故。
该如何升级?

未来 1-2 个月,国内外主流厂商都会陆续推送,但升级节奏不要乱,按这个顺序走最稳:
✅ 本周 · 必修 4 件事(防线上事故)
- 1:CameraX 全工程检查,升到 1.5.2+ 或 1.6.0+
- 2:搜全工程
getDeclaredField+setAccessible(true),定位所有反射改 static final 的代码 - 3:搜全工程
MessageQueue反射访问,包括第三方 APM 库 - 4:接入
MemoryLimiter监控代码,知道自己有没有被杀
✅ 本月 · 适配 targetSDK 37
- 1:把
compileSdk改成 37,先解决编译报错 - 2:逐项过
behavior-changes-17官方页面,标记受影响项 - 3:大屏适配自检 --- 用 Pixel Tablet 模拟器跑核心流程
- 4:Activity 重建行为 --- 决定要不要加
android:recreateOnConfigChanges
✅ 本季度 · 战略接入
- 1:AppFunctions 上车 --- 申请 Gemini EAP,把 1-2 个核心功能暴露为 Agent 工具
- 2:Continue On --- 多设备用户多的 App 优先做
- 3:Compose 迁移规划 --- 至少做出"3 年内 Compose 占比 80%"的路线图
⚠️ 兼容性检查清单(不止 4 颗大雷)
| 检查项 | 命中条件 | 修复成本 |
|---|---|---|
| Camera1/Camera2 旧版 API | 直接调用 | 🔴 高 - 建议迁移 CameraX |
反射改 private 字段 |
getDeclaredField + setAccessible |
🟡 中 - 逐个改 |
usesCleartextTraffic |
明文 HTTP | 🟢 低 - 改用 NetworkSecurityConfig |
| 后台音频 / 焦点 | requestAudioFocus 在后台 |
🟡 中 - 改用 FGS |
| 自定义通知大尺寸视图 | RemoteViews 超尺寸 |
🟢 低 - 改用标准通知模板 |
| NPU 直接访问 | 用 LiteRT / NNAPI / 厂商 SDK | 🟢 低 - manifest 声明特性 |
总结
升级 targetSDK 不是技术问题,是项目管理问题。把上面三个时间段的工作量做成 Jira ticket,比抱着官方文档死磕高效 10 倍。
最后总结
最后,想再强调一次开头那句判断------Android 17 不是版本号 +1,是 Android 换地基:
- 1:把每个 App 变成 AI 可调用工具(AppFunctions + 设备端 MCP),入口从图标变成 Agent
- 2:把 Compose 优先写进官宣文件,View 系正式进入维护模式
- 3:用 大屏强制 + 内存限制 + 静态字段锁死,逼整个生态把多年的技术债结清
这些都不是让 App 更强的特性,而是让整个 Android 生态更健康的规则。
📎 参考资料
- Android Developers Blog :android-developers.googleblog.com/2026/06/And...
- Android 17 官方功能与 API 文档:developer.android.com/about/versi...