Android 17 正式发布:AI 终于成了系统能力

前言

近日,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 ListDetailSceneStrategySupportingPaneSceneStrategy 多面板布局
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 生态更健康的规则。


📎 参考资料

相关推荐
xiezhr1 小时前
折腾了半小时,终于让AI能帮我写飞书文档了
人工智能·agent·ai编程
Mike_jia1 小时前
ZbxTable:Zabbix开源报表神器,从运维数据到决策洞察的最后一公里
前端
三少爷的鞋2 小时前
当 UseCase 开始长期监听,它可能已经不是 UseCase 了
android
LinXunFeng10 小时前
Obsidian - 使用 Share Note 分享笔记并自部署
前端·笔记·github
乘风gg14 小时前
为什么AI 时代来临,大部分人吃不到红利
前端·ai编程·claude
恋猫de小郭15 小时前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
IT_陈寒15 小时前
Redis内存爆了,原来我漏掉了这个致命配置
前端·人工智能·后端
恋猫de小郭15 小时前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
Jackson__15 小时前
AI 时代,CLI 正在迎来第二春
ai编程·命令行