Android 11 中的存储机制更新

 

阅读最新 Android 11 开发者预览版里关于数据,存储机制的改进。...

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

在 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 trackerhttps://issuetracker.google.com/issues/newcomponent=190602&template=1408010



 想了解更多 Android 内容?


  • 在公众号首页发送关键词 "Android",获取相关历史技术文章;
  • 在公众号首页发送关键词 "ADS",获取开发者峰会演讲,中文字幕视频;
  • 还有更多疑惑?欢迎点击菜单 "联系我们" 反馈您在开发过程,中遇到的问题。
推荐阅读


    关注 谷歌开发者


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册