Android 17 Beta 3 今天正式发布,标志着该版本已达到平台稳定性阶段。这意味着 API Surface 已锁定;您可以执行最终兼容性测试,并将以 Android 17 为目标平台的应用推送到 Play 商店。此外,Beta 3 还带来了许多新功能,可帮助您构建更出色、更安全且高度集成的应用。
让您的应用、库、工具和游戏引擎做好准备!
如果您开发的是 SDK、库、工具或游戏引擎,那么现在就准备好任何必要的更新就更为重要,这样可以防止下游应用和游戏开发者因兼容性问题而受阻,并使他们能够以最新的 SDK 功能为目标。如果需要进行更新才能完全支持 Android 17,请告知您的下游开发者。
测试过程包括:在运行 Android 17 Beta 3 的设备或模拟器上,通过 Google Play 或其他方式安装您的正式版应用或使用您的库或引擎的测试应用。完成应用的所有流程,并查找功能或界面问题。查看行为变更,以便有针对性地进行测试。每个 Android 版本都包含一些平台变更,旨在提升隐私保护、安全性和整体用户体验,这些变更可能会影响您的应用。以下是一些需要重点关注的变化:
- 大屏设备上的尺寸调整:一旦您将目标平台设为 Android 17,便无法再选择不维持大屏设备上的屏幕方向、尺寸调整和宽高比限制。
- 动态代码加载:如果您的应用以 Android 17 或更高版本为目标平台,Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护机制现在也适用于原生库。必须将使用 System.load() 加载的所有原生文件标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
- 默认启用 CT:证书透明度 (CT) 默认处于启用状态。(在 Android 16 中,CT 可用,但应用必须选择启用。)
- 本地网络保护:以 Android 17 或更高版本为目标平台的应用默认会被屏蔽本地网络访问权限。请尽可能改用可保护隐私的选择器,并使用新的 ACCESS_LOCAL_NETWORK 权限进行广泛、持续的访问。
媒体和相机增强功能
照片选择器自定义选项
Android 现在允许您定制照片选择器的视觉呈现效果,以便更好地与应用界面相得益彰。通过利用新的 PhotoPickerUiCustomizationParams API,您可以将网格视图宽高比从标准的 1:1 方形修改为 9:16 纵向显示。这种灵活性同时适用于 ACTION_PICK_IMAGES intent 和嵌入式照片选择器,让您能够在用户与媒体互动时保持一致的美感。
我们致力于让可保护隐私的 Android 照片选择器与您的应用体验无缝契合,这些努力都是其中的一部分。详细了解如何将照片选择器直接嵌入到应用中,以提供最原生的体验。
val params = PhotoPickerUiCustomizationParams.Builder()
.setAspectRatio(PhotoPickerUiCustomizationParams.ASPECT_RATIO_PORTRAIT_9_16)
.build()
val intent = Intent(MediaStore.ACTION_PICK_IMAGES).apply {
putExtra(MediaStore.EXTRA_PICK_IMAGES_UI_CUSTOMIZATION_PARAMS, params)
}
startActivityForResult(intent, REQUEST_CODE)支持 RAW14 图片格式: Android 17 通过新的 ImageFormat.RAW14 常量,引入了对 RAW14 图片格式(高端数码摄影的实际业界标准)的支持。RAW14 是一种单通道、每像素 14 位的格式,采用密集封装布局,其中每四个连续像素封装到七个字节中。
供应商定义的相机扩展:Android 17 添加了供应商定义的扩展,使硬件合作伙伴能够定义和实现自定义相机扩展模式,以便您使用最新、最出色的相机功能,例如“智能超清”或先进的 AI 驱动增强功能。您可以使用 isExtensionSupported(int) API 查询这些模式。
摄像头设备类型 API:借助新的 Android 17 API,您可以查询底层设备类型,以确定摄像头是内置硬件、外接 USB 摄像头还是虚拟摄像头。
蓝牙 LE 音频助听器支持
Android 现在包含一个专门针对低功耗蓝牙 (BLE) 音频助听器的设备类别。通过添加 AudioDeviceInfo.TYPE_BLE_HEARING_AID 常量,您的应用现在可以区分助听器和常规耳机。
val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
val devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)
val isHearingAidConnected = devices.any { it.type == AudioDeviceInfo.TYPE_BLE_HEARING_AID }助听器的精细音频路由
Android 17 允许用户独立管理特定系统声音的播放位置。他们可以选择将通知、铃声和闹钟声音发送到已连接的助听器或设备的内置扬声器。
Extended HE-AAC 软件编码器
Android 17 引入了系统提供的扩展 HE-AAC 软件编码器。此编码器使用统一语音和音频编码,同时支持低比特率和高比特率。您可以通过 MediaCodec API 使用名称 c2.android.xheaac.encoder 或通过查询 audio/mp4a-latm MIME 类型来访问此编码器。
val encoder = MediaCodec.createByCodecName("c2.android.xheaac.encoder")
val format = MediaFormat.createAudioFormat(MediaFormat.MIMETYPE_AUDIO_AAC, 48000, 1)
format.setInteger(MediaFormat.KEY_BIT_RATE, 24000)
format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectXHE)
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)性能和电池增强功能
通过为“空闲时允许”闹钟提供监听器支持,减少唤醒锁
Android 17 引入了 AlarmManager.setExactAndAllowWhileIdle 的新变体,该变体接受 OnAlarmListener 而不是 PendingIntent。这种基于回调的新机制非常适合目前依赖持续唤醒锁来执行周期性任务的应用,例如维护套接字连接的即时通讯应用。
val alarmManager = getSystemService(AlarmManager::class.java)
val listener = AlarmManager.OnAlarmListener {
// Do work here
}
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 60000,
listener,
null
)隐私权更新
系统提供的位置信息按钮
Android 即将推出系统呈现的位置信息按钮,您可以使用 Android Jetpack 库将其直接嵌入到应用的布局中。当用户点按此系统按钮时,您的应用仅在当前会话中获得精确位置信息访问权限。如需实现此功能,您需要声明 USE_LOCATION_BUTTON 权限。
针对触控键盘和实体键盘的独立密码显示设置
此功能将现有的“显示密码”系统设置拆分为两个不同的用户偏好设置:一个用于触控输入,另一个用于实体(硬件)键盘输入。现在,默认情况下,通过实体键盘输入的字符会立即隐藏。
val isPhysical = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD val shouldShow = android.text.ShowSecretsSetting.shouldShowPassword(context, isPhysical)
安全
强制执行只读动态代码加载
为了提高安全性,防范代码注入攻击,Android 现在强制要求动态加载的原生库必须为只读。如果您的应用以 Android 17 或更高版本为目标平台,则必须事先将使用 System.load() 加载的所有原生文件标记为只读。
val libraryFile = File(context.filesDir, "my_native_lib.so") // Mark the file as read-only before loading to comply with Android 17+ security requirements libraryFile.setReadOnly() System.load(libraryFile.absolutePath)
后量子加密 (PQC) 混合 APK 签名
为了应对未来量子计算技术的进步,Android 正在通过新的 v3.2 APK 签名方案引入对后量子加密 (PQC) 的支持。此方案采用混合方法,将传统签名与 ML-DSA 签名相结合。
用户体验和系统界面
更好地支持外接显示屏上的微件
当应用 widget 在使用 DP 或 SP 单位且像素密度不同的已连接显示屏或外接显示屏上显示时,此功能可提高应用 widget 的视觉一致性。
val options = appWidgetManager.getAppWidgetOptions(appWidgetId) val displayId = options.getInt(AppWidgetManager.OPTION_APPWIDGET_DISPLAY_ID) val remoteViews = RemoteViews(context.packageName, R.layout.widget_layout) remoteViews.setViewPadding( R.id.container, 16f, 8f, 16f, 8f, TypedValue.COMPLEX_UNIT_DIP )
主屏幕上隐藏的应用标签
Android 现在提供了一项用户设置,用于在主屏幕工作区中隐藏应用名称(标签)。确保应用图标独特且易于识别。
桌面互动式画中画
与传统的画中画不同,这些固定窗口在桌面模式下始终位于其他应用窗口之上,同时保持互动性。
val appTask: ActivityManager.AppTask = activity.getSystemService(ActivityManager::class.java).appTasks[0]
appTask.requestWindowingLayer(
ActivityManager.AppTask.WINDOWING_LAYER_PINNED,
context.mainExecutor,
object : OutcomeReceiver<Int, Exception> {
override fun onResult(result: Int) {
if (result == ActivityManager.AppTask.WINDOWING_LAYER_REQUEST_GRANTED) {
// Task successfully moved to pinned layer
}
}
override fun onError(error: Exception) {}
}
)重新设计的屏幕录制工具栏
核心功能
VPN 应用排除设置
通过使用新的 ACTION_VPN_APP_EXCLUSION_SETTINGS intent,您的应用可以启动系统管理的“设置”界面,用户可以在其中选择要绕过 VPN 隧道的应用。
val intent = Intent(Settings.ACTION_VPN_APP_EXCLUSION_SETTINGS)
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}OpenJDK 25 和 21 API 更新
此更新带来了 OpenJDK 21 和 OpenJDK 25 的众多功能和改进,包括最新的 Unicode 支持以及对 TLS 中命名组的增强 SSL 支持。
Android 17 使用入门
您可以注册任何受支持的 Pixel 设备,也可以将 64 位系统映像与 Android 模拟器搭配使用。
- 使用新版 SDK 进行编译,并在反馈页面上报告问题。
- 测试当前应用的兼容性,并了解您的应用是否会受到 Android 17 变更的影响。
如需了解完整信息,请访问 Android 17 开发者网站。
-
产品资讯今天,我们发布了 Android 17,并将其推送到大多数受支持的 Pixel 设备。未来几个月,敬请期待搭载 Android 17 的新设备。
Matthew McCullough • 阅读用时:13 分钟 -
产品资讯今天,在 Android 开发者峰会上,我们宣布广泛推出许多工具和 API,旨在消除日常开发中的阻碍,让您能够更灵活地构建出色的 Android 应用。
Matthew McCullough • 阅读用时:4 分钟 -
产品资讯今天,我们发布了第一组长跨度任务 (LHT),这些任务非常复杂,工程师需要几天甚至一周的时间才能完成。我们还将引入智能体评估,首先从相应模型提供商的智能体开始。
每周通过电子邮件接收最新的 Android 开发洞见。