Android 13 面向开发者引入了一些出色的新功能和 API。以下几部分内容可帮助您了解适用于您的应用的功能并开始使用相关 API。
有关新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档 - 新 API 会突出显示以方便查看。此外,如需了解平台变更可能会在哪些方面影响您的应用,请务必查看会影响以 Android 13 为目标平台的应用和所有应用的 Android 13 行为变更。
开发者工作效率和工具
带主题的应用图标
从 Android 13 开始,您可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的 Android 启动器中应用图标的色调,以继承所选壁纸和其他主题的配色。
如需支持此功能,您的应用必须提供自适应图标和单色应用图标,并通过清单中的 <adaptive-icon>
元素指向该单色应用图标。如果用户启用了带主题的应用图标(换句话说,在系统设置中开启了带主题的图标切换开关),而启动器支持此功能,则系统将使用用户选择的壁纸和主题来确定色调颜色,然后该颜色将应用于单色应用图标。
在以下任何情况下,主屏幕都不会显示带主题的应用图标,而是显示自适应或标准应用图标:
- 如果用户未启用带主题的应用图标
- 如果您的应用不提供单色应用图标
- 如果启动器不支持带主题的应用图标
如需更多详细信息和说明,请参阅自适应图标。
各应用语言偏好设定
在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下功能:
系统设置:用户可以在这个集中位置为每个应用选择首选语言。
您的应用必须在应用的清单中声明
android:localeConfig
属性,以告知系统它支持多种语言。如需了解详情,请参阅有关创建资源文件并在应用的清单文件中声明资源的说明。其他 API:借助这些公共 API(例如
LocaleManager
中的setApplicationLocales()
和getApplicationLocales()
方法),应用可以在运行时设置不同于系统语言的其他语言。这些 API 会自动与系统设置同步;因此,使用这些 API 创建自定义应用内语言选择器的应用将确保用户获得一致的用户体验,无论他们在何处选择语言偏好设置。公共 API 还有助于减少样板代码量、支持拆分 APK,并且支持应用自动备份,以存储应用级的用户语言设置。
为了向后兼容以前的 Android 版本,AndroidX 中也提供了等效的 API。我们建议使用 Appcompat 1.6.0-beta01 或更高版本中添加的 API。
不支持多种语言的应用不受这些变更的影响。
改进了文本和语言支持
Android 13 引入了多项文本和语言功能改进,可帮助您提供更完善的体验,详见以下部分:
更快断字
断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。从 Android 13 开始,断字性能提升了高达 200%,因此您可以在 TextView
中启用更快断字功能,而几乎不会影响渲染性能。如需启用更快断字功能,请在 setHyphenationFrequency()
中使用 fullFast
或 normalFast
频率。
文本转换 API
使用日语和中文等语言的用户会使用拼音输入法,这通常会导致搜索以及自动填充等功能的执行速度变慢。在 Android 13 中,应用可以调用新的文本转换 API,以便用户更快、更轻松地找到所需内容。例如,以前日语用户在进行搜索时需要执行以下步骤:
- 输入平假名作为其搜索字词(例如地点或应用名称)的发音
- 使用键盘将平假名字符转换为日语汉字
- 使用日语汉字字符重新进行搜索
- 最后获得搜索结果
使用新的文本转换 API 时,日语用户可以输入平假名,然后不经过第 2 步和第 3 步就立即看到实时的日语汉字搜索结果。
改进了非拉丁字母的行高
Android 13 通过使用适合每种语言的行高,改进了非拉丁文字(例如泰米尔语、缅甸语、泰卢固语和藏语)的显示。新的行高可防止字符被裁剪并改进了字符的放置。您的应用只需要以 Android 13 为目标平台就可以利用这些改进。请确保在采用新的行间距后对应用进行测试,因为这些更改可能会影响非拉丁语的界面。
改进了日语文本换行
从 Android 13 开始,TextView 可以按 Bunsetsu(最小自然语素单元)或短语而非字符进行文本换行,从而让日语应用界面更加美观,更易于理解。可以通过将 android:lineBreakWordStyle="phrase"
与 TextView 结合使用来利用此换行方式。
Unicode 库更新
Android 13 添加了一些最新改进、修复和变更,均包含在 Unicode ICU 70、Unicode CLDR 40 和 Unicode 14.0 中。
以下是两项显著变更:
- 英语(加拿大)
en‑CA
和英语(菲律宾)en‑PH
在无可用的翻译资源时均使用英语(美国)en
翻译资源,而非英语(英国)en‑GB
翻译资源。 - 针对西班牙语
es
、意大利语it
、葡萄牙语pt
和葡萄牙语(葡萄牙)pt‑PT
引入了many
复数类别。与 CLDR v38 中引入的法语类似,此类别适用于大数目。
彩色矢量字体
从 Android 13 开始,系统为 COLR 版本 1 (COLRv1) 字体提供渲染支持,并将系统表情符号更新为 COLRv1 格式。COLRv1 是一种高度紧凑的字体格式,该字体在任意尺寸下都可以快速清晰地呈现。
对于大多数应用,系统会处理所有工作,COLRv1 可以正常使用。不过,如果您的应用使用系统字体来实现自己的文本呈现,建议您对表情符号呈现进行测试。
如需详细了解 COLRv1,请参阅以下资源:
Quick Settings Placement API
通过通知栏中的“快捷设置”,用户可无需离开应用上下文就能方便地更改设置或执行快速操作。对于提供自定义图块的应用,用户可以更轻松地发现图块并将其添加到“快捷设置”。借助新的图块放置 API,您的应用现在可以提示用户直接将自定义图块添加到一组有效的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。
剪贴板预览
从 Android 13 开始,将内容添加到剪贴板时,系统会显示标准视觉确认界面。新确认界面会执行以下操作:
- 确认内容已成功复制。
- 提供所复制内容的预览。
此功能可将应用在用户复制内容后显示的各种通知标准化,并让用户可以更好地控制剪贴板。如需了解详情,请访问复制和粘贴功能页面。
预测性返回手势
Android 13 针对手机、大屏设备和可折叠设备等 Android 设备引入了预测性返回手势。如需支持此功能,您需要更新应用。
如需查看详细文档,请参阅更新应用以支持预测性返回手势。您还可以尝试完成我们的 Codelab。
蓝牙 LE 音频
低功耗 (LE) 音频是一种无线音频,旨在取代传统蓝牙并支持特定的应用场景和连接拓扑。通过该技术,用户能够与朋友和家人分享音频内容以及播放音频给他们听,也可以订阅信息、娱乐或无障碍用途的公共广播内容。 这项新技术可以确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换,这是传统蓝牙技术无法实现的。从 Android 13 开始,系统为 LE 音频提供内置支持,因此开发者可以在兼容设备上免费获得这些功能。
MIDI 2.0
从 Android 13 开始,系统支持 MIDI 2.0 标准,包括能够通过 USB 连接 MIDI 2.0 硬件。此标准提供了诸如提高控制器分辨率、更好地支持非西方语调以及使用按音符控制器时更具表现力的功能等。
提高了启动画面效率
Android 13 提高了 Splash Screen API 中的动画启动画面的效率:
系统会直接从
AnimatedVectorDrawable
推断动画时长。在 Android 13 之前,必须直接设置windowSplashScreenAnimationDuration
。使用新的
windowSplashScreenBehavior
属性可以更好地控制应用是否始终在 Android 13 及更高版本中的启动画面上显示该图标。
如需查看详细文档,请参阅启动画面。
ART 优化
在 Android 13(API 级别 33)及更高版本中,ART 可大大加快在原生代码之间切换的速度,JNI 调用速度现在最高可提高 2.5 倍。我们还重新设计了运行时引用处理,使其大部分都为非阻塞处理,从而进一步减少了卡顿。此外,您还可以使用 Reference.refersTo()
公共 API 更快地回收无法访问的对象,并且您会发现,由于优化了类和方法查找,解释器现在运行速度更快。ART 还会在安装时执行更多字节码验证,避免了在运行时进行验证的开销,并缩短了应用启动时间。
隐私保护和安全性
更安全地导出上下文注册的接收器
为了帮助提高运行时接收器的安全性,Android 13 引入了一项功能,可让您的应用指定是否应导出已注册的广播接收器并使其对设备上的其他应用可见。在以前的 Android 版本中,设备上的任何应用都可以向动态注册的接收器发送不受保护的广播,除非该接收器受签名权限的保护。
此导出配置适用于执行以下至少一项操作的应用:
- 使用 AndroidX 核心库 1.9.0 或更高版本中的
ContextCompat
类。 - 以 Android 13 或更高版本为目标平台。
照片选择器
Android 13(API 级别 33)及更高版本引入了照片选择器体验。应用启动照片选择器时,用户可选择与应用分享特定图片和视频(如个人资料照片),而不是授予应用查看整个媒体库的权限。这是访问用户照片和视频的建议方法。
照片选择器可为用户提供更好的隐私保护,因为您的应用无需声明任何运行时权限。此外,照片选择器还为应用提供内置标准化界面,从而打造更一致的用户体验。
针对附近 Wi-Fi 设备的新运行时权限
Android 13(API 级别 33)在 NEARBY_DEVICES
权限组中引入了一项新的运行时权限,它适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。这些应用在调用多个不同的 Wi-Fi API 时必须声明新的权限 NEARBY_WIFI_DEVICES
。此外,只要应用不会通过 Wi-Fi API 推导物理位置,那么在以 Android 13 或更高版本为目标平台时,就无需声明 ACCESS_FINE_LOCATION
权限。
详细了解附近 Wi-Fi 设备权限。
使用精确闹钟的新权限
如果您的应用以 Android 13 或更高版本为目标平台,您可以使用自动授予应用的 USE_EXACT_ALARM
权限。不过,您的应用若要使用此权限,必须至少满足以下条件之一:
- 您的应用是闹钟应用或计时器应用。
- 您的应用是日历应用,可显示即将进行的活动的通知。
如果您的应用设置了精确闹钟,但不符合前面列表中显示的任一情况,请改为继续声明 SCHEDULE_EXACT_ALARM
权限,并为用户拒绝授予您应用相应访问权限的情况做好准备
开发者可降级权限
从 Android 13 开始,您的应用可以撤消未使用的运行时权限。此 API 可让您的应用执行增强隐私权的任务,如下所示:
- 撤消未使用的权限。
- 遵循权限最佳做法,从而提高用户信任度。您可能需要考虑向用户显示一个对话框,其中会显示您主动撤消的权限。
APK 签名方案 v3.1
Android 13 可支持 APK 签名方案 v3.1,此方案在现有的 APK 签名方案 v3 的基础上进行了改进,此方案解决了 APK 签名方案 v3 的一些已知问题。具体而言,v3.1 签名方案支持 SDK 版本定位功能,这会允许轮替定位到平台的更高版本。
v3.1 签名方案使用在 12L 或更低版本中无法识别的分块 ID。因此,平台会应用以下签名者行为:
- 搭载 Android 13 或更高版本的设备使用 v3.1 分块中的轮替签名者。
- 搭载旧版 Android 的设备会忽略轮替签名者,而使用 v3.0 分块中的原始签名者。
尚未轮替其签名密钥的应用无需执行任何其他操作。每当这些应用选择轮替时,系统都会默认应用 v3.1 签名方案。
已经轮替并希望继续使用 v3.0 签名分块中的轮替签名密钥的应用需要更新其 apksigner
调用:
apksigner sign --ks keystore.jks | --key key.pk8 --cert cert.x509.pem --rotation-min-sdk-version API_LEVEL [signer_options] app-name.apk
…其中 API_LEVEL
为 32 或更低的值。
改进了密钥库和 KeyMint 中的错误报告功能
对于生成密钥的应用,密钥库和 KeyMint 现在提供更加详细且更准确的错误指示器。我们在 java.security.ProviderException
下添加了一个异常类层次结构,包含了特定于 Android 的异常,其中包括 Keystore/KeyMint 错误代码,以及错误是否可重试。您还可以修改密钥生成方法和使用方法(签名、加密),以抛出新的异常。改进的错误报告并不仅限于生成密钥,现在应为您提供重试密钥生成所需的内容。
平板电脑和大屏设备支持
Android 13 基于 Android 12 中引入的平板电脑优化和 Android 12L 功能更新构建而成 - 包括针对系统界面的优化、更出色的多任务处理功能和改进的兼容模式。在测试过程中,请确保您的应用在平板电脑和其他大屏设备上拥有最佳显示效果。
如需详细了解新功能和测试内容,请参阅平板电脑和大屏设备支持页面。
图形
可编程的着色器
从 Android 13 开始,系统支持可编程 RuntimeShader
对象,其行为通过 Android 图形着色语言 (AGSL) 定义。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。
Android 在内部使用这些着色器来实现涟漪效果、模糊和拉伸滚动。通过 Android 13 及更高版本,您可以为应用创建类似的高级效果。
改进了 Choreographer
Android 13 为 Choreographer
和 ASurfaceControl
引入了公共 API 方法,可为应用提供关于可能的帧时间轴的更多信息,并为 SurfaceFlinger
添加关于帧生命周期的更多上下文。与之前类似,应用可以向 Choreographer
发布回调并接收帧时间轴信息。在 Android 13(API 级别 33)中,Choreographer
会返回多个可能的呈现时间及其对应的帧截止期限。应用可以选择呈现时间,然后通知所选择的 SurfaceFlinger
。随后,SurfaceFlinger
将不会在预期的呈现时间之前尝试应用事务或锁存缓冲区。
相机
HDR 视频拍摄
从 Android 13 开始,Camera2 API 支持高动态范围 (HDR) 视频拍摄功能,可允许您使用相机来预览和录制 HDR 视频内容。与标准动态范围 (SDR) 相比,HDR 提供了更广泛的颜色范围,并增加了亮度分量的动态范围(从当前的 100 cd/m2 增加到 1000 cd/m2)。 这样可以确保视频画质更符合现实世界,颜色更丰富,亮度更高,阴影更暗。
如需详细了解 HDR 视频拍摄,请参阅 HDR 视频拍摄文档。
媒体
空间音频
空间音频是一种沉浸式音频体验,可让您的媒体内容听起来更逼真。如需详细了解如何与此功能集成,请参阅我们的空间音频文档。
预期音频路由
为了帮助媒体应用确定其音频的路由方式,Android 13 在 AudioManager
类中添加了新的音频路由 API。getAudioDevicesForAttributes()
API 可允许您检索可以用于播放指定音频的设备列表。getDirectProfilesForAttributes()
可帮助您了解音频流是否可以直接播放。使用这些 API 可确定最适合用于您的音轨的 AudioFormat
。
无障碍功能
语音描述
Android 13(API 级别 33)引入了新的系统级无障碍功能偏好设置,允许用户跨所有应用启用音频说明。音频说明是一种额外的旁白轨道,其中会有一位讲述者在演示过程中进行讲解,描述在音频的自然停顿期间屏幕上发生的情况。应用可以通过使用 isAudioDescriptionRequested()
查询音频说明轨道来遵循用户对音频说明轨道的偏好设置,如以下代码段所示:
Kotlin
private lateinit var accessibilityManager: AccessibilityManager // In onCreate(): accessibilityManager = getSystemService(AccessibilityManager::class.java) // Where your media player is initialized if (accessibilityManager.isAudioDescriptionRequested) { // User has requested to enable audio descriptions }
Java
private AccessibilityManager accessibilityManager; // In onCreate(): accessibilityManager = getSystemService(AccessibilityManager.class); // Where your media player is initialized if(accessibilityManager.isAudioDescriptionRequested()) { // User has requested to enable audio descriptions }
应用可以通过向 AccessbilityManager
添加监听器来监控用户的偏好设置更改:
Kotlin
private val listener = AccessibilityManager.AudioDescriptionRequestedChangeListener { enabled -> // Preference changed; reflect its state in your media player } override fun onStart() { super.onStart() accessibilityManager.addAudioDescriptionRequestedChangeListener(mainExecutor, listener) } override fun onStop() { super.onStop() accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener) }
Java
private AccessibilityManager.AudioDescriptionRequestedChangeListener listener = enabled -> { // Preference changed; reflect its state in your media player }; @Override protected void onStart() { super.onStart(); accessibilityManager.addAudioDescriptionRequestedChangeListener(getMainExecutor(), listener); } @Override protected void onStop() { super.onStop(); accessibilityManager.removeAudioDescriptionRequestedChangeListener(listener); }
核心功能
OpenJDK 11 更新
Android 13 开始刷新 Android 的核心库,以与 OpenJDK 11 LTS 版本保持一致,并增添了适合应用和平台开发者的库更新和 Java 11 语言支持。Android 13 中引入的核心库变更还可以通过 Google Play 系统更新到 ART Mainline 模块,供 Android 12 设备使用。
Android 13 包含对核心库的以下更改:
- 支持将
var
关键字用于局部变量,以及用作参数 lambda。 String 类中的新方法:
isBlank()
lines()
repeat()
strip()
stripLeading()
stripTrailing()
支持
Collection.toArray(IntFunction)
,以便更轻松地使集合适应数组。支持
java.util
类Optional
、OptionalDouble
、OptionalInt
和OptionalLong
中的ifPresentOrElse()
、isEmpty()
、orElseThrow()
和stream()
。扩展了对
SocketOptions
的支持,包括重复使用套接字。NullReader
、NullWriter
、InputStream
、OutputStream
和transferTo()
Reader
功能,用于将读取的字符传输给Writer
。添加了使用
Charsets
进行网址编码和解码的功能。适用于
FileReader
、FileWriter
、PrintStream
和PrintWriter
的Charset
功能。为
ByteArrayInput
或OutputStream
以及Input
或OutputStream
新增了transferTo()
、readNBytes()
、readAllBytes()
和writeBytes()
函数。对
java.lang.invoke.VarHandle
的运行时和编译器支持。在内部使用
VarHandle
将java.util.concurrent
更新到 OpenJDK 11 API。
Java 和 OpenJDK 是 Oracle 及/或其关联公司的商标或注册商标。