安卓更新换代很是快,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
在 Android Studio 中,依次点击 Tools > SDK Manager。
在 SDK Platforms 标签页下,选择窗口底部的 Show Package Details。
在 Android 11 Developer Preview 下,选择系统映像(例如 Google APIs Intel x86 Atom System Image)。
在 SDK Tools 标签页中,选择最新版 Android 模拟器,点击 OK 开始安装。
安装完成后,依次选择 Tools > AVD Manager,而后按照说明建立新的 AVD。
请务必选择 Pixel 设备,并对系统映像选择 R。
返回 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 版本和清单标记值,请启用如下应用兼容性标记:
DEFAULT_SCOPED_STORAGE
(默认状况下,对全部应用处于启用状态)FORCE_ENABLE_SCOPED_STORAGE
(默认状况下,对全部应用处于停用状态)要停用分区存储而改用旧版存储模型,请取消设置这两个标记。
若是你的应用是文件管理器应用而且在 Android 11 上运行,它就不能再删除其余应用的缓存文件,即便您的应用具备全部文件访问权限也是如此(清理文件的应用尤为须要注意,好比某某管家、卫士啥的)。相反,你应执行如下操做:
ACTION_MANAGE_STORAGE
intent 操做来检查可用空间。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
根目录。没法再使用 ACTION_OPEN_DOCUMENT_TREE
或 ACTION_OPEN_DOCUMENT
intent 操做来请求用户从如下目录中选择单独的文件:
Android/data/
目录及其全部子目录。Android/obb/
目录及其全部子目录。无论应用的目标 SDK 版本是什么,如下变动均会在 Android 11 中生效:
READ_EXTERNAL_STORAGE
权限,则用户会看到不一样于 Android 10 的对话框。该对话框会指示应用正在请求访问照片、视频、音频剪辑和文件。READ_EXTERNAL_STORAGE
权限。在设置 > 隐私 > 权限管理器 > 文件和媒体页面上,具备该权限的每一个应用都列在容许存储全部文件下。这里要注意:若是应用以 Android 11 为目标平台,切记,对“全部文件”的这种访问权限是只读访问权限。要使用此应用读取和写入共享的存储空间中的全部文件,须要具备全部文件访问权限。
某些应用的核心用例须要访问大量的文件,如文件管理操做或备份和恢复操做。这些应用可经过执行如下操做来获取“全部文件访问权限”:
MANAGE_EXTERNAL_STORAGE
权限。ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
intent 操做将用户引导至一个系统设置页面,在该页面上,用户能够为应用启用如下选项:授予全部文件的管理权限。“全部文件访问权限”可授予如下权限:
MediaStore.Files
表的内容的访问权限。应用可使用 MediaStore
API 或原始文件路径来访问这些文件。若是应用使用存储访问框架,不能使用它来访问“全部文件访问权限”提供的其余文件和目录。得到此权限的应用仍然没法访问属于其余应用的应用专用目录。这些目录在存储卷上显示为 Android/data/
的子目录。
出于安全方面的考虑,同时也为了保持良好的用户体验,若是包含自定义视图的消息框是以 Android 11 为目标平台的应用从后台发送的,则系统会屏蔽这些消息框。请注意,仍容许使用文本消息框;此类消息框是使用 Toast.makeText()
建立的,并不调用 setView()
。
若是您的应用仍尝试从后台发布包含自定义视图的消息框,则系统不会向用户显示相应的消息,而会执行如下操做:
显示如下消息框消息:
Background custom toast blocked for package package-name. See g.co/dev/toast.
在 logcat 中记录如下消息:
W/NotificationService: Blocking custom toast from package due to package not in the foreground
若是但愿在消息框(文本消息框或自定义消息框)出现或消失时收到通知,请使用新的 addCallback()
方法。
这里须要注意,因为平台行为发生了变动,以 Android 11 为目标平台的应用会发现文本消息框受到如下负面影响:
getView()
方法返回 null
。setMargin()
](developer.android.google.cn/reference/a…(float, float))setGravity()
](developer.android.google.cn/reference/a…(int, int, int))从 Android 9 开始,应用仅限于在前台访问摄像头和麦克风。为了进一步保护用户,Android 11 更改了前台服务访问摄像头和麦克风相关数据的方式。若是应用以 Android 11 为目标平台而且在某项前台服务中访问这些类型的数据,则须要在该前台服务的声明的 foregroundServiceType
属性中添加新的 camera
和 microphone
类型。
来举个例子吧,若是应用中的某项前台服务须要访问与设备的位置信息和摄像头相关的数据,请按如下代码段所示声明该服务:
<manifest>
...
<service ... android:foregroundServiceType="location|camera" />
</manifest>
复制代码
在以 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)) 从您的应用转到系统设置,而后按返回按钮,此操做就算是“拒绝”操做。从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION
intent 始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW
权限。intent 中的任何 package:
数据都会被忽略。
在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION
intent 能够指定一个文件包,它会将用户转至应用专用屏幕来管理权限。Android 11 再也不支持此功能,而是必须由用户先选择要对其授予或撤消权限的应用。此变动可让权限的授予更有目的性,从而达到保护用户的目的。
若是应用并不是以 Android 11 为目标平台,那么其中一些变动可能不会当即产生影响。虽然目前仍然可使用灰名单中的一些非 SDK 接口(取决于应用的目标 API 级别),但若是使用任何非 SDK 方法或字段,则应用没法运行的风险终归较高。
若是不肯定本身的应用是否使用了非 SDK 接口,则能够测试该应用,进行确认。若是应用依赖于非 SDK 接口,则应该开始计划迁移到 SDK 替代方案。若是没法为应用中的某项功能找到使用非 SDK 接口的替代方案,则应该请求新的公共 API。
从 Android 11 开始,Open Mobile API (OMAPI) 有了额外的功能:
Android 11 添加了 API 来查询对同时使用多个摄像头(包括前置摄像头和后置摄像头)的支持。
要在运行应用的设备上检查支持状况,请使用如下方法:
getConcurrentStreamingCameraIds()
可返回摄像头 ID 组合 Set
,这些组合可与有保证的数据流组合并发进行流式传输(若是它们是由同一应用进程配置的)。isConcurrentSessionConfigurationSupported()
可查询摄像头设备是否能够并发支持相应的会话配置。到这里本篇文章也到了尾声了,本文基本写完了安卓11更新的主要内容,你们能够根据应用实际状况进行准备,如今还不着急适配,真正须要适配的话应该还得好几个月。最后再放一下官网地址:developer.android.google.cn/preview。 若是本文对你有帮助的话记得点赞关注啊,感激涕零!!!