Android 11 中的存储机制更新
发布日期:2021-10-20 03:27:09 浏览次数:6 分类:技术文章

本文共 3659 字,大约阅读时间需要 12 分钟。

Android 10 引入了对外部存储权限的更改,旨在更好地保护用户数据以及降低应用的存储空间。里加入了更多改进,以帮助开发者更好地适应这些权限修改。

在 Google Play 上发布的大部分应用都会请求 (READ_EXTERNAL_STORAGE) 存储权限,来做一些诸如在 SD 卡中存储文件或者读取多媒体文件等常规操作。这些应用可能会在磁盘中存储大量文件,即使应用被卸载了还会依然存在。另外,这些应用还可能会读取其他应用的一些敏感文件数据。

在 Android 10 中,我们调整了存储权限的工作方式,仅为应用提供其所需的访问权限。这也是在鼓励应用在指定目录下进行文件存储以限制文件混乱。当应用被卸载后,这些相关的目录也会被删除。

Android 10 所带来的关于存储上的变更遵循了以下三个基本原则

  • 更好的从属性: 系统知道哪些文件属于哪些应用,这可以让用户更方便地管理他们的文件。当应用被卸载后,除非用户需要,否则应用之前所创建的文件也不应该保留在设备上;

  • 保护应用数据: 当一个应用将它所属的文件写入外部存储时,这些文件是不应该被其他应用所访问的;

  • 保护用户数据: 当用户下载了一些文件,比如带有敏感信息的邮件附件,这些文件应该对其他应用不可见。

目标 API 级别 (Target SDK Level) 设定为 Android 10 的应用无需请求 Storage 权限,就可以使用自己的外部存储目录并管理媒体集合 (音频、视频、图片和下载数据)。Storage 权限仅允许读取其他应用共享的音频、视频和图片集合,但并不允许访问非本应用创建的下载数据。在 Android 10 里唯一一种访问其他应用创建的非媒体文件的途径是使用存储访问框架 (Storage Access Framework) 提供的文档选择器。

在 Android 11 中,我们会通过下述的几点来继续优化分区存储 (Scoped Storage) 的开发者体验。

  • Android 10 对外部存储权限行为

    https://developer.android.google.cn/training/data-storage#scoped-storage

  • 请求 (READ_EXTERNAL_STORAGE) 存储权限

    https://developer.android.google.cn/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE

  • 它所属的文件

    https://developer.android.google.cn/training/data-storage/app-specific

  • 存储访问框架 (Storage Access Framework)

    https://developer.android.google.cn/guide/topics/providers/document-provider

改进媒体存储

Android 10 中要求所有应用都使用 MediaStore API 来访问照片、视频和音乐文件,我们也将继续秉承这个原则。但是我们也知道,很多深度依赖基于原始文件路径 API 的应用和第三方库是很难切换到使用文件描述符 (File Descriptor) 的。因此在 Android 11 里,依赖原始文件路径的 API 和库可以再次使用了。您需要在应用的 Manifest 文件里添加 requestLegacyExternalStorage 属性,以保证 Android 10 的用户也可以使用该特性。

在实际的运行中,依赖原始文件路径的 I/O 请求会被重定向到使用 MediaStore API,当使用这种方式访问本应用存储空间之外的文件时,这次重定向会造成性能影响。而且直接使用原始文件路径,并不会比使用 MediaStore API 有更多优势,因此我们强烈建议直接使用 MediaStore API。

在 Android 10 中,应用在对每一个文件请求编辑或删除时都必须得到用户的确认。而在 Android 11 中,应用可以一次请求修改或者删除多个媒体文件。系统的默认图库应用 (Gallery) 将不再展示这些对话框。我们希望这项改进能够使用户体验更加顺畅。

  • 可以再次使用

    https://developer.android.google.cn/preview/privacy/storage#media-files-raw-paths

  • 修改或者删除多个媒体文件

    https://developer.android.com/preview/privacy/storage#media-file-access

对 Storage Access Framework 的更新

当我们对广泛的存储访问进行限制后,一些开发者试图使用 Storage Access Framework (SAF) 遍历整个文件系统。但是,SAF 并不适用于广泛地访问共享存储内容。因此,我们对其进行了更新,限制了它对某些路径的可见性。

在 Android 11 中,将不再允许用户授权访问 Downloads 的根目录、每个可用 SD 卡的根目录以及其它应用的目录。应用仍然可以通过 Storage Access Framework API 或者文件选择器来帮助用户从共享存储中选取个别文件。

  • 对其进行了更新

    https://developer.android.google.cn/preview/privacy/storage#file-directory-restrictions

针对文件管理应用的特殊权限

针对文件管理器以及一些备份类的应用,它们需要获得共享存储的更广泛的访问权限。Android 11 里将会引入一个特别的权限叫做 MANAGE_EXTERNAL_STORAGE,该权限将授权读写所有共享存储内容,这也将同时包含非媒体类型的文件。但是获得这个权限的应用还是无法访问其他应用的应用专属目录 (app-specific directory),无论是外部存储还是内部存储。

我们希望继续允许一些确实有广泛访问外部存储文件需求的应用。在 Android 11 中,已获得 MANAGE_EXTERNAL_STORAGE 权限的应用,可以将用户引导至系统设置页面,让用户选择是否允许该应用 "访问所有文件" (All Files Access)。下面的两种应用示例是可以使用该权限的:

  • 文件管理器 —— 该类应用的主要功能是管理文件;

  • 备份和恢复 —— 该类应用需要访问大批量的文件 (比如切换设备的时候进行数据迁移,或者将数据备份到云端)。

如果您的应用需要访问单个文件,比如文字处理应用,则应该使用 Storage Access Framework (SAF)。

在此政策更新正式上线 Google Play 之前,我们希望向您了解您的应用在这方面的具体需求,请扫描下面二维码填写问卷向我们提出反馈:

  • 调查问卷

    https://goo.gle/android11-survey-storage-cn

如果您的应用需要 MANAGE_EXTERNAL_STORAGE 权限或者调用了依赖原始文件路径的 API,那么您必须在 AndroidManifest 文件中添加  requestLegacyExternalStorage=true,这样您的应用才能够在搭载 Android 10 的设备上正常运行。

更多相关信息请查看我们在去年 Android 开发者峰会的分享视频《准备好使用分区存储》:

  • 腾讯视频链接

    https://v.qq.com/x/page/d3026c1bpr3.html

  • Bilibili 视频链接

    https://www.bilibili.com/video/av77198618/

 点击屏末  | 查看 Android 开发者文档:《Android 11 中的存储更新》

我们非常重视您的反馈,您可以通过 issues tracker 向我们反馈 issue 或新特性需求。也请继续关注谷歌开发者公众号未来发布的、基于 MediaStore 和 Storage Access Framework API 来调用分区存储的相关文章。

  • issues tracker

    https://issuetracker.google.com/issues/new?component=190602&template=1408010

 想了解更多 Android 内容?

  • 在公众号首页发送关键词 "Android",获取相关历史技术文章;

  • 在公众号首页发送关键词 "ADS",获取开发者峰会演讲中文字幕视频;

  • 还有更多疑惑?欢迎点击菜单 "联系我们" 反馈您在开发过程中遇到的问题。

推荐阅读


转载地址:https://blog.csdn.net/u014400934/article/details/105062130 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:我面试人只看这4点
下一篇:光背设计模式没用,来看看美团是怎么实践的吧!

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月08日 02时30分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

android pm.java,java – AM / PM的Android DateFormat因设备而异 2019-04-21
oracle存储过程调用sql文件,oracle - 在SQL Developer中运行存储过程? 2019-04-21
oracle同时报604和12507,V$SES_OPTIMIZER_ENV 查不到刚修改的隐含参数, 2019-04-21
zblog的php更换域名,zblogphp更换域名后,原zblog里使用了固定域名,登录不进去怎么办... 2019-04-21
oracle dnfs 配置,Source of Oracle参数解析(dnfs_batch_size) - django-\/\/ i K | 2019-04-21
oracle所需的环境,转:面对一个全新的oracle环境,首先应该了解什么? 2019-04-21
linux 小数四则运行,shell四则运算(整数及浮点数)的方法介绍 2019-04-21
linux系统分区后进入紧急模式,Linux系统的救援模式应用详解 2019-04-21
linux配置匿名ftp服务器,在Linux环境中使用vsftpd搭建ftp实现匿名上传详细配置 2019-04-21
linux创建硬盘分区lvm,LVM创建及分区调整、更换LVM硬盘 2019-04-21
FreeBSD可以安装Linux软件吗,在Linux服务器上面通过网络安装FreeBSD 2019-04-21
.net core linux 桌面应用,C# dotnet core + AvaloniaUI 开发桌面软件,hello world 2019-04-21
linux tcp 113错误,linux系统报tcp_mark_head_lost错误的处理方法 2019-04-21
南昌工程学院c语言答案,南昌工程学院C语言程序设计基础课件第3讲运算符和表达式... 2019-04-21
python学画画_python学画画(下) 2019-04-21
云栖社区 mysql_【直播结束,已更新回放】PG、MySQL到底哪个好?云栖说这次请来五位专家撕了一下-阿里云开发者社区... 2019-04-21
老男孩mysql 百度云_英语语录:除了你,没人能掌控你的幸福 2019-04-21
mysql驱动多次执行问题_Laravel5.2队列驱动expire参数设置带来的重复执行问题 数据库驱动... 2019-04-21
mysql获取刚新增的数据库_如何取得刚插入数据库的数据的id mysql 2019-04-21
python将10到1递减_(Python)如何将3个递减列表合并成一个递减列表? 2019-04-21