Google推出的Android 11适配的最佳实践!
共 5000字,需浏览 10分钟
·
2020-09-19 23:44
targetSdkVersion
都不例外。您应该测试您的应用,然后根据需要进行修改,以适当地支持这些变更(如果适用)。隐私权
隐私权变更 | 受影响的应用 | 缓解策略 |
---|---|---|
分区存储强制执行以 Android 11 为目标平台的应用始终会受分区存储行为的影响 | 以 Android 11 为目标平台的应用,以及以 Android 10 为目标平台且未将 requestLegacyExternalStorage 设为 true 以停用分区存储的应用 | 更新您的应用以使用分区存储 |
一次性权限通过一次性权限,用户可以向位置、麦克风和摄像头授予临时访问权限 | 以任何版本为目标平台且请求位置信息、麦克风或摄像头权限的应用 | 在尝试访问受某项权限保护的数据之前,检查您的应用是否具有该权限 |
自动重设权限如果用户在 Android 11 上几个月未与应用互动,系统会自动重设应用的敏感权限 | 以 Android 11 为目标平台且在后台执行大部分工作的应用 | 要求用户阻止系统重置应用的权限 |
后台位置信息访问权限Android 11 更改了用户向应用授予后台位置信息权限的方式 | 以 Android 11 为目标平台且需要访问后台位置信息的应用 | 通过对权限请求方法的多次单独调用,逐步请求前台(粗略或精确)和后台位置权限。必要时,说明用户授予该权限所能得到的益处 |
软件包可见性Android 11 更改了应用查询同一设备上的其他已安装应用及与之互动的方式 | 以 Android 11 为目标平台且与设备上的其他已安装应用交互的应用 | 将 元素添加到应用的清单 |
前台服务类型Android 11 更改了前台服务访问摄像头和麦克风数据的方式 | 以 Android 11 为目标平台且在前台服务中访问摄像头或麦克风的应用 | 分别在访问摄像头数据和麦克风数据的服务中声明 camera 和 microphone 前台服务类型 |
安全
因 OTA 更新而重启设备后在未提供用户凭据的情况下执行文件级加密
设备接收 OTA 更新并重启后,放在受凭据保护的存储空间中的凭据加密密钥可立即用于执行文件级加密 (FBE) 操作。因此,设备重启后,在用户输入其 PIN 码、解锁图案或密码以解锁设备之前,您的应用可以执行与文件级加密相关的操作。
注意:此变更仅影响因 OTA 更新而发生的设备重启。如果您的应用应始终“在重新启动后恢复”,请继续支持直接启动。
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 或空值。
相机
支持并发使用多个摄像头
Android 11 添加了 API 以查询对同时使用多个摄像头(包括前置摄像头和后置摄像头)的支持。
如需在运行应用的设备上检查支持情况,请使用以下方法:
`getConcurrentCameraIds()` 可返回摄像头 ID 组合
Set
,这些组合可与有保证的数据流组合并发进行流式传输(如果它们是由同一应用进程配置的)。`isConcurrentSessionConfigurationSupported()` 可查询摄像头设备是否可以并发支持相应的会话配置。
网络连接
Open Mobile API 变更
从 Android 11 开始,Open Mobile API (OMAPI) 有了额外的功能:
解析运营商权限的规则。
使用以下一项或多项自定义嵌入式安全元件 (eSE) 访问权限或配置 eSE:
系统特许权限
可配置的访问规则应用主数据 (ARA-M) 应用标识符 (AID)
用于重置 OMAPI 读取器的系统 API
为读取器提供清晰的指示符,以便应用过滤设备功能。
性能和调试
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()
方法,如以下代码段所示:
注意:即使在以前的 Android 版本上,您也必须在自定义微件中定义无障碍操作,以便其他无障碍服务(如“开关控制”)按预期运行。为了让您的应用更轻松地与系统的无障碍服务进行互动,我们强烈建议您从 Android 的界面类层次结构扩展系统微件。
在元数据文件中声明“无障碍”按钮使用情况
从 Android 11 开始,您的无障碍服务无法在运行时声明与系统的“无障碍”按钮的关联。如果您将 AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
附加到 AccessibilityServiceInfo
对象的 flags
属性,框架就不会将“无障碍”按钮回调事件传递给您的服务。
应在您的无障碍服务元数据文件(通常为 res/raw/accessibilityservice.xml
)中使用 flagRequestAccessibilityButton
标记声明您的无障碍服务与“无障碍”按钮的关联。
界面
SYSTEM_ALERT_WINDOW 变更
向应用授予 SYSTEM_ALERT_WINDOW
权限的方式发生了一些变更。这些变更可以让权限的授予更有目的性,从而达到保护用户的目的。
根据请求自动向某些应用授予 SYSTEM_ALERT_WINDOW 权限
系统会根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW
权限。这些应用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION
以获取 SYSTEM_ALERT_WINDOW
权限,它们只需直接请求 SYSTEM_ALERT_WINDOW
即可。
系统会自动向具有 ROLE_CALL_SCREENING
且请求 SYSTEM_ALERT_WINDOW
的所有应用授予该权限。如果应用失去 ROLE_CALL_SCREENING
,就会失去该权限。
MANAGE_OVERLAY_PERMISSION intent 始终会将用户转至系统权限屏幕
从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION
intent 始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW
权限。intent 中的任何 package:
数据都会被忽略。
在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION
intent 可以指定一个软件包,它会将用户转至应用专用屏幕以管理权限。Android 11 不再支持此功能,而是必须由用户先选择要对其授予或撤消权限的应用。此变更可以让权限的授予更有目的性,从而达到保护用户的目的。
应用兼容性
非 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。
如有收获,欢迎「分享 」
「点赞」「评论 」
看完本文有收获?请转发分享给更多人
开发者全社区