安卓11来了,快!扶我起来

前言

安卓更新换代很是快,5.0以前版本更新的时间线有点看不懂,但5.0以后更新仍是比较稳定的,大概一年更新一次,谷歌工程师对安卓每一个版本的命名也有点意思,好比棒棒糖、棉花糖、奥利奥、馅饼啊啥的(命名的应该也是个吃货),还有,从1.5开始,以后的版本都按照英文字母顺序排列,从C开始,到如今的11排到了R。java

2019年5月8日,谷歌在Google I/O 2019开发者大会上,正式公布了安卓10系统。通过数月的Beta版测试,谷歌又于2019年9月4日,推送了安卓10正式版。android

从谷歌推出安卓10到如今也快一年的时间了,好多应用尚未适配,但如今安卓11的开发者预览版已经出来了,原本应该在今年的I/O大会上发布正式版安卓11的,可是因为疫情影响,3月21日发布消息,受新冠肺炎疫情影响,谷歌周五宣布完全取消一年一度的I/O开发者大会,此前该公司在3月3日宣布,因为受到新冠病毒疫情的影响,将把I/O大会改成仅在线上举行,但如今线上大会也被取消了。缓存

虽然今年I/O大会不开了,可是安卓11确定要发布的,因此开发人员也别想跑,也须要适配啊!安全

准备工做

“大哥,你这说了半天安卓11的适配在哪呢?”网络

“别着急啊,下面不是就要说了嘛!”并发

“快说,再白活会就取关了!”app

“这就来这就来,哎!若是你有Pixel,那么恭喜你能够直接经过刷OTA的方式来体验和提早适配安卓11。“框架

”没有?跟我同样来使用模拟器吧!“ionic

“什么?不知道怎么配置?真的是,给你说下吧,记好了。”ide

  1. 在 Android Studio 中,依次点击 Tools > SDK Manager

  2. SDK Platforms 标签页下,选择窗口底部的 Show Package Details

  3. Android 11 Developer Preview 下,选择系统映像(例如 Google APIs Intel x86 Atom System Image)。

  4. SDK Tools 标签页中,选择最新版 Android 模拟器,点击 OK 开始安装。

  5. 安装完成后,依次选择 Tools > AVD Manager,而后按照说明建立新的 AVD

    请务必选择 Pixel 设备,并对系统映像选择 R

  6. 返回 AVD 管理器的虚拟设备列表,双击新虚拟设备便可启动该设备。

“万事俱备,只欠适配了!”

这里就不写刷OTA的具体步骤了,须要的能够自行下载和刷写

正文

“来了来了,开始了,别说话了,安静!!!”

分区存储

还记得在适配安卓10的时候设置requestLegacyExternalStorage为true来修改外部存储空间视图模型(true为 Legacy View,false 为 Filtered View)吗?这是重点:当您将应用更新为以 Android 11 为目标平台后,将没法使用 requestLegacyExternalStorage 来停用分区存储。

"大哥,这都停用了那我该怎么适配呢?"

“这孩子,猴急猴急的,这不就要说了嘛!”

数据迁移到使用分区存储时可见的目录:

在以 Android 11 为目标平台以前,应将数据迁移到与分区存储兼容的目录。在大多数状况下,能够将数据迁移到应用的应用专用目录

若是有要迁移的数据,当用户升级到以 Android 11 为目标平台的新版应用时,能够保留旧版存储模型。这样,用户就能够保留对应用以前用来保存数据的目录中存储的应用数据的访问权限。要启用旧版存储模型以进行升级,请在应用的清单中将 preserveLegacyExternalStorage 属性设为 true

这里须要注意如下两点:

  • 大多数应用都不须要使用 preserveLegacyExternalStorage。此标记仅适用于这样一种状况:你将应用数据迁移到了与分区存储兼容的位置,而且但愿用户在更新你应用时保留对数据的访问权限。使用此标记会致使更难以测试分区存储对应用的用户有何影响,由于当用户更新应用时,它会继续使用旧版存储模型。
  • 若是使用 preserveLegacyExternalStorage,则旧版存储模型只在用户卸载应用以前保持有效。若是用户在搭载 Android 11 的设备上安装或从新安装应用,则不管 preserveLegacyExternalStorage 的值是什么,应用都没法停用分区存储模型。

测试分区存储

若是要在应用中启用分区存储,而不考虑应用的目标 SDK 版本和清单标记值,请启用如下应用兼容性标记:

停用分区存储而改用旧版存储模型,请取消设置这两个标记。

管理设备存储空间

若是你的应用是文件管理器应用而且在 Android 11 上运行,它就不能再删除其余应用的缓存文件,即便您的应用具备全部文件访问权限也是如此(清理文件的应用尤为须要注意,好比某某管家、卫士啥的)。相反,你应执行如下操做:

  1. 经过调用 ACTION_MANAGE_STORAGE intent 操做来检查可用空间。
  2. 若是设备上的可用空间不足,请提示用户赞成让您的应用清除全部缓存。为此,请调用 ACTION_CLEAR_APP_CACHE intent 操做。

这里须要注意:ACTION_CLEAR_APP_CACHE intent 操做会严重影响设备的电池续航时间,而且可能会从设备上移除大量的文件

媒体文件访问权限

这个很赞,Android 11 增长了如下访问媒体功能。

执行批量操做

为实现各类设备之间的一致性并增长用户便利性,Android 11 向 MediaStore API 中添加了多种方法。对于但愿简化特定媒体文件更改流程(例如在原位置编辑照片)的应用而言,这些方法尤其有用。

添加的方法以下:

  • [createWriteRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection))

    用户向应用授予对指定媒体文件组的写入访问权限的请求。

  • [createFavoriteRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection, boolean))

    用户将设备上指定的媒体文件标记为“收藏”的请求。对该文件具备读取访问权限的任何应用均可以看到用户已将该文件标记为“收藏”。

  • [createTrashRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection, boolean))

    用户将指定的媒体文件放入设备垃圾箱的请求。垃圾箱中的内容在特定时间段(默认为 7 天)后会永久删除。

  • [createDeleteRequest()](developer.android.google.cn/reference/a…(android.content.ContentResolver, java.util.Collection))

    用户当即永久删除指定的媒体文件(而不是先将其放入垃圾箱)的请求。

系统在调用以上任何一个方法后,会构建一个 PendingIntent 对象。应用调用此 intent 后,用户会看到一个对话框,请求用户赞成应用更新或删除指定的媒体文件。

使用原始路径访问文件

从 Android 11 开始,具备 READ_EXTERNAL_STORAGE 权限的应用可使用直接文件路径和原生库来读取设备的媒体文件。经过这项新功能,应用能够更顺畅地使用第三方媒体库。

文件和目录访问限制

如下与存储访问框架 (SAF) 相关的变动只有在应用以 Android 11 为目标平台时才会生效。

访问目录

没法再使用 ACTION_OPEN_DOCUMENT_TREE intent 操做来请求访问如下目录:

  • Downloads 根目录。
  • 设备制造商认为可靠的各个 SD 卡卷的根目录,不管该卡是模拟卡仍是可移除的卡。

访问文件

没法再使用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUMENT intent 操做来请求用户从如下目录中选择单独的文件:

  • Android/data/ 目录及其全部子目录。
  • Android/obb/ 目录及其全部子目录。

权限

无论应用的目标 SDK 版本是什么,如下变动均会在 Android 11 中生效:

  • 存储运行时权限已重命名为文件和媒体
  • 若是应用未停用分区存储而且请求 READ_EXTERNAL_STORAGE 权限,则用户会看到不一样于 Android 10 的对话框。该对话框会指示应用正在请求访问照片、视频、音频剪辑和文件。
  • 用户能够在系统设置中查看哪些应用具备 READ_EXTERNAL_STORAGE 权限。在设置 > 隐私 > 权限管理器 > 文件和媒体页面上,具备该权限的每一个应用都列在容许存储全部文件下。

这里要注意:若是应用以 Android 11 为目标平台,切记,对“全部文件”的这种访问权限是只读访问权限。要使用此应用读取和写入共享的存储空间中的全部文件,须要具备全部文件访问权限

全部文件访问权限

某些应用的核心用例须要访问大量的文件,如文件管理操做或备份和恢复操做。这些应用可经过执行如下操做来获取“全部文件访问权限”:

  1. 声明 MANAGE_EXTERNAL_STORAGE 权限。
  2. 使用 ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION intent 操做将用户引导至一个系统设置页面,在该页面上,用户能够为应用启用如下选项:授予全部文件的管理权限

“全部文件访问权限”可授予如下权限:

应用可使用 MediaStore API 或原始文件路径来访问这些文件。若是应用使用存储访问框架,不能使用它来访问“全部文件访问权限”提供的其余文件和目录。得到此权限的应用仍然没法访问属于其余应用的应用专用目录。这些目录在存储卷上显示为 Android/data/ 的子目录。

自定义消息框视图被屏蔽

出于安全方面的考虑,同时也为了保持良好的用户体验,若是包含自定义视图的消息框是以 Android 11 为目标平台的应用从后台发送的,则系统会屏蔽这些消息框。请注意,仍容许使用文本消息框;此类消息框是使用 Toast.makeText() 建立的,并不调用 setView()

若是您的应用仍尝试从后台发布包含自定义视图的消息框,则系统不会向用户显示相应的消息,而会执行如下操做:

  1. 显示如下消息框消息:

    Background custom toast blocked for package package-name. See g.co/dev/toast.

  2. 在 logcat 中记录如下消息:

    W/NotificationService: Blocking custom toast from package due to package not in the foreground

若是但愿在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用新的 addCallback() 方法。

这里须要注意,因为平台行为发生了变动,以 Android 11 为目标平台的应用会发现文本消息框受到如下负面影响:

前台服务类型

从 Android 9 开始,应用仅限于在前台访问摄像头和麦克风。为了进一步保护用户,Android 11 更改了前台服务访问摄像头和麦克风相关数据的方式。若是应用以 Android 11 为目标平台而且在某项前台服务中访问这些类型的数据,则须要在该前台服务的声明的 foregroundServiceType 属性中添加新的 cameramicrophone 类型。

来举个例子吧,若是应用中的某项前台服务须要访问与设备的位置信息和摄像头相关的数据,请按如下代码段所示声明该服务:

<manifest>
        ...
        <service ... android:foregroundServiceType="location|camera" />
    </manifest>
复制代码

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。

每一个进程的网络访问控制

从 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>
复制代码

一次性权限

在 Android 11 中,每当应用请求与位置信息、麦克风或摄像头相关的权限时,应用都会得到临时的一次性权限。这个其实在苹果中也有相似的权限申请。

Android 11 不建议重复请求特定权限组中的权限。在您的应用安装到设备上后,若是用户在使用过程当中两次针对某项特定的权限点按拒绝,此操做表示其但愿之后请求相应权限组中的该权限时“再也不询问”。

系统还对与点按拒绝选项相仿的操做的响应行为作出了定义:

  • 若是用户按返回按钮关闭权限对话框,此操做不算“拒绝”操做。
  • 若是用户使用 [requestPermissions()](developer.android.google.cn/reference/a…(android.app.Activity, java.lang.String[], int)) 从您的应用转到系统设置,而后按返回按钮,此操做就算是“拒绝”操做。

悬浮窗口 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 接口(取决于应用的目标 API 级别),但若是使用任何非 SDK 方法或字段,则应用没法运行的风险终归较高。

若是不肯定本身的应用是否使用了非 SDK 接口,则能够测试该应用,进行确认。若是应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。若是没法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API

Open Mobile API 变动

从 Android 11 开始,Open Mobile API (OMAPI) 有了额外的功能:

  • 解析运营商权限的规则。
  • 使用如下一项或多项来自定义嵌入式安全元件 (eSE) 访问权限或配置 eSE:
    • 系统特许权限
    • 可配置的访问规则应用主数据 (ARA-M) 应用标识符 (AID)
    • 用于重置 OMAPI 读取器的系统 API
  • 为读取器提供清晰的指示符,以便应用过滤设备功能。

支持并发使用多个摄像头

Android 11 添加了 API 来查询对同时使用多个摄像头(包括前置摄像头和后置摄像头)的支持。

要在运行应用的设备上检查支持状况,请使用如下方法:

总结

到这里本篇文章也到了尾声了,本文基本写完了安卓11更新的主要内容,你们能够根据应用实际状况进行准备,如今还不着急适配,真正须要适配的话应该还得好几个月。最后再放一下官网地址:developer.android.google.cn/preview。 若是本文对你有帮助的话记得点赞关注啊,感激涕零!!!

相关文章
相关标签/搜索