行为变更:以 Android 11 为目标平台的应用

Android 11 平台包含一些行为变更,这些变更可能会影响您的应用。以下行为变更仅影响以 Android 11 或更高版本为目标平台的应用。如果您的应用将 targetSdkVersion 设置为“android-R”,您应酌情修改自己的应用,以便正确支持这些行为。

此外,请务必查看对 Android 11 上运行的所有应用都有影响的行为变更列表。

隐私权

Android 11 引入了大量变更和限制,目的是加强用户隐私保护。如需了解详情,请参阅隐私权页面。

压缩的资源文件

如果以 Android 11(API 级别“R”)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件在 4 字节边界上未对齐,应用将无法安装。如果存在其中任意一种情况,系统将无法对此文件进行内存映射。无法进行内存映射的资源表必须读入 RAM 中的缓冲区,从而给系统造成不必要的内存压力,并大大增加设备的 RAM 使用量。

网络连接

高性能 VPN

以 API 级别“R”及更高级别为目标平台的应用或在搭载 API 级别 29 及更高级别的设备上运行的应用可以将 IKEv2/IPsec 应用于 VPN(包括用户配置的 VPN 和基于应用的 VPN)。

VPN 本身在操作系统上运行,从而简化了在应用中建立 IKEv2/IPset VPN 连接所需的代码。

限制对 APN 数据库的读取访问

变更详情

变更名称APN_READING_PERMISSION_CHANGE_ID

变更 ID124107808

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME
adb shell am compat disable (124107808|APN_READING_PERMISSION_CHANGE_ID) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

以 Android 11 为目标平台的应用现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 特权,才能读取或访问电话提供程序 APN 数据库。如果在不具备此权限的情况下尝试访问 APN 数据库,会生成安全异常。

每个进程的网络访问控制

从 Android 11 开始,处理敏感用户数据的应用可以向每个进程授予网络访问权限。通过明确指定允许哪些进程访问网络,您可以隔离不需要上传数据的所有代码。

虽然不能保证防止您的应用意外上传数据,但该功能可让您降低应用中的错误导致数据泄露的几率。

下面显示了使用这项新功能的清单文件的示例:

<processes>
    <process />
    <deny-permission android:name="android.permission.INTERNET" />
    <process android:process=":withoutnet1" />
    <process android:process="com.android.cts.useprocess.withnet1">
        <allow-permission android:name="android.permission.INTERNET" />
    </process>
    <allow-permission android:name="android.permission.INTERNET" />
    <process android:process=":withoutnet2">
        <deny-permission android:name="android.permission.INTERNET" />
    </process>
    <process android:process="com.android.cts.useprocess.withnet2" />
</processes>

允许安装的多种 Passpoint 配置具有相同的 FQDN

从 Android 11 开始,您可以使用 PasspointConfiguration.getUniqueId() 获取 PasspointConfiguration 对象的专有标识符,这样可让使用应用的用户安装多个具有相同完全限定域名 (FQDN) 的配置文件。

当运营商在其网络上部署多个移动设备国家/地区代码 (MCC) 和移动网络代码 (MNC) 组合,但只有一个 FQDN 时,此功能非常有用。在 Android 11 及更高版本中,当用户安装具有 MCC 或 MNC 的 SIM 卡时,可以安装多个具有相同 FQDN(它将与家庭网络服务提供商提供的网络匹配)的配置文件。

安全

随机分配 MAC 地址

在以 Android 10(API 级别 29)及更低版本为目标平台的应用中,MAC 地址的随机分配是基于每个 SSID 进行的,因为 Passpoint 可以连接到同一配置文件的不同 SSID。而在以 Android 11(API 级别“R”)及更高版本为目标平台的应用中,Passpoint 网络的 MAC 地址随机分配将更改为针对每个完全限定域名 (FQDN) 进行分配。

对于以 API 级别“R”及更高级别为目标平台的应用,非特权应用将无法访问设备的 MAC 地址;只有具有 IPv4 地址的网络接口可见。这会影响 getifaddrs()NetworkInterface.getHardwareAddress() 方法,以及 RTM_GETLINK netlink 消息的发送。

下面列出了此变更会以哪些方式影响应用:

  • NetworkInterface.getHardwareAddress() 会针对每个接口返回 null。
  • 应用无法对 NETLINK_ROUTE 套接字使用 bind() 函数。
  • ip 命令不会返回有关接口的信息。

这些变更强制执行不要使用 MAC 地址中提供的指导。

请注意,大多数开发者应使用级别较高的 ConnectivityManager API 而不是级别较低的 NetworkInterface/getifaddrs() API。

堆指针标记

变更详情

变更名称NATIVE_HEAP_POINTER_TAGGING

变更 ID135754954

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME
adb shell am compat disable (135754954|NATIVE_HEAP_POINTER_TAGGING) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

现在,堆指针在最高有效字节 (MSB) 中有一个非零标记。错误地使用指针的应用(包括修改 MSB 的应用)现在会崩溃或遇到其他问题。这是支持未来启用了 ARM 内存标记扩展 (MTE) 的硬件所必需的变更。如需了解详情,请参阅已加标记的指针

如需停用此功能,请参阅 allowNativeHeapPointerTagging 清单文档。

自定义消息框视图被屏蔽

变更详情

变更名称CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK

变更 ID128611929

如何切换

在测试应用与 Android 11 的兼容性时,您可以使用以下 ADB 命令开启或关闭此变更:

adb shell am compat enable (128611929|CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK) PACKAGE_NAME
adb shell am compat disable (128611929|CHANGE_BACKGROUND_CUSTOM_TOAST_BLOCK) PACKAGE_NAME

如需详细了解兼容性框架以及如何切换变更的状态,请参阅测试应用与 Android 11 的兼容性

从 Android 11 开始,已弃用自定义消息框视图。如果您的应用以 Android 11 为目标平台,包含自定义视图的消息框在从后台发布时会被屏蔽。如果您的应用以较低的 Android 版本为目标平台,自定义消息框视图可以继续正常工作,但不建议使用它们。

建议您尽可能改用信息提示控件。如果您的应用的用例阻止您使用信息提示控件(例如,当您需要向用户发送消息而您的应用在后台时),您仍然可以使用文本消息框,因为它们不受这项新行为变更的限制。

如需详细了解这些变更,请参阅 Android 11 中消息框的更新

Firebase

Firebase JobDispatcher 和 GCMNetworkManager

如果您的应用以 API 级别“R”或更高级别为目标平台,在搭载 Android 6.0(API 级别 23)或更高版本的设备上会停用 Firebase JobDispatcher 和 GcmNetworkManager API 调用。如需了解迁移,请参阅从 Firebase JobDispatcher 迁移到 WorkManager从 GCMNetworkManager 迁移到 WorkManager