产品资讯

Android 17 的第三个 Beta 版

阅读用时:5 分钟
Matthew McCullough
产品管理副总裁,Android 开发者

Android 17 今天通过 Beta 3 正式达成平台稳定性里程碑。这意味着 API 表面已锁定;您可以执行最终的兼容性测试,并将以 Android 17 为目标平台的应用推送到 Play 商店。此外,Beta 3 还带来了许多新功能,可帮助您构建更出色、更安全且高度集成的应用。

让您的应用、库、工具和游戏引擎做好准备!

如果您开发 SDK、库、工具或游戏引擎,那么现在准备任何必要的更新就显得更加重要,这样可以防止下游应用和游戏开发者因兼容性问题而受阻,并允许他们以最新的 SDK 功能为目标。如果需要更新才能完全支持 Android 17,请告知您的下游开发者。

large_Android17Timeline01.png

测试包括使用 Google Play 或其他方式将您的正式版应用或使用您的库或引擎的测试应用安装到运行 Android 17 Beta 3 的设备或模拟器上。完成应用的所有流程,并查找功能或界面问题。查看行为变更,以便确定测试重点。每个 Android 版本都包含一些平台变更,旨在提升隐私保护、安全性和整体用户体验,而这些变更可能会影响您的应用。以下是一些需要重点关注的变更:

  • 大屏幕上的尺寸调整:将目标平台设为 Android 17 后,您将无法再选择停用大屏幕上的屏幕方向、尺寸调整和宽高比限制。
  • 动态代码加载:如果您的应用以 Android 17 或更高版本为目标平台,则 Android 14 中针对 DEX 和 JAR 文件引入的更安全的动态代码加载 (DCL) 保护功能现在也适用于原生库。使用 System.load() 加载的所有原生文件都必须标记为只读。否则,系统会抛出 UnsatisfiedLinkError。
  • 默认启用 CT证书透明度 (CT) 默认处于启用状态。(在 Android 16 上,CT 可用,但应用必须选择启用。)
  • 本地网络保护:以 Android 17 或更高版本为目标平台的应用默认情况下会被阻止访问本地网络。尽可能切换为使用可保护隐私的选择器,并使用新的 ACCESS_LOCAL_NETWORK 实现广泛的持久访问。

媒体和相机增强功能

照片选择器自定义选项

现在,您可以自定义照片选择器的视觉呈现效果,使其更好地与应用的界面相得益彰。利用新的 PhotoPickerUiCustomizationParams API,您可以将网格视图的宽高比从标准的 1:1 正方形修改为 9:16 的纵向显示。这种灵活性不仅适用于 ACTION_PICK_IMAGES intent,还适用于嵌入式照片选择器,让您能够在用户与媒体互动时保持一致的美感。

large_(Default)11aspectratio.png

我们一直在努力让可保护隐私的 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 允许用户独立管理特定系统声音的播放位置。他们可以选择将通知、铃声和闹铃发送到已连接的助听器或设备的内置扬声器。

扩展型 HE-AAC 软件编码器

Android 17 引入了系统提供的扩展型 HE-AAC 软件编码器。此编码器使用统一的语音和音频编码,同时支持低比特率和高比特率。您可以使用名称 c2.android.xheaac.encoder 或通过查询 audio/mp4a-latm MIME 类型,通过 MediaCodec API 访问此编码器。

  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
)

隐私权更新

系统提供的位置信息按钮

localcafe.jpg

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 单位显示时的视觉一致性。

  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
)

主屏幕上隐藏的应用标签

Hiddenapplabelsonthehomescreen.png

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) {}
}
)

重新设计的录屏工具栏

large_Recording-redesign.png

核心功能

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 支持和增强的 SSL 支持(适用于 TLS 中的命名群组)。

Android 17 使用入门

您可以让任何受支持的 Pixel 设备加入,也可以将 64 位系统映像与 Android 模拟器搭配使用

  • 使用新版 SDK 进行编译,并在反馈页面上报告问题。
  • 测试当前应用的兼容性,并了解您的应用是否会受到 Android 17 中变更的影响。

如需了解完整信息,请访问 Android 17 开发者网站

作者:

继续阅读