行为变更:所有应用

Android 13 平台包含可能影响您的应用的行为变更。无论 targetSdkVersion 为何,以下行为变更都适用于在 Android 13 上运行的 所有应用。您应该测试您的应用,然后根据需要进行修改,以妥善支持这些变更(如适用)。

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

性能和电池

任务管理器

At the bottom of the notification drawer is a button that indicates the
  number of apps that are currently running in the background. When you press
  this button, a dialog appears that lists the names of different apps. The
  Stop button is to the right of each app
图 1. 任务管理器的工作流,允许用户停止具有正在运行的前台服务的应用。此工作流仅在运行 Android 13 或更高版本的设备上显示。

从 Android 13(API 级别 33)开始,用户可以从通知抽屉中完成一个工作流,以停止具有正在运行的前台服务的应用,如图 1 所示。此功能称为 任务管理器。应用必须能够处理此用户发起的停止

使用 JobScheduler 改进预取作业处理

JobScheduler 提供了一种方式,让应用可以将特定作业标记为“预取”作业(使用 JobInfo.Builder.setPrefetch()),这意味着它们最好在下一次应用启动之前运行,以改善用户体验。从历史上看,JobScheduler 只使用该信号让预取作业机会性地利用空闲或多余数据。

在 Android 13(API 级别 33)及更高版本中,系统会尝试确定应用下一次启动的时间,并使用该估算值来运行预取作业。应用应尝试对任何希望在下一次应用启动之前完成的工作使用预取作业。

电池资源利用

Android 13(API 级别 33)提供以下方式,让系统更好地管理设备电池续航

在您使用这些变更测试您的应用时,请务必检查以下事项

  • 测试当系统将您的应用置于“受限”应用待机存储分区时,您的应用会如何响应。使用以下 Android 调试桥 (ADB) 命令将您的应用分配到此存储分区

    adb shell am set-standby-bucket PACKAGE_NAME restricted
    
  • 测试您的应用对以下限制的响应情况,这些限制通常适用于处于后台电池使用“受限”状态的应用

    • 无法启动前台服务
    • 现有前台服务将从前台移除
    • 闹钟不会触发
    • 作业不会执行

    使用以下 ADB 命令将您的应用置于此“受限”状态

    adb shell cmd appops set PACKAGE_NAME RUN_ANY_IN_BACKGROUND ignore
    

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

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

  • 应用待机存储分区不再决定应用可以使用多少高优先级 FCM。
  • 如果系统检测到应用持续发送未生成通知的高优先级消息,则会降级这些高优先级消息。

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

如果您的应用不总是响应高优先级 FCM 发布通知,建议您将这些 FCM 的优先级更改为 normal,以避免导致通知的消息被降级。

隐私

通知的运行时权限

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

我们强烈建议您尽快将目标平台设为 Android 13 或更高版本,以获得此功能带来的额外控制和灵活性。

详细了解应用权限最佳实践

从剪贴板隐藏敏感内容

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

Copied text preview without flagging sensitive content
未标记敏感内容的复制文本预览。
Copied text preview flagging sensitive content.
标记了敏感内容的复制文本预览。

要标记敏感内容,请向 ClipDescription 添加一个布尔额外数据。所有应用都应执行此操作,无论目标 API 级别如何。


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

// If your app is compiled with a lower SDK
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 会导致软件包管理器中的非确定性行为。您的应用应改为使用适当的通信机制(例如服务和内容提供程序)来促进共享组件之间的互操作性。

用户体验

可关闭的前台服务通知

在运行 Android 13 或更高版本的设备上,用户可以默认关闭与前台服务相关的通知

核心功能

已移除语音服务实现的旧版本

Android 13 从 Google 应用中移除了 SpeechService 实现,包括语音输入法、RecognitionService基于 intent 的 API

在 Android 12 中,发生了以下变化

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

为了帮助保持 Android 12 上的应用兼容性,Google 应用使用了一个跳板,将流量重定向到由 Google 提供的语音服务应用。在 Android 13 中,此跳板已移除。

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