功能和 API 概览

Android 13 为开发者引入了许多很棒的新功能和 API。以下部分将帮助您了解应用的功能并开始使用相关的 API。

有关新增、修改和移除 API 的详细列表,请阅读API 差异报告。有关新 API 的详细信息,请访问Android API 参考 - 新 API 会突出显示以方便查看。此外,若要了解平台更改可能影响应用的哪些方面,请务必查看 Android 13 行为更改针对目标 Android 13 的应用针对所有应用

开发者生产力和工具

主题应用图标

User opting into themed app icons
在 Android 13 中选择加入主题应用图标

从 Android 13 开始,您可以选择加入主题应用图标。使用此功能,受支持的 Android 启动器中的应用图标会着色以继承用户选择的壁纸和其他主题的颜色。

要支持此功能,您的应用必须同时提供自适应图标和单色应用图标,并在清单中的<adaptive-icon>元素中指向单色应用图标。如果用户已启用主题应用图标(换句话说,已在系统设置中打开**主题图标**切换开关),并且启动器支持此功能,则系统会使用用户选择的壁纸和主题的颜色来确定着色颜色,然后将其应用于单色应用图标。

在以下任何情况下,主屏幕都不会显示主题应用图标,而是显示自适应或标准应用图标

  • 如果用户尚未启用主题应用图标
  • 如果您的应用未提供单色应用图标
  • 如果启动器不支持主题应用图标

如需了解更多详细信息和说明,请参阅自适应图标

每个应用的语言偏好设置

系统设置中的每个应用语言

在很多情况下,多语言用户会将系统语言设置为一种语言(例如英语),但他们希望为特定应用选择其他语言,例如荷兰语、中文或印地语。为了帮助应用为这些用户提供更好的体验,Android 13 为支持多种语言的应用引入了以下功能

  • 系统设置:用户可以在此处为每个应用选择首选语言的集中位置。

    您的应用必须在应用清单中声明android:localeConfig属性,以告知系统它支持多种语言。要了解更多信息,请参阅有关创建资源文件并在应用清单文件中声明它的说明。

  • 其他 API:这些公共 API(例如setApplicationLocales()getApplicationLocales()方法,位于LocaleManager中)允许应用在运行时设置与系统语言不同的语言。

    这些 API 会自动与系统设置同步;因此,使用这些 API 创建自定义应用内语言选择器的应用将确保其用户无论在哪里选择其语言偏好设置,都能获得一致的用户体验。公共 API 还有助于减少样板代码量,它们支持分包 APK,并支持应用自动备份以存储应用级别的用户语言设置。

    为了与以前的 Android 版本向后兼容,AndroidX 中也提供了等效的 API。我们建议使用Appcompat 1.6.0-beta01或更高版本中添加的 API。

不支持多种语言的应用不受这些更改的影响。

改进的文本和语言支持

Android 13 包含一些文本和语言改进功能,可帮助您提供更完善的体验,以下部分将对此进行说明。

更快的连字符化

连字符化使换行文本更易于阅读,并有助于使您的 UI 更具适应性。从 Android 13 开始,连字符化性能优化了高达 200%,因此您可以在 TextView 中启用它,而几乎不会影响渲染性能。要启用更快的连字符化,请在setHyphenationFrequency()中使用fullFastnormalFast频率。

文本转换 API

使用日语和中文等语言的人使用音标字母输入法,这通常会减慢搜索和自动完成功能等功能的速度。在 Android 13 中,应用可以调用新的文本转换 API,以便用户能够更快、更轻松地找到他们想要的内容。例如,以前,搜索需要日语用户执行以下步骤

  1. 输入平假名作为其搜索词的音标发音(例如地名或应用名称)
  2. 使用键盘将平假名字符转换为汉字
  3. 使用汉字重新搜索
  4. 最后获得搜索结果

使用新的文本转换 API,日语用户可以输入平假名并立即查看汉字搜索结果,跳过步骤 2 和 3。

改进的非拉丁脚本行高

Android 13 通过使用针对每种语言调整的行高来改进非拉丁脚本(例如泰米尔语、缅甸语、泰卢固语和藏语)的显示。新的行高可防止剪切并改善字符的位置。您的应用只需以 Android 13 为目标即可利用这些改进。在使用新的行距时,请确保测试您的应用,因为更改可能会影响您在非拉丁语言中的 UI。

Android 12 中被剪切的行高(上图),现在在 Android 13 中定位更佳且未被剪切(下图)。

改进的日语文本换行

从 Android 13 开始,TextView 可以按文节(听起来自然的最小词组单位)或短语换行,而不是按字符换行,从而使日语应用程序更完善且更易读。您可以通过在 TextView 中使用android:lineBreakWordStyle="phrase"来利用此换行功能。

启用短语样式的日语文本换行(下图)和未启用样式的文本换行(上图)。

Unicode 库更新

Android 13 添加了Unicode ICU 70Unicode CLDR 40Unicode 14.0中包含的最新改进、修复和更改。

以下是一些值得注意的更改

  • 加拿大英语en‑CA和菲律宾共和国英语en‑PH在没有可用翻译资源时都使用美国英语en翻译资源,而不是英国英语en‑GB
  • 已为西班牙语es、意大利语it、葡萄牙语pt和葡萄牙语(葡萄牙)pt‑PT引入了many复数类别。类似于CLDR v38中引入的法语,这用于表示大数字。

彩色矢量字体

COLRv1 矢量表情符号(左)和位图表情符号(右)

从 Android 13 开始,系统包含对 COLR 版本 1 (COLRv1) 字体的渲染支持,并将系统表情符号更新为 COLRv1 格式。COLRv1 是一种高度紧凑的字体格式,可在任何尺寸下快速清晰地渲染。

对于大多数应用,系统会处理所有内容,并且 COLRv1 可以正常工作。但是,如果您的应用实现了自己的文本渲染并使用系统的字体,我们建议测试表情符号渲染。

要详细了解 COLRv1,请参阅以下资源

快速设置放置 API

通知栏中的快速设置是用户更改设置或执行快速操作的便捷方式,而无需离开应用上下文。对于提供自定义磁贴的应用,我们使用户更容易发现并将您的磁贴添加到快速设置中。使用新的磁贴放置 API,您的应用现在可以提示用户直接将其自定义磁贴添加到活动快速设置磁贴集中。一个新的系统对话框允许用户一步添加磁贴,而无需离开您的应用,而不是必须转到快速设置以添加磁贴。

A dialog asking the user whether they want to add a tile to their
          Quick Settings.

剪贴板预览

从 Android 13 开始,系统在将内容添加到剪贴板时会显示标准的可视确认。新的确认执行以下操作

  • 确认内容已成功复制。
  • 提供复制内容的预览。

此功能标准化了应用在复制后显示的各种通知,并为用户提供了更多对其剪贴板的控制权。有关其他信息,请访问复制和粘贴功能页面。

Copy/Paste widget
内容进入剪贴板时显示的新 UI。

预测后退手势

Android 13 为 Android 设备(例如手机、大屏幕和折叠屏)引入了预测后退手势。支持此功能需要您更新您的应用。

要查看详细文档,请参阅更新您的应用以支持预测后退手势。您还可以尝试我们的 codelab

蓝牙 LE 音频

低功耗 (LE) 音频是旨在取代经典蓝牙并启用某些用例和连接拓扑的无线音频。它允许用户与朋友和家人共享和广播他们的音频,或订阅公共广播以获取信息、娱乐或辅助功能。它旨在确保用户能够接收高保真音频,而不会牺牲电池寿命,并且可以无缝地在经典蓝牙无法实现的不同用例之间切换。从 Android 13 开始,系统包含对 LE 音频的内置支持,因此开发人员可以在兼容设备上免费获得这些功能。

MIDI 2.0

从 Android 13 开始,系统包含对 MIDI 2.0 标准的支持,包括能够通过 USB 连接 MIDI 2.0 硬件。此标准提供了诸如增加控制器分辨率、更好地支持非西方音调以及使用每个音符控制器进行更具表现力的性能等功能。

启动画面效率改进

Android 13 改进了启动画面 API 中动画启动画面的效率

  • 系统直接从AnimatedVectorDrawable推断动画持续时间。在 Android 13 之前,需要直接设置windowSplashScreenAnimationDuration

  • 使用新的windowSplashScreenBehavior属性可以更好地控制您的应用是否始终在 Android 13 及更高版本中在启动画面上显示图标。

要查看详细文档,请参阅启动画面

ART 优化

在 Android 13(API 级别 33)及更高版本中,ART 使得在原生代码之间切换的速度更快,JNI 调用速度最高提升了 2.5 倍。运行时引用处理也进行了重新设计,使其大部分是非阻塞的,从而进一步减少了卡顿。此外,您可以使用 Reference.refersTo() 公共 API 尽早回收不可达对象,并且您会注意到解释器现在更快了,这得益于优化的类和方法查找。ART 还在安装时执行更多字节码验证,避免了运行时验证的开销,并保持应用启动速度快。

隐私和安全

更安全的上下文注册接收器导出

为了帮助提高运行时接收器的安全性,Android 13 引入了让您的应用指定 注册的广播接收器 是否应导出并对设备上的其他应用可见的功能。在以前的 Android 版本中,设备上的任何应用都可以发送未经保护的广播到动态注册的接收器,除非该接收器受到 签名权限 的保护。

此导出配置适用于执行以下至少一项操作的应用

照片选择器

Android 13(API 级别 33)及更高版本包含 照片选择器 体验。当您的应用启动照片选择器时,用户可以选择特定图像和视频与您的应用共享,例如个人资料图片,而不是授予您的应用访问整个媒体库的权限。这是访问用户照片和视频的推荐方法。

照片选择器为用户提供了增强的隐私保护,因为您的应用无需声明任何运行时权限。此外,照片选择器为应用提供了内置的标准化 UI,从而创造了更一致的用户体验。

用于附近 Wi-Fi 设备的新运行时权限

Android 13(API 级别 33)在 NEARBY_DEVICES 权限组中引入了一个新的 运行时权限,用于管理设备通过 Wi-Fi 连接到附近接入点的应用。这些应用必须声明新的权限 NEARBY_WIFI_DEVICES,当它们 调用几个不同的 Wi-Fi API 时。此外,只要应用不从 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 或更低。

Keystore 和 KeyMint 中的错误报告改进

对于生成密钥的应用,Keystore 和 KeyMint 现在提供更详细和准确的错误指示符。我们在 java.security.ProviderException 下添加了一个异常类层次结构,其中包含包含 Keystore/KeyMint 错误代码 以及错误是否可重试的 Android 特定异常。您还可以修改密钥生成和使用(签名、加密)的方法以抛出新异常。改进的错误报告不仅限于密钥生成,现在应该为您提供重试密钥生成所需的信息。

平板电脑和大屏幕支持

Android 13 构建于 Android 12 和 12L 功能更新中引入的平板电脑优化之上,包括系统 UI 优化、更好的多任务处理以及改进的兼容模式。作为测试的一部分,请确保您的应用在平板电脑和其他大屏幕设备上看起来最佳。

有关新增功能和测试内容的更多信息,请参阅 平板电脑和大屏幕支持 页面。

图形

可编程着色器

一个 AGSL 动画着色器,改编自此 GLSL 着色器

从 Android 13 开始,系统包含对可编程 RuntimeShader 对象的支持,其行为使用 Android 图形着色语言 (AGSL) 定义。AGSL 的语法与 GLSL 大致相同,但在 Android 渲染引擎中工作,以自定义 Android 画布中的绘制以及 View 内容的过滤。Android 在内部使用这些着色器来实现 波纹效果模糊拉伸过度滚动。Android 13 及更高版本使您能够为您的应用创建类似的高级效果。

Choreographer 改进

Android 13 引入了 ChoreographerASurfaceControl 的公共 API 方法,这些方法为应用提供了有关可能的帧时间线的信息,并向 SurfaceFlinger 添加了有关帧生命周期的更多上下文。与以前类似,应用可以 Choreographer 发布回调 并接收帧时间线信息。在 Android 13(API 级别 33)中,Choreographer 返回多个可能的呈现时间及其相应的帧截止日期。应用可以选择呈现时间,然后 通知 SurfaceFlinger 该选择。然后,SurfaceFlinger 不会尝试在所需的呈现时间之前应用事务或锁存缓冲区。

如果您的应用使用新的 Choreographer 和 SurfaceControl 方法,您可以在 Perfetto 追踪中查看应用的帧生命周期。

相机

HDR 视频捕获

从 Android 13 开始,Camera2 API 支持高动态范围 (HDR) 视频捕获,这使您能够使用相机预览和录制 HDR 视频内容。与标准动态范围 (SDR) 相比,HDR 提供更广泛的颜色范围并增加了亮度分量的动态范围(从当前的 100 cd/m2 到 1000s cd/m2)。这使得视频质量更接近真实生活,色彩更丰富,高光更亮,阴影更暗。

要了解有关 HDR 视频捕获的更多信息,请参阅 HDR 视频捕获 文档。

媒体

空间音频

空间音频是一种沉浸式音频体验,使媒体内容对您的用户听起来更逼真。请参阅我们的 空间音频 文档,了解如何与此功能集成。

预期音频路由

为了帮助媒体应用识别其音频将如何路由,Android 13 在 AudioManager 类中引入了音频路由 API。getAudioDevicesForAttributes() API 允许您检索可用于播放指定音频的设备列表,而 getDirectProfilesForAttributes() API 可帮助您了解您的音频流是否可以直接播放。使用这些 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 主线模块,从而提供给 Android 12 设备。

Android 13 包括以下对核心库的更改

  • 支持用于局部变量和作为参数的 lambda 的 var 关键字。
  • String 类中的新方法

    • isBlank()
    • lines()
    • repeat()
    • strip()
    • stripLeading()
    • stripTrailing()
  • 支持 Collection.toArray(IntFunction),以便更轻松地将集合适配到数组。

  • 支持 java.utilOptionalOptionalDoubleOptionalIntOptionalLong 中的 ifPresentOrElse()isEmpty()orElseThrow()stream()

  • 扩展对 SocketOptions 的支持,包括套接字的重用。

  • NullReaderNullWriterInputStreamOutputStreamtransferTo() Reader 功能,这些功能将读取的字符传输到 Writer

  • 添加了使用 Charsets 进行 URL 编码和解码的功能。

  • FileReaderFileWriterPrintStreamPrintWriterCharset 功能。

  • ByteArrayInputOutputStream 以及 InputOutputStream 添加了新的 transferTo()readNBytes()readAllBytes()writeBytes() 函数。

  • java.lang.invoke.VarHandle 的运行时和编译器支持。

  • 使用 VarHandle 在内部更新 java.util.concurrent 到 OpenJDK 11 API。

Java 和 OpenJDK 是 Oracle 和/或其关联公司的商标或注册商标。