Android 11版本主要的行为变更
Android 11 平台包含一些行为变更,这些变更可能会影响您的应用。以下行为变更将影响在 Android 11 上运行的所有应用,无论其采用哪种 targetSdkVersion
都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更(如果适用)。
此外,请务必查看仅影响以 Android 11 为目标平台的应用的行为变更列表。
隐私设置
Android 11 引入了一些变更和限制来加强用户隐私保护,其中包括:
- 一次性权限:让用户可以选择授予更多对位置信息、麦克风和摄像头的临时访问权限。
- 权限对话框的可见性:一再拒绝某项权限表示用户希望“不再询问”。
- 数据访问审核:深入了解您的应用在何处访问私密数据,无论是在您的应用自己的代码中,还是在依赖库的代码中。
-
系统提醒窗口权限:根据请求自动向某些类型的应用授予
SYSTEM_ALERT_WINDOW
权限。此外,包含ACTION_MANAGE_OVERLAY_PERMISSION
intent 操作的 intent 始终会将用户转至系统设置中的屏幕。
如需了解详情,请参阅隐私设置页面。
安全
SSL 套接字默认情况下使用 Conscrypt SSL 引擎
Android 的默认 SSLSocket
实现基于 Conscrypt。从 Android 11 开始,该实现是在 Conscrypt 的 SSLEngine
之上内部构建的。
Scudo Hardened Allocator
Android 11 在内部使用 Scudo Hardened Allocator 为堆分配提供服务。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
检测错误处理文件描述符所有权的错误,例如 use-after-close 和 double-close。在 Android 11 中,fdsan
的默认模式发生了变化。现在,fdsan
会在检测到错误时中止,而以前的行为则是记录警告并继续。如果您在应用中发现由于 fdsan
而导致的崩溃,请参阅 fdsan documentation
。
无障碍
屏幕阅读器要求定义基于点击的无障碍操作
在以前的 Android 版本中,框架会向未正确处理基于点击的无障碍操作的微件分派触摸事件。通常,这些视图会直接处理触摸事件,而不是注册点击监听器。
为了在正确定义无障碍操作的应用中创建更一致的行为,Android 11 绝不会分派触摸事件。相反,系统会完全依赖于基于点击的无障碍操作:ACTION_CLICK
和 ACTION_LONG_CLICK
。此更改会影响屏幕阅读器的行为。
系统会处理使用 OnClickListener
和 OnLongClickListener
接口的微件。但是,如果您的应用使用依赖于 OnTouchListener
接口的自定义程度更高的微件,您需要为基于点击的无障碍操作定义自定义处理程序。为此,请为每个操作调用 replaceAccessibilityAction()
方法,如以下代码段所示:
kotlin:
// Assumes that the widget is designed to select text when tapped and select
// all text when long-tapped. In its strings.xml file, this app has set
// "select" to "Select" and "select_all" to "Select all", respectively.
ViewCompat.replaceAccessibilityAction(
WIDGET,
ACTION_CLICK,
context.getString(R.string.select)
) { view, commandArguments ->
selectText()
}
ViewCompat.replaceAccessibilityAction(
WIDGET,
ACTION_LONG_CLICK,
context.getString(R.string.select_all)
) { view, commandArguments ->
selectAllText()
}
Java:
// Assumes that the widget is designed to select text when tapped and select
// all text when long-tapped. In its strings.xml file, this app has set
// "select" to "Select" and "select_all" to "Select all", respectively.
ViewCompat.replaceAccessibilityAction(WIDGET, ACTION_CLICK,
context.getString(R.string.select),
(view, commandArguments) -> {
selectText();
});
ViewCompat.replaceAccessibilityAction(WIDGET, ACTION_LONG_CLICK,
context.getString(R.string.select_all),
(view, commandArguments) -> {
selectAllText();
});
注意:即使在以前的 Android 版本上,您也必须在自定义微件中定义无障碍操作,以便其他无障碍服务(如“开关控制”)按预期运行。为了让您的应用更轻松地与系统的无障碍服务进行互动,我们强烈建议您从 Android 的界面类层次结构最下方扩展系统微件。
非 SDK 接口限制
Android 11 包含更新后的受限制非 SDK 接口列表(基于与 Android 开发者之间的协作以及最新的内部测试)。在限制使用非 SDK 接口之前,我们会尽可能确保有可用的公开替代方案。
如果您的应用并非以 Android 11 为目标平台,那么其中一些变更可能不会立即对您产生影响。不过,虽然您目前可以使用一些非 SDK 接口(具体取决于应用的目标 API 级别),但只要您使用任何非 SDK 方法或字段,应用无法运行的风险终归较高。
如果您不确定自己的应用是否使用了非 SDK 接口,则可以测试该应用,进行确认。如果您的应用依赖于非 SDK 接口,您应该开始计划迁移到 SDK 替代方案。然而,我们知道某些应用具有使用非 SDK 接口的有效用例。如果您无法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。
如需详细了解此 Android 版本中的变更,请参阅 Android 11 中有关限制非 SDK 接口的更新。如需全面了解有关非 SDK 接口的详细信息,请参阅对非 SDK 接口的限制。
V1 版 Google 地图共享库已移除
Android 11 中已完全移除 V1 版 Google 地图共享库。此库之前已被弃用,并已停止在 Android 10 中的应用中运行。对于搭载 Android 9(API 级别 28)或更低版本的设备,之前依赖于此共享库的应用应改用适用于 Android 的 Google 地图 SDK。
重要提示:迁移到适用于 Android 的 Google 地图 SDK 后,请务必从应用的清单文件的 <uses-library>
元素中移除对 V1 版 Google 地图共享库的引用。应用无法再将 Google Play 过滤与 V1 版 Google 地图共享库和 <uses-library>
元素一起使用。
文件来自Android developer 官方文档
上一篇: 解密:越王宝剑经历千年而不朽之谜
推荐阅读