欢迎使用 Android 12 开发者预览版!请尽早并且经常向我们提供反馈,帮助我们将 Android 12 打造为最佳版本!

行为变更:所有应用

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

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

用户体验

沉浸模式下的手势导航改进

Android 12 简化了沉浸模式,使手势导航更易于操作且与其他活动体验(例如观看视频和阅读图书)更加一致。应用仍然可以在全屏游戏体验中防止意外手势,以免用户在玩游戏时意外退出游戏;所有其他全屏或沉浸式体验现在都允许用户通过滑动手势进行导航。

为了实现这一点,从 Android 12 开始,我们已弃用非粘性沉浸式体验(BEHAVIOR_SHOW_BARS_BY_TOUCHBEHAVIOR_SHOW_BARS_BY_SWIPE)的现有行为。它们已被默认行为 (BEHAVIOR_DEFAULT) 取代,即在隐藏系统栏后,允许使用滑动手势。此标志会根据模式显示不同的视觉和功能行为:

  • 在“三按钮”模式下,视觉和功能行为与 Android 12 之前的版本中的沉浸模式相同。
  • 在手势导航模式下,行为如下:
    • 在视觉上,它与 Android 11 及更低版本中的沉浸模式相同。
    • 从功能上讲,即使系统栏被隐藏,也允许使用手势;只需滑动屏幕一次便可调用系统返回操作,而 Android 11 需要滑动两次。下拉通知栏或转到主屏幕无需另外滑动屏幕。

Android 12 的粘性沉浸模式 (BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE) 没有任何变化。请注意此功能的以下向后兼容性:

前台服务通知延迟

为了在 Android 12 上提供针对短时间运行的前台服务的流畅体验,系统可以为某些前台服务延迟 10 秒显示前台服务通知。此更改使某些短期任务在显示通知之前完成。

如果某项前台服务至少具有以下特征之一,则系统会在服务启动后立即显示相关通知:

  • 该服务与包含操作按钮的通知相关联。
  • 该服务的 foregroundServiceTypeconnectedDevicemediaPlaybackmediaProjectionphoneCall
  • 该服务根据通知的类别属性中的定义,提供与通话、导航或媒体播放相关的用例。

  • 该服务通过在设置通知时调用 setShowForegroundImmediately(),以停用行为变更。

隐私设置

对 Netlink MAC 地址的限制

Android 12 进一步限制了所有非系统应用对设备的 MAC 地址(不可重置的标识符)的访问,无论目标 API 级别如何都是如此。

相关 API 会返回空值或占位值,具体取决于应用的目标 SDK 版本:

  • 如果应用以 Android 12 为目标平台,则该 API 会返回 null。
  • 如果应用以 Android 11 或更低版本为目标平台,则该 API 将返回硬编码占位值:02:00:00:00:00:00

开发者应使用 ConnectivityManager,而不是较低级别的 API(例如 NetworkInterfacegetifaddrs())或 Netlink 套接字。开发者在其代码中调用 NetworkInterface.getHardwareAddress() 时,logcat 输出会显示:CompatibilityChangeReporter: Compat change id reported: 170188668;

开发者可以使用名为 RETURN_NULL_HARDWARE_ADDRESS 的兼容性标志切换 NetworkInterface.getHardwareAddress() 的行为:在启用时返回 null,或在停用时返回 02:00:00:00:00:00

安全性

不受信任的触摸事件被屏蔽

为了维持系统安全并保持良好的用户体验,Android 12 会阻止应用使用触摸事件,使用触摸事件时叠加层会以不安全的方式遮掩应用。 换言之,系统会屏蔽穿透某些窗口的触摸操作,但有一些例外情况

受影响的应用

此变更会影响选择让触摸操作穿透其窗口的应用,例如使用 FLAG_NOT_TOUCHABLE 标志。包括但不限于以下示例:

例外情况

在以下情况下,允许执行“穿透”触摸操作:

  • 应用中的互动。您的应用会显示叠加层,并且只有当用户与您的应用进行互动时才会显示叠加层。
  • 可信窗口。包括但不限于以下窗口:

  • 不可见窗口。窗口的根视图是 GONEINVISIBLE

  • 全透明窗口。窗口的 alpha 属性为 0.0。

  • 足够半透明的系统警报窗口。当组合后的不透明度小于或等于系统针对触摸的最大遮掩不透明度时,系统会将一组系统警报窗口视为足够半透明。 在开发者预览版 1 中,此最大不透明度是 0.8,但在今后的开发者预览版中此值可能会发生变化。

检测不受信任的触摸操作是否被屏蔽

如果系统屏蔽触摸操作,Logcat 会记录以下消息:

Untrusted touch due to occlusion by PACKAGE_NAME

测试变更

运行 Android 12 开发者预览版 1 的设备默认已屏蔽不受信任的触摸操作。如需允许不受信任的触摸操作,请在终端窗口中运行以下 ADB 命令

# A specific app
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
# If you'd still like to see a Logcat message warning when a touch would be
# blocked, use 1 instead of 0.
adb shell settings put global block_untrusted_touches 0

如需将行为还原为默认设置(不受信任的触摸操作被屏蔽),请运行以下命令:

# A specific app
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.app

# All apps
adb shell settings put global block_untrusted_touches 2

应用无法关闭系统对话框

为了加强用户与应用和系统互动时的控制,从 Android 12 开始,弃用了 ACTION_CLOSE_SYSTEM_DIALOGS intent 操作。除了一些特殊情况之外,当应用尝试调用包含此操作的 intent 时,系统会基于应用的目标 SDK 版本执行以下操作之一:

  • 如果应用以 Android 12 为目标平台,则会发生 SecurityException
  • 如果应用以 Android 11(API 级别 30)或更低版本为目标平台,则系统不会执行 intent,并且 Logcat 中会显示以下消息:

    E ActivityTaskManager Permission Denial: \
    android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \
    com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \
    dropping broadcast.
    

例外情况

在以下情况下,应用仍然可以在 Android 12 上关闭系统对话框:

  • 您的应用运行的是插桩测试
  • 您的应用以 Android 11 或更低版本为目标平台,并在抽屉式通知栏顶部显示一个窗口。

  • 您的应用以 Android 11 或更低版本为目标平台。此外,用户已与通知互动,可能使用了通知的操作按钮,您的应用正在处理服务广播接收器来响应该用户操作。

限制非 SDK 接口

Android 12 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。

如果您的应用并非以 Android 12 为目标平台,其中一些变更可能不会立即对您产生影响。然而,虽然您目前仍可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要您使用任何非 SDK 方法或字段,终归存在导致应用出问题的显著风险。

如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用来进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,应请求新的公共 API

如需详细了解此 Android 版本中的变更,请参阅 Android 12 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制