应用行为变更:所有应用

Android 11 平台包含可能影响您应用的行为变更。以下行为变更适用于所有应用在 Android 11 上运行时,无论targetSdkVersion如何。您应测试您的应用,然后根据需要对其进行修改以正确支持这些变更,在适用情况下。

请务必也查看仅影响面向 Android 11 的应用的行为变更列表。

隐私

Android 11 引入了增强用户隐私的变更和限制,包括以下内容

  • 一次性权限允许用户选择授予位置、麦克风和摄像头权限的临时访问权限。
  • 权限对话框可见性多次拒绝权限表示“不再询问”。
  • 数据访问审计深入了解您的应用在何处访问私有数据,包括应用自己的代码和依赖库的代码。
  • 系统警报窗口权限某些类别的应用在请求时会自动授予SYSTEM_ALERT_WINDOW权限。此外,包含ACTION_MANAGE_OVERLAY_PERMISSION intent 操作的 intent 始终会将用户带到系统设置中的屏幕。
  • 永久 SIM 标识符在 Android 11 及更高版本上,通过getIccId()方法访问不可重置的 ICCID 会受到限制。该方法返回一个非空空字符串。要唯一标识设备上安装的 SIM 卡,请改用getSubscriptionId()方法。订阅 ID 为唯一标识已安装的 SIM 卡(包括物理和电子 SIM 卡)提供索引值(从 1 开始)。除非设备恢复出厂设置,否则此标识符的值对于给定的 SIM 卡是稳定的。

要了解更多信息,请参阅隐私页面。

曝光通知

Android 11 更新了平台,并考虑了曝光通知系统。用户现在可以在 Android 11 上运行曝光通知应用,而无需打开设备位置设置。鉴于曝光通知系统的设计方式使得使用它的应用无法通过蓝牙扫描推断设备位置,因此这是一个仅适用于曝光通知系统的例外情况。

为了保护用户隐私,所有其他应用在设备位置设置开启且用户已授予其位置权限之前,仍禁止执行蓝牙扫描。您可以在我们的曝光通知更新帖子中阅读更多信息。

安全

SSL 套接字默认使用 Conscrypt SSL 引擎

Android 的默认SSLSocket实现基于Conscrypt。从 Android 11 开始,该实现是在 Conscrypt 的SSLEngine之上内部构建的。

Scudo 加固分配器

Android 11 在内部使用 Scudo 加固分配器 来服务堆分配。Scudo 能够检测和缓解某些类型的内存安全违规。如果您在原生崩溃报告中看到与 Scudo 相关的崩溃(例如,Scudo ERROR:),请参阅 Scudo 故障排除 文档。

应用使用统计

为了更好地保护用户,Android 11 将每个用户的应用使用统计信息存储在 凭据加密存储 中。因此,除非 isUserUnlocked() 返回 true,否则系统或任何应用都无法访问这些数据,这将在以下情况之一发生后发生

  • 用户在系统启动后首次解锁设备。
  • 用户切换到设备上的其帐户。

如果您的应用已绑定到 UsageStatsManager 的实例,请检查您是否在用户解锁设备后调用此对象上的方法。否则,API 现在将返回 null 或空值。

模拟器对 5G 的支持

Android 11 添加了 5G API,使您的应用能够添加尖端功能。要测试在添加功能时,您可以使用 Android SDK 模拟器 的新功能。此新功能已在模拟器版本 30.0.22 中添加。选择 5G 网络设置将 TelephonyDisplayInfo 设置为 OVERRIDE_NETWORK_TYPE_NR_NSA,修改估计带宽,并允许您设置计量以验证您的应用是否对 NET_CAPABILITY_TEMPORARILY_NOT_METERED 状态的变化做出相应的响应。

性能和调试

JobScheduler API 调用限制调试

Android 11 为应用提供了调试支持,以识别可能已超出某些速率限制的 JobScheduler API 调用。开发人员可以使用此功能来识别潜在的性能问题。对于将 debuggable 清单属性设置为 true 的应用,超出速率限制的 JobScheduler API 调用将返回 RESULT_FAILURE。限制的设置方式应不会影响合法用例。

文件描述符清理程序 (fdsan)

Android 10 引入了 fdsan(文件描述符清理程序)。fdsan 检测文件描述符所有权的错误处理,例如使用后关闭和双重关闭。Android 11 中 fdsan 的默认模式正在更改。fdsan 现在在检测到错误时中止;之前的行为是记录警告并继续。如果您在应用程序中看到由于 fdsan 导致的崩溃,请参阅 fdsan 文档

非 SDK 接口限制

Android 11 包含基于与 Android 开发人员合作以及最新的内部测试而更新的受限非 SDK 接口列表。只要有可能,我们都会确保在限制非 SDK 接口之前提供公共替代方案。

如果您的应用没有面向 Android 11,则其中一些更改可能不会立即影响您。但是,虽然您目前可以使用某些非 SDK 接口(取决于您的应用的目标 API 级别),但使用任何非 SDK 方法或字段始终存在使您的应用崩溃的高风险。

如果您不确定您的应用是否使用了非 SDK 接口,您可以 测试您的应用 以找出答案。如果您的应用依赖于非 SDK 接口,则应开始计划迁移到 SDK 替代方案。但是,我们理解某些应用有使用非 SDK 接口的有效用例。如果您无法找到应用中功能的非 SDK 接口的替代方案,则应 请求新的公共 API

要了解有关此 Android 版本中更改的更多信息,请参阅 Android 11 中对非 SDK 接口限制的更新。要了解有关非 SDK 接口的一般信息,请参阅 非 SDK 接口的限制

已删除 Maps v1 共享库

Maps 共享库的 V1 已在 Android 11 中完全删除。此库之前已弃用,并且在 Android 10 中停止为应用运行。以前依赖此共享库在运行 Android 9(API 级别 28)或更低版本的设备上运行的应用应改为使用 适用于 Android 的 Maps SDK

与其他应用的交互

共享内容 URI

如果您的应用与其他应用共享内容 URI,则意图必须通过设置以下意图标志中的至少一个来 授予 URI 访问权限FLAG_GRANT_READ_URI_PERMISSIONFLAG_GRANT_WRITE_URI_PERMISSION。这样,如果其他应用面向 Android 11,它仍然可以访问内容 URI。即使内容 URI 与您的应用不拥有的内容提供程序相关联,您的应用也必须包含意图标志。

如果您的应用拥有与内容 URI 相关联的内容提供程序,请验证 内容提供程序未导出。我们已经推荐了这种安全最佳实践。

库加载

使用绝对路径加载 ICU 通用库

面向 API 28 及更低版本的应用不能使用 dlopen(3) 使用绝对路径“/system/lib/libicuuc.so”加载 libicuuc。对于这些应用,dlopen("/system/lib/libicuuc.so", ...) 将返回空句柄。

相反,要加载库,请使用库名称作为文件名,例如 dlopen("libicuuc.so", ...)