行为变更:所有应用

Android 13 平台包含一些可能会影响您的应用的行为变更。以下行为变更会影响在 Android 13 上运行的所有应用,无论采用哪种 targetSdkVersion 都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更。

此外,请务必查看仅影响以 Android 13 为目标平台的应用的行为变更列表。

性能和电池

前台服务 (FGS) 任务管理器

抽屉式通知栏底部有一个按钮,用于指示当前在后台运行的应用的数量。按此按钮时,系统会显示一个对话框,其中会列出不同应用的名称。每个应用的右侧都有一个“停止”按钮
图 1. 搭载 Android 13 的设备上的 FGS 任务管理器工作流程。

无论应用采用何种目标 SDK 版本,Android 13(API 级别 33)都允许用户从抽屉式通知栏中停止前台服务。这项新功能称为 FGS 任务管理器,它会显示当前正在运行前台服务的应用列表。此列表的标签为使用中的应用。每个应用旁边都有一个停止按钮。图 1 说明了搭载 Android 13 的设备上的 FGS 任务管理器的工作流程。

详细了解 FGS 任务管理器

使用 JobScheduler 改进预提取作业处理

利用 JobScheduler,应用可使用 JobInfo.Builder.setPrefetch() 将特定作业标记为“预提取”作业,这意味着,理想情况下这些作业应该在应用下一次启动前提前一点运行,以提升用户体验。过去,JobScheduler 仅使用该信号让预提取作业有机会使用免费或多余的数据。

在 Android 13 中,系统现在会尝试确定应用下次启动的时间,并根据该估算值运行预提取作业。应用应尝试使用预提取作业来完成他们想要在下次应用启动前完成的任何工作。

电池资源利用率

Android 13(API 级别 33)引入了电池资源利用率,它为系统提供了多种方法来更好地管理设备电池续航时间:

  • 更新了有关系统何时将您的应用放入“受限”应用待机模式存储分区的规则。
  • 对于您的应用在以下情况下可以执行的操作制定了新限制:用户因您应用的后台电池用量过高而将其置于“受限”状态。
  • 新增了系统通知,用于就长时间运行的前台服务向用户发出警告。

高优先级 Firebase Cloud Message (FCM) 配额

Android 13(API 级别 33)更新了 Firebase Cloud Messaging (FCM) 配额,从而提高了针对高优先级 FCM 显示通知的高优先级 FCM 传送的可靠性。Android 13(API 级别 33)中发生了以下变更:

  • 应用待机模式存储分区不再决定应用可以使用多少个高优先级 FCM。
  • 高优先级 FCM 配额根据为响应高优先级 FCM 而向用户显示的通知数量按比例缩容。

与以前的 Android 版本一样,超出配额的高优先级 FCM 会降级为普通优先级。为了响应 FCM 而启动前台服务 (FGS) 时,我们建议您检查 RemoteMessage.getPriority() 的结果并确认它为 PRIORITY_HIGH,并且/或者处理任何潜在 ForegroundServiceStartNotAllowedException 异常。

如果您的应用并非始终为了响应高优先级 FCM 而发布通知,我们建议您将这些 FCM 的优先级更改为正常,这样生成通知的消息就不会降级。

隐私权

通知的运行时权限

Android 13(API 级别 33)引入了新的运行时通知权限POST_NOTIFICATIONS。此更改有助于用户专注于最重要的通知。

强烈建议您尽快以 Android 13 为目标平台,以获享此功能提供的额外控制和灵活性。

详细了解应用权限最佳做法

从剪贴板中隐藏敏感内容

如果您的应用允许用户将敏感内容(例如密码或信用卡信息)复制到剪贴板,则必须在调用 ClipboardManager#setPrimaryClip() 之前向 ClipData 的 ClipDescription 添加一个标志。添加此标志可阻止敏感内容出现在内容预览中。

所复制文本的预览(未标记敏感内容)
所复制文本的预览(未标记敏感内容)。
所复制文本的预览(未标记敏感内容)。
所复制文本的预览(已标记敏感内容)。

如需标记敏感内容,请向 ClipDescription 添加一个布尔型 extra。无论应用的目标 API 级别如何,所有应用都应这么做。


// When your app targets API level 33 or higher
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean(ClipDescription.EXTRA_IS_SENSITIVE, true)
    }
}

// If your app targets a lower API level
clipData.apply {
    description.extras = PersistableBundle().apply {
        putBoolean("android.content.extra.IS_SENSITIVE", true)
    }
}

如需详细了解新的剪贴板界面,请访问复制和粘贴功能页面。

安全性

停止使用共享用户 ID

如果您的应用使用已废弃的 android:sharedUserId 属性,并且不再依赖于该属性的功能,您可以将 android:sharedUserMaxSdkVersion 属性设置为 32,如以下代码段所示:

<manifest ...>
    <!-- To maintain backward compatibility, continue to use
         "android:sharedUserId" if you already added it to your manifest. -->
    android:sharedUserId="SHARED_PACKAGE_NAME"
    android:sharedUserMaxSdkVersion="32"
    ...
</manifest>

这个新属性会告知系统,您的应用不再依赖于共享用户 ID。如果您的应用声明 android:sharedUserMaxSdkVersion 并且首次安装在搭载 Android 13 或更高版本的设备上,则应用的行为就像您从未定义过 android:sharedUserId 一样。更新后的应用仍会使用现有的共享用户 ID。

共享用户 ID 会在软件包管理器中导致具有不确定性的行为。您的应用应使用适当的通信机制(例如服务和 content provider),在共享组件之间实现互操作性。

用户体验

应用内语言选择器

Android 13 在手机设置中新增了一个集中设置选项,用于设置各应用语言偏好设定。如果您的应用支持多种语言,我们强烈建议您在应用的清单中声明 android:localeConfig 属性,这样用户就可以在同一位置像更改其他应用的语言设置一样更改您的语言设置。

此外,当前使用自定义应用内语言选择器的应用应改用适用于各应用语言偏好设定功能的新 API。使用这些新 API 有助于确保用户无论是继续通过应用内语言选择器选择语言,还是通过手机设置选择语言,都能以其首选语言查看您的应用。

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

核心功能

移除了旧版语音服务实现副本

Android 13 从 Google 应用中移除了 SpeechService 实现,包括

语音 IME、RecognitionService基于 intent 的 API

在 Android 12 中发生了以下变更:

  • SpeechService 功能已迁移到 Google 语音服务应用,该应用已成为默认的 SpeechService 提供程序。
  • RecognitionService 功能已移至 Android System Intelligence 应用,以支持设备端语音识别。

为了帮助在 Android 12 上保持应用兼容性,Google 应用会使用 trampoline 将流量引导至 Google 语音服务应用。在 Android 13 中,此 trampoline 已被移除。

应用应使用设备的 SpeechService 默认提供程序,而不是硬编码为特定应用。