
奋斗是什么?每一天很难,但是一年比一年容易。不奋斗就是每天很容易,一年比一年难。
一、前言
让人又爱又恨的Android 11来了,新一轮的适配也要准备了。咖啡、茶、辣条已经准备妥当,兄弟们可以开始熬夜搬砖了 。看完了更新文档后,瑟瑟发抖的我还是写下了读后感。

二、新体验
官方文档
1.控制外部设备
简介:Android 11 包含一个新的 ControlsProviderService API,可用于提供所连接的外部设备的控件。这些控件显示于Android 电源菜单中的设备控制器下。内容有限 点击详细说明 。应用在android 11版本中适配添加该功能点击适配
2. 媒体控件的显示方式
简介:Android 11 更新了媒体控件的显示方式,使用 MediaSession 和 MediaRouter2 API 呈现控件和音频输出信息。支持“继续播放媒体内容”功能,想使用此功能,必须在“开发者选项”设置中启用继续播放媒体内容。点击详情
3.屏幕更新
简介:1.Android 11 提供了一些 API 以支持瀑布屏,这是一种无边框的全面屏。如需要在您的应用中添加该功能执行以下操作:
- 调用 DisplayCutout.getWaterfallInsets() 以获取瀑布边衬区的精确尺寸
- 将窗口布局属性 layoutInDisplayCutoutMode 设为 LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS,以允许窗口延伸到屏幕各个边缘上的刘海和瀑布区域。您必须确保刘海或瀑布区域中没有重要的内容
2.Android 11 针对可折叠设备提供了新的传感器,可以监控折叠合页时的角度。点击详情
4.会话
简介:Android 11 对会话的处理方式进行了多项改进。点击详情 或 官方文档
5.5G 图标显示
简介:Android 11及更高版本中,具有 android.Manifest.permission.READ_PHONE_STATE 权限的应用可以通过 PhoneStateListener.onDisplayInfoChanged() 请求更新电话显示信息,其中包括用于营销和品牌塑造的无线接入技术信息。
三、适配 Android 11 行为变化
变化分为两部分:1.应用运行在手机版本 >= android 11 上 2.targetSdkVersion>=30的应用
根据变化情况考虑我们的应用是否需要适配新的变化。
(1)应用运行在手机版本 >= android 11 上
- 隐私变化
单次授权: 每当应用请求与位置信息、麦克风或相机相关的权限时,面向用户的权限对话框会包含仅限这一次选项。如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。然后,应用可以在一段时间内访问相关数据,当用户下次打开应用并且应用中的某项功能请求访问位置信息、麦克风或摄像头时,系统会再次提示用户授予权限。
权限对话框的可见性: 如果用户在使用过程中多次针对某项特定的权限点按拒绝,那么在您的应用再次请求该权限时,用户将不会看到系统权限对话框。该操作表示用户希望“不再询问”。所以当要访问权限时还需要检查是否有权限等一系列操作。
数据访问审核: 引入了数据访问审核功能,当应用的代码访问私密数据,依赖库或 SDK 中的代码访问私密数据时。应用可以注册 AppOpsManager.OnOpNotedCallback 实例,监听访问私密数据过程。查看详情
系统提醒窗口权限: 向应用授予 SYSTEM_ALERT_WINDOW 权限的方式发生了一些变更。1.系统会自动向具有 ROLE_CALL_SCREENING 且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限。如果应用失去 ROLE_CALL_SCREENING,就会失去该权限。2.系统会自动向通过 MediaProjection 截取屏幕且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限,除非用户已明确拒绝向应用授予该权限。这些应用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION 以获取 SYSTEM_ALERT_WINDOW 权限,它们只需直接请求 SYSTEM_ALERT_WINDOW 即可。
永久 SIM 卡标识符: 在 Android 11 及更高版本中,使用 getIccId() 方法访问 ICCID 受到限制。该方法会返回一个非 null 的空字符串。如需唯一标识设备上安装的 SIM 卡,请改用 getSubscriptionId() 方法 - Exposure Notification
Android 11 将对 Exposure Notification API 进行例外处理,并默认为其授予位置服务权限。 - 安全性
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,这发生在用户在系统启动后首次解锁其设备或用户在设备上切换到自己帐号的情况。
针对 5G 的模拟器支持: Android 11 添加了 5G API,使您的应用能够添加各种先进的功能,如需在添加这些功能时对其进行测试,您可以使用 Android SDK 模拟器的新功能。 - 性能和调试
JobScheduler API 调用限制调试: JobScheduler 任务调度器,可以在设备空闲时做一些任务处理。Android11 中如果你设置为 debug 模式(debuggable 清单属性设置为 true),超出速率限制的 JobScheduler API 调用将返回 RESULT_FAILURE。
文件描述符排错程序: Android 10 引入了 fdsan(文件描述符排错程序),在 Android 11 中,fdsan 的默认模式发生了变化。fdsan 会在检测到错误时中止,而以前的行为则是记录警告并继续。如果您在应用中发现由于 fdsan 而导致的崩溃,请参阅 fdsan documentation。 - V1 版 Google 地图共享库已移除
Android 11 中已完全移除 V1 版 Google 地图共享库。此库之前已被弃用,并已停止在 Android 10 中的应用中运行。对于搭载 Android 9(API 级别 28)或更低版本的设备,之前依赖于此共享库的应用应改用适用于 Android 的 Google 地图 SDK - 分享内容 URI
如果您的应用与其他应用分享内容 URI,相应 intent 必须至少设置以下 intent 标记中的一个,以便授予对 URI 的访问权限:FLAG_GRANT_READ_URI_PERMISSION 和 FLAG_GRANT_WRITE_URI_PERMISSION,如果其他应用以 Android 11 为目标平台,相应应用仍可访问内容 URI。即使内容 URI 与不属于您的应用的内容提供程序相关联,您的应用也必须包含 intent 标记。
(2)targetSdkVersion >= 30的应用
- 隐私设置
强制执行分区存储: 在 Android 11 上运行但以 Android 10(API 级别 29)为目标平台的应用仍可请求 requestLegacyExternalStorage 属性。应用可以利用此标记暂时停用与分区存储相关的变更,例如授予对不同目录和不同类型的媒体文件的访问权限。当您将应用更新为以 Android 11 为目标平台后,系统会忽略 requestLegacyExternalStorage 标记。解决:存储用例和最佳做法 或 Android 11 存储常见问题解答
自动重置权限: 如果应用以 Android 11 或更高版本为目标平台并且数月未使用,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。此操作与用户在系统设置中查看权限并将应用的访问权限级别更改为拒绝的做法效果一样。如果应用遵循了有关在[运行时请求权限的最佳做法](https://developer.android.google.cn/training/permissions/requesting),那么您不必对应用进行任何更改。这是因为,当用户与应用中的功能互动时,您应该会验证相关功能是否具有所需权限。
在后台访问位置信息的权限: Android 11 更改了应用中的功能获取后台位置信息访问权限的方式,
软件包可见性: Android 11 更改了应用查询用户已在设备上安装的其他应用以及与之交互的方式,使用 queries 元素,应用可以定义一组自身可访问的其他软件包。解决方案:管理其他已安装应用的软件包可见性 - 安全
堆指针标记: 堆指针在最高有效字节 (MSB) 中有一个非零标记,错误地使用指针的应用(包括修改 MSB 的应用)现在会崩溃或遇到其他问题。这是支持未来启用了 ARM 内存标记扩展 (MTE) 的硬件所必需的变更。如需了解详情,请参阅已加标记的指针。
消息框的更新: 出于安全方面的考虑,同时也为了保持良好的用户体验,如果包含自定义视图的消息框是以 Android 11 或更高版本为目标平台的应用从后台发送的,系统会屏蔽这些消息框。请注意,仍允许使用文本消息框;此类消息框是使用 Toast.makeText() 创建的,并不调用 setView()。 - 网络连接
限制对 APN 数据库的读取访问: 以 Android 11 为目标平台的应用现在必须具备 Manifest.permission.WRITE_APN_SETTINGS 特权,才能读取或访问电话提供程序 APN 数据库。如果在不具备此权限的情况下尝试访问 APN 数据库,会生成安全异常。 - 无障碍服务
在清单文件中声明与 TTS 引擎的交互: 由于软件包可见性发生了变更,因此以 Android 11 为目标平台且与文字转语音 (TTS) 引擎交互的应用需要将以下 queries 元素添加到其清单文件中
<queries>
<intent>
<action
android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
在元数据文件中声明“无障碍”按钮使用情况: 从 Android 11 开始,您的无障碍服务无法在运行时声明与系统的“无障碍”按钮相关联;如需在无障碍服务中收到无障碍回调事件,请使用无障碍服务元数据文件声明您的服务与“无障碍”按钮的关联。在 accessibilityFlags 属性的定义中添加 flagRequestAccessibilityButton 值。无障碍服务元数据文件的常用位置为 res/raw/accessibilityservice.xml。
- 相机
媒体 intent 操作需要系统默认相机: 从 Android 11 开始,只有预装的系统相机应用可以响应以下 intent 操作:
android.media.action.VIDEO_CAPTURE
android.media.action.IMAGE_CAPTURE
android.media.action.IMAGE_CAPTURE_SECURE
如果有多个预装的系统相机应用可用,系统会显示一个对话框,供用户选择应用。如果您希望自己的应用使用特定的第三方相机应用来代表其捕获图片或视频,可以通过为 intent 设置软件包名称或组件来使这些 intent 变得明确。
- 应用打包和安装
压缩的资源文件 如果以 Android 11(API 级别 30)或更高版本为目标平台的应用包含压缩的 resources.arsc 文件或者如果此文件未按 4 字节边界对齐,应用将无法安装。
现在需要 APK 签名方案 v2 用户无法在搭载 Android 11 的设备上安装或更新仅通过 APK 签名方案 v1 签名的应用,现在必须使用 APK 签名方案 v2 或更高版本进行签名。 - 设备到设备文件传输
如果您的应用以 Android 11 或更高版本为目标平台,您将无法使用 allowBackup 属性停用应用文件的设备到设备迁移。系统会自动启用此功能。但可以通过将 allowBackup 属性设为 false 来停用应用文件的云端备份和恢复。 - OnSharedPreferenceChangeListener 的回调变更
对于以 Android 11(API 级别 30)为目标平台的应用,现在每次调用 Editor.clear 时,都会使用 null 键回调 OnSharedPreferenceChangeListener.onSharedPreferenceChanged。
四、总结

本文没有详细涉及到如何适配android 11的改变。但从蛛丝马迹中还是可以发现一点点解决办法。本文属于总结陈述android 11的变化。希望可以全方位的了解更新内容。然后从中发现自己应用需要做哪些改变与适配。
五、内容推荐
- 《CSDN》《简书》
- 《Android Jetpack组件之架构组件总结》
- 《Android Rxjava+Retrofit网络请求框架封装(一)》
- 《Android 网络请求框架okhttp学习笔记》
- 《Android Retrofit简介》
若您发现文章中存在错误或不足的地方,希望您能指出!

网友评论