Android 16 "Pistachio" :“开心果”全面技术深度解析
Android 16 “Pistachio” :“开心果”全面技术深度解析
各位开发者,欢迎来到 Android 的下一纪元。今天,我们正式揭晓代号为“开心果”(Pistachio)的 Android 16,它代表了 Android 平台近年来最重大的飞跃之一。当我们面向消费者的公告会着重宣传其精致的新用户体验时,这篇文章是专为您——那些为 Android 生态系统注入活力的架构师、构建者和创新者——而写的。我们将深入底层,为您详细、技术性地介绍将定义下一波移动应用浪潮的新 API、强大的系统变更以及开创性的工具。
Android 16 建立在三大核心支柱之上:智能体验,赋予您创造预测性和情境感知应用的能力;强化安全,为用户提供前所未有的数据控制权和透明度;以及无缝自适应,确保您的应用在不断扩展的 Android 设备世界中观感完美、体验一致。
这是一篇内容详实的长文,请准备好您喜欢的饮品,安心坐下来。我们需要涵盖的内容很多,从我们下一代的设备端 AI 框架,到抗量子计算加密技术,再到革命性的新 UI 范式。让我们开始吧。
第一部分:设备端 AI 革命:以智能构建
多年来,移动领域的 AI 一直是云端处理的同义词。随着 Android 16 的到来,我们正果断地将重心转移到设备本身。这种方法不仅提供了更快、更灵敏的体验,还通过将敏感数据保留在手机上来增强用户隐私。这得益于一个多方面的策略,涉及硬件抽象、优化的模型和一套强大的新开发者 API。
Gemini Nano 2.0 的深度集成与 AIAgent
的崛起
Android 16 设备端智能的核心是 Gemini Nano 2.0 的深度系统集成,这是我们最高效的设备端模型的新一代进化版。我们已经从一个简单的 API 端点,发展为一个功能齐全、由系统管理的服务,您的应用可以利用它来执行复杂的、低延迟的 AI 任务。
这个新集成的基石是位于 androidx.ai
Jetpack 库中的 AIAgent
API。AIAgent
是一个长生命周期、具备后台感知能力的组件,旨在执行复杂的、有状态的 AI 操作,而无需持久的前台服务,从而节省电池和系统资源。
您可以将 AIAgent
想象成一个专为 AI 设计的 WorkManager
。您定义任务、所需的模型以及它应该运行的条件,系统会处理剩下的事情——包括模型加载、硬件加速和进程管理。
AIAgent
API 的主要特性:
- 有状态会话 (Stateful Sessions): Agent 能够随时间保持上下文。例如,一个摘要 Agent 可以处理一系列文档或对话,构建一个连贯的摘要,而无需重新处理之前的输入。
- 基于触发器的调用 (Trigger-based Invocation): Agent 可以由多种系统事件触发:一张新照片被保存、一个特定类型的通知到达,甚至是用户身体活动的变化。
- 针对 NPU 的硬件抽象层 (HAL): Android 16 引入了一个新的 AI 硬件抽象层。
AIAgent
会自动与此 HAL 对接,以利用来自不同芯片供应商的专用神经处理单元 (NPU),而您无需编写任何特定于供应商的代码。系统会查询 NPU 支持的操作和精度级别(例如 INT8, FP16),并相应地优化模型图。 - 模型管理与缓存 (Model Management and Caching): 系统现在负责管理设备端模型的下载、版本控制和缓存。您可以声明对特定模型的依赖(例如
'google:ai/gemini-nano-2.0/summarize'
),操作系统将与 Google Play 服务协同,确保设备上始终有最高效、最新的版本可用。
以下是一个概念性代码片段,展示了如何定义一个 AIAgent
来在后台自动分类和标记照片:
// 在您的 AndroidManifest.xml 中
<service
android:name=".services.PhotoTaggerAgentService"
android:permission="android.permission.BIND_AI_AGENT"
android:exported="true">
<intent-filter>
<action android:name="androidx.ai.action.AI_AGENT" />
</intent-filter>
</service>
// PhotoTaggerAgent.kt
class PhotoTaggerAgent : AIAgent() {
// 获取一个模型实例
private val imageTagger = Model.getInstance("google:ai/mobilenet-v4/classify")
override suspend fun onTask(params: AgentTaskParams): Result {
val imageUri = params.getUri("imageUri") ?: return Result.failure()
// 系统处理高效的加载和到张量的转换
val inputTensor = Tensor.fromUri(contentResolver, imageUri)
// 模型执行会被卸载到 NPU(如果可用)
val output = imageTagger.execute(inputTensor)
val tags = processOutputToTags(output)
// 将标签保存到数据库或媒体存储
saveTagsForImage(imageUri, tags)
return Result.success()
}
}
// 触发 Agent
fun tagNewPhoto(context: Context, imageUri: Uri) {
val taskRequest = AgentTaskRequest.Builder(PhotoTaggerAgent::class.java)
.addUri("imageUri", imageUri)
// 设置触发条件,例如设备空闲时
.setCondition(Condition.DEVICE_IDLE)
.build()
AIAgentManager.getInstance(context).enqueue(taskRequest)
}
这个强大的抽象层使您能够构建出令人难以置信的智能功能,这些功能感觉就像是操作系统的核心部分,而不是一个附加的进程。
生成式 UI:打造能够自我调整和创造的界面
Jetpack Compose 彻底改变了我们构建 UI 的方式。在 Android 16 中,我们通过引入 生成式 UI (Generative UI) 框架,迈出了合乎逻辑的下一步。这是一个位于 Jetpack 中的全新实验性库:androidx.compose.generative
。
该框架允许您不再使用静态布局来定义 UI 的某些部分,而是使用由提示(prompt)和约束(constraints)来定义,这些提示和约束在运行时由设备端生成模型来完成。这使得创建真正动态、个性化和情境感知的界面成为可能。
工作原理: 一个 GenerativeLayout
Composable 接受一个自然语言提示、一组允许使用的组件和上下文数据作为输入。然后,它使用一个专门的、高度优化的 Gemini 版本来动态生成一个 Compose 布局。
想象一个为用户推荐活动的应用。与其使用一个固定的 LazyColumn
卡片列表,您可以使用 GenerativeLayout
:
import androidx.compose.generative.*
@Composable
fun SuggestionScreen(userContext: UserContext) {
val prompt = "创建一个友好且鼓励人心的布局来推荐活动。" +
"用户当前在 ${userContext.locationType} " +
"天气是 ${userContext.weather}。" +
"提供 2-3 个选项。"
GenerativeLayout(
prompt = prompt,
// 定义允许生成模型使用的组件类型
allowedComponents = setOf(
GenerativeComponent.Card,
GenerativeComponent.Button,
GenerativeComponent.Icon
),
modifier = Modifier.fillMaxSize()
) {
// 这个代码块为模型可以使用的组件提供了 Composable 实现
GenerativeComponent.Card { modifier, content ->
Card(modifier = modifier, elevation = 4.dp) { content() }
}
GenerativeComponent.Button { modifier, onClick, text ->
Button(modifier = modifier, onClick = onClick) { Text(text) }
}
// ... 以此类推
}
}
结果可能是每次查看屏幕时都有一个完全独特的布局,专为用户的即时情境量身定制。在雨天,它可能会生成一个建议“舒适地看场电影”的卡片;而在晴天公园里,它可能会生成另一个带有“寻找附近的小径”按钮的布局。
这是一个实验性的 API,我们才刚刚触及可能性的皮毛。我们预见它将被用于动态的入门引导流程、个性化的购物体验和自适应的教育内容。
第二部分:加固堡垒:隐私与安全的新纪元
用户信任是 Android 生态系统的基石。在每个版本中,我们都提高了安全和隐私的标准,而 Android 16 引入了一些迄今为止对用户和开发者影响最重大的变更。
精细化数据访问审计与即时说明
多年来,用户在安装时或运行时授予权限,但“之后发生了什么”通常是一个黑匣子。Android 16 通过 隐私信息中心 2.0 (Privacy Dashboard 2.0) 和 PermissionLog
API 改变了这一点。
新的隐私信息中心现在为用户提供任何敏感数据访问的详细、带时间戳的事件日志。用户不仅能看到某个应用使用了他们的位置,还能看到_何时_使用、使用了_多长时间_,以及至关重要的,开发者为该次访问提供的理由。
这得益于全新的 PermissionLog
API。现在,当您执行需要敏感权限的操作时,系统强烈建议您记录一个上下文相关的字符串来解释_为什么_。这不仅仅是一条注释;它是一个结构化的数据,系统用它来填充用户的隐私信息中心。
// 在您的定位服务中
val justification = "为您的搜索查找附近的餐馆。"
// 一个应用定义的归因标签
val attributionTag = "restaurant-search"
try {
// 使用新的 withJustification API
locationManager.withJustification(justification, attributionTag) {
val location = it.getCurrentLocation("gps")
// ... 处理位置信息
}
} catch (e: SecurityException) {
// 处理权限被拒绝的情况
}
这个简单的补充具有深远的影响。它促进了透明度,让开发者对他们的数据使用负责,并为用户提供了做出明智决策所需的信息。那些持续提供清晰理由的应用更有可能留住用户的信任和权限。
动态沙盒与资源控制
Android 的应用沙盒是其安全模型的基石。在 Android 16 中,这个沙盒变得动态化。系统现在可以根据应用的实时行为和上下文,动态调整其沙盒可用的资源和能力。
我们引入了一个新的清单属性 <uses-context>
,允许您为不同的应用状态声明不同的能力集。
<manifest ...>
<application ...>
<uses-context android:name="FullFunctionality">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
</uses-context>
<uses-context android:name="WidgetView">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</uses-context>
<activity ...>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.context" android:value="FullFunctionality" />
</activity>
<receiver android:name=".MyAppWidgetProvider" ...>
<meta-data android:name="android.app.context" android:value="WidgetView" />
</receiver>
</application>
</manifest>
当用户与您的主 Activity 交互时,应用的沙盒拥有 “FullFunctionality” 上下文,可以访问精细位置和相机。然而,当只有您的应用小部件在主屏幕上活动时,系统可以将沙盒缩小到 “WidgetView” 上下文,撤销相机访问权限并将位置降级为粗略位置。
这种最小权限原则是动态强制执行的,当您的应用不在前台或其全部功能并非必需时,极大地减少了应用的攻击面。
面向未来的抗量子计算加密技术
虽然来自量子计算机的威胁仍在遥远的地平线上,但我们相信要为长远未来做准备。Android 16 引入了对抗量子计算加密技术 (Quantum-Resistant Cryptography, QRC) 算法的支持,用于应用签名和安全通信。
KeyStore
提供程序现在支持用于密钥建立的 CRYSTALS-Kyber 和用于数字签名的 CRYSTALS-Dilithium。虽然这些默认并未启用,但我们现在提供它们,以便高安全性应用(例如银行、政府、关键基础设施)的开发者可以开始试验和规划他们的过渡。
您可以这样生成一个兼容 QRC 的密钥对:
// 需要 API 级别 36
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
"Dilithium", "AndroidKeyStore");
KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(
"my_qrc_alias",
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setAlgorithmParameterSpec(new DilithiumParameterSpec(DilithiumParameterSpec.DILITHIUM3))
.setDigests(KeyProperties.DIGEST_SHA256)
.build();
keyPairGenerator.initialize(spec);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
我们也在与 IETF 和其他标准组织合作,将 QRC 集成到 TLS 和其他基础协议中。这是一项前瞻性的功能,但它被包含在 Android 16 中,表明了我们对平台长期安全的承诺。
第三部分:更流畅、更具适应性的用户体验
Android 设备的多样性是其最大的优势之一。Android 16 引入了强大的新工具和系统行为,以确保您的应用能够无缝适应任何屏幕尺寸或设备形态,从小型折叠屏的封面屏幕到大型桌面显示器。
“连续体”项目 (Project Continuum):真正的跨设备状态转移
在我们的跨设备 SDK (Cross-Device SDK) 的基础上,Android 16 引入了 “连续体”项目 (Project Continuum),这是一个用于无缝应用状态转移和交互的系统级框架。这远不止简单的通知共享;它旨在让您的应用感觉像是一个单一、连续的体验,在用户的设备之间自由流动。
Project Continuum 的核心是新的 ContinuumManager
和 TransferableSession
(可转移会话)的概念。您现在可以将应用 UI 的一部分和其状态封装到一个 TransferableSession
中,然后可以将其交接给另一台设备。
想象一下,一个用户正在手机上的购物应用中浏览产品列表。当他们打开平板电脑时,系统会弹出一个提示,询问他们是否想继续他们的会话。如果他们接受,您在平板电脑上的应用将打开到完全相同的产品列表,并保持相同的滚动位置。
以下是您如何使一个会话可转移:
// 在您的产品列表 Activity/Composable 中
val continuumManager = getSystemService(ContinuumManager::class.java)
// 定义恢复此状态所需的数据
val sessionState = bundleOf(
"list_query" to currentQuery,
"scroll_position" to lazyListState.firstVisibleItemIndex
)
val transferableSession = TransferableSession.Builder(sessionState)
.setTargetActivity(ProductListActivity::class.java)
.setSessionTitle("继续购物")
.setIcon(R.drawable.ic_shopping_bag)
.build()
// 发布会话,使其可被转移
continuumManager.publishSession(transferableSession)
// 在接收设备的 ProductListActivity 的 onCreate() 中
if (intent.action == ContinuumManager.ACTION_RESTORE_SESSION) {
val sessionState = intent.getBundleExtra(ContinuumManager.EXTRA_SESSION_STATE)
val query = sessionState.getString("list_query")
val scrollPosition = sessionState.getInt("scroll_position")
// 恢复 UI 状态
viewModel.loadProducts(query)
lazyListState.scrollToItem(scrollPosition)
}
Project Continuum 还引入了共享画布 (Shared Canvases),允许实时的、多用户的交互。例如,两个用户可以共同在一个绘图或文档上协作,他们的输入通过系统管理的低延迟连接在设备间同步。这为协作游戏、生产力工具和创意应用开辟了难以置信的可能性。
Material You 的演进:“活性调色板” (Living Palettes)
Material You 为 Android 带来了动态颜色主题。Android 16 以 “活性调色板” (Living Palettes) 的概念发展了这一理念。系统现在可以根据上下文(例如一天中的时间、环境光照条件(如果传感器可用),甚至是屏幕上当前内容的主色调)来巧妙地改变 UI 的强调色。
对开发者而言,这意味着您的应用主题能够感觉更融入环境,对用户的环境做出更灵敏的响应。Jetpack Compose 中的 MaterialTheme
现在包含了新的可选属性:
MaterialTheme(
colorScheme = colorScheme,
typography = Typography,
// Android 16 中的新功能
enableLivingPalettes = true,
onContextualColorChange = { newColorScheme ->
// 当调色板变化时,可选择性地获得回调
// 以便在需要时更新非 Material 组件
}
) {
// 您的应用 UI
}
当 enableLivingPalettes
为 true 时,随着上下文的变化,系统将对您主题中的 primary
和 secondary
颜色角色应用微妙的、动画化的过渡。对于所有标准的 Material 组件,这都是自动处理的。其结果是一个感觉充满活力、与现实世界联系更紧密的 UI。
面向大屏幕的高级窗口 API
随着折叠屏、平板电脑和 ChromeOS 设备的普及,为大屏幕构建应用已不再是可选项。Android 16 提供了一套高级窗口 API,使构建复杂的、多窗格的布局比以往任何时候都更容易。
Jetpack 中新的 SlidingPaneLayout2
和 FoldableLayout
组件提供了声明式的、Compose-first 的方式来创建自适应 UI。它们能够感知设备的物理属性,例如铰链位置和方向。
一个关键的补充是 PaneAnchor
API。您现在可以将一个窗格或对话框“锚定”到另一个窗格。当用户调整布局大小时,被锚定的组件将智能地重排或重新定位,以维持其与锚点的空间关系。这对于创建复杂的 UI(如图像编辑器,其中工具面板应始终靠近主画布)非常有价值。
// 将工具面板锚定到画布的示例
Box(modifier = Modifier.fillMaxSize()) {
val canvasPaneId = "canvas"
val toolsPaneId = "tools"
// 主要内容窗格
Surface(modifier = Modifier.paneId(canvasPaneId)) {
// ... 您的图像画布
}
// 工具面板,锚定到画布
DraggablePane(
modifier = Modifier.paneId(toolsPaneId),
anchorTo = canvasPaneId,
anchorEdge = PaneAnchor.Edge.End,
margin = 16.dp
) {
// ... 您的工具按钮
}
}
第四部分:底层探秘:性能、功耗与核心系统变更
虽然新功能和 API 令人兴奋,但任何伟大操作系统版本的基础都是性能和可靠性。Android 16 在 Android 运行时 (ART)、线程管理和功耗方面包含了重大的工作,以确保您的应用运行得更快、更高效。
ART 优化:基于配置文件的 Dex 布局
Android 运行时 (ART) 在 Android 16 中获得了重大升级。我们正在引入基于配置文件的 Dex 布局 (Profile-Guided Dex Layouts)。从历史上看,您的 classes.dex
文件中类的布局方式对编译器来说是方便的。然而,这常常导致运行时内存局部性差,因为系统需要从文件的不同部分加载代码,从而导致频繁的页面错误。
现在,当您将应用上传到 Play 商店时,我们可以使用来自真实用户的、匿名的聚合启动配置文件,来重新排序您的 dex 文件的布局。热代码——应用启动所需的类和方法——被打包在一起放在文件的开头。很少使用的冷代码被移到末尾。
结果如何?在启动期间,系统需要从闪存中读取的数据大大减少,从而导致 I/O 显著降低和更快的启动时间。仅凭此功能,我们在许多流行应用上看到了 15-30% 的启动改进,而开发者无需进行任何代码更改。
“绿色线程”与主线程调度
确保流畅、无卡顿的 UI 是一个永恒的挑战。Android 16 为 UI 工作引入了一个名为 “绿色线程” (Green-Threading) 的新概念。这是一种专门为主线程上的任务设计的协作式、用户空间线程模型。
当您向主线程 Looper
发布一系列任务时,系统现在可以分析这些任务,并且如果它们被标记为 interruptible
(可中断的),系统可以交错执行它们。这可以防止单个长时间运行的任务(例如,复杂布局的解析、错误地在主线程上进行数据库查询)阻塞短而关键的任务(例如,输入事件处理、动画帧)。
新的 Handler.postInterruptible()
方法允许您发布一个 Runnable
,系统可以在处理其他工作时暂停和恢复它。
// 发布一个可能耗时较长但可中断的任务
mainThreadHandler.postInterruptible(new Runnable() {
@Override
public void run() {
// 执行一个复杂的、非关键的更新。
// 系统可能会在这里暂停执行以处理一个输入事件,
// 然后再恢复它。
}
});
这一点,再加上对 Choreographer
回调的更智能调度,带来了可证实的更平滑的用户体验,尤其是在中低端设备上。
面向物联网和常开应用的超低功耗模式
对于物联网 (IoT) 设备和需要在电池上长时间运行的应用,Android 16 引入了一种新的超低功耗模式 (Ultra-Low Power Mode)。这是一个比 Doze 更深度的睡眠状态,专为无头或最小化 UI 的设备设计。
当设备进入此模式时,应用处理器几乎完全断电。只有一个小型的、高能效的协处理器保持活动状态,能够监控特定的传感器输入或网络触发器。
开发者可以使用新的 PowerManager.requestUltraLowPowerState()
API 注册一个将由协处理器触发的 PendingIntent
。这允许设备仅在发生特定的、预定义的事件时才唤醒——例如 GPIO 引脚变化、蓝牙 LE 广播或特定的 MQTT 消息——而无需主 CPU 轮询它。对于某些用例,这可以将电池寿命从几天延长到数月。
第五部分:开发者工具箱:全新 API 与工具
一个新的操作系统的好坏取决于您用于为其构建应用的工具。Android 16 伴随着 Android Studio 的重大更新以及一系列新的 Jetpack 库和测试 API。
Android Studio “水母” (Jellyfish)
最新版本的 Android Studio,代号为“水母”(Jellyfish),充满了 AI 驱动的功能和针对 Android 16 的深度集成。
- 实时 AI 调试 (Live AI Debugging): 当您的应用遇到断点或崩溃时,Android Studio 中新的 AI 助手不仅会向您显示堆栈跟踪,还会提供对可能原因的自然语言解释,并建议具体的代码修复方案。
- 生成式 UI 原型设计 (Generative UI Prototyping): Android Studio 中一个新的设计界面允许您可视化地为
GenerativeLayouts
制作原型。您可以编写提示,实时查看生成的 UI,然后将结果转换为 Compose 代码。 - 连续体模拟器 (Continuum Emulator): 设备模拟器现在支持多设备配置。您可以启动一个相互连接的虚拟手机和一个虚拟平板电脑,让您直接在 IDE 中测试
TransferableSession
的交接和其他跨设备功能。
Jetpack Compose 2.0 与新库
Android 16 的发布与 Jetpack Compose 2.0 的发布同步。这是一个重要的里程碑,专注于性能和可扩展性。底层的槽位表 (slot table) 架构已被重写以提高效率,减少了重组 (recomposition) 开销和内存使用。
除了核心的 Compose 更新,我们还引入了几个新的 Jetpack 库:
androidx.ai
:AIAgent
和其他设备端 AI 组件的归属地。androidx.compose.generative
: 实验性的生成式 UI 框架。androidx.window.pane
: 用于高级窗口的新的SlidingPaneLayout2
和PaneAnchor
API 的归属地。androidx.security.quantum
: 为新的 QRC 加密 API 提供兼容性包装器。
入门指南与时间线
我们知道您渴望上手 Android 16。第一个开发者预览版 (Developer Preview) 今天已可用于 Google Pixel 设备(Pixel 7 及更新型号),并通过 Android Studio Jellyfish 中的官方 Android 模拟器提供。
与往常一样,此初始版本仅供开发者使用,不适合日常使用。我们鼓励您从以下几点开始:
- 设置 SDK 和模拟器: 从 Android Studio 获取最新的构建版本。
- 测试行为变更: Android 16 包含了对权限处理、后台执行和核心系统库的变更。第一步是将您现有的应用针对新 SDK 进行编译,并运行您的测试套件,以识别任何直接的问题。我们的迁移指南中有完整的重大变更列表。
- 探索新 API: 在一个单独的开发分支上开始试验新功能。尝试实现一个简单的
AIAgent
,使用新的窗口 API 使 UI 具有自适应性,或记录一条PermissionLog
理由。
发布时间线将遵循我们既定的模式:
- 开发者预览版: 2月 - 3月
- Beta 版: 4月 - 6月
- 平台稳定性: 6月
- 最终版本: 2025 年第三季度
我们将在每个里程碑提供定期的更新、新的 API 和错误修复。
结论:共同构建未来
Android 16 “开心果” 不仅仅是一次增量更新。它是对移动操作系统可以是什么的一次根本性反思——比以往任何时候都更智能、更安全、更具适应性。从设备端 AI 的深度集成,到对用户隐私和跨设备流动性的范式转变方法,这个版本为您提供了一块强大的新画布,您可以在上面创造下一代的应用程序。
这篇博文仅仅是冰山一角。在接下来的几周和几个月里,我们将针对此处讨论的每个主要功能领域发布深度解析文章,附有更详细的代码示例、设计指南和最佳实践。
Android 的旅程一直是一个协作的旅程。您的反馈、您的创造力和您的热情是推动平台前进的动力。我们邀请您下载开发者预览版,探索新的 API,并加入我们在开发者论坛和问题跟踪器上的讨论。
我们无比期待看到您将用 Android 16 构建出怎样的精彩。未来是智能的、安全的、自适应的——这是一个我们将共同构建的未来。