回顾 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 中要求所有应用都使用 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) 将不再展示这些对话框。我们希望这项改进能够使用户体验更加顺畅。
对 Storage Access Framework 的更新
当我们对广泛的存储访问进行限制后,一些开发者试图使用 Storage Access Framework (SAF) 遍历整个文件系统。但是,SAF 并不适用于广泛地访问共享存储内容。因此,我们 对其进行了更新,限制了它对某些路径的可见性。
在 Android 11 中,将不再允许用户授权访问 Downloads 的根目录、每个可用 SD 卡的根目录以及其它应用的目录。应用仍然可以通过 Storage Access Framework API 或者文件选择器来帮助用户从共享存储中选取个别文件。
针对文件管理应用的特殊权限
针对文件管理器以及一些备份类的应用,它们需要获得共享存储的更广泛的访问权限。Android 11 里引入了一个特别的权限叫做 MANAGE _EXTERNAL_STORAGE,该权限将授权读写所有共享存储内容,这也将同时包含非媒体类型的文件。但是获得这个权限的应用还是无法访问其他应用的应用专属目录 (app-specific directory),无论是外部存储还是内部存储。
我们希望继续允许一些确实有广泛访问外部存储文件需求的应用。在 Android 11 中,已获得 MANAGE_EXTERNAL_STORAGE 权限的应用,可以将用户引导至系统设置页面,让用户选择是否允许该应用 "访问所有文件" (All Files Access)。下面的两种应用示例是可以使用该权限的:
- 文件管理器 —— 该类应用的主要功能是管理文件;
- 备份和恢复 —— 该类应用需要访问大批量的文件 (比如切换设备的时候进行数据迁移,或者将数据备份到云端)。
如果您的应用需要访问单个文件,比如文字处理应用,则应该使用 Storage Access Framework (SAF)。
如果您的应用需要 MANAGE_EXTERNAL_STORAGE 权限或者调用了依赖原始文件路径的 API,那么您必须在 AndroidManifest 文件中添加 requestLegacyExternalStorage=true
,这样您的应用才能够在搭载 Android 10 的设备上正常运行。
更多相关信息请查看我们在去年 Android 开发者峰会的分享视频《准备好使用分区存储》 或查看 Android 开发者文档: 《Android 11 中的存储更新》
我们非常重视您的反馈,您可以通过 issues tracker 向我们反馈 issue 或新特性需求。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Mysql索引、视图、存储过程和函数、触发器、存储引擎(一)
Mysql高级,数据库优化 一、知识点 1、索引 创建索引 CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name(index_col_name,...) 查看索引 show index 1 from table_name; 删除索引 DROP INDEX index_1 name ON tbl_name; 设计原则: 对查询频次较高,且数据量比较大的表建立索引。 索引字段的选择,最佳候选列应当从where子句的条件中提取 使用唯一索引,区分度越高,使用索引的效率越高。 索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。 使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的I/O效率,也可以提升总体的访问效率。 利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。 ...
- 下一篇
如何理解时间复杂度和空间复杂度
我们经常可以看到这样的描述:软件=数据结构+算法,可见算法基础对于一个程序员的重要性。算法中,有两个基本概念:时间复杂度和空间复杂度。 时间复杂度:描述算法执行消耗的时间,时间越短,时间复杂度越低,算法越优秀; 空间复杂度:描述算法执行所占用的内存空间,占用内存越少,空间复杂度越低,算法越优秀; 因此,时间复杂度和空间复杂度是评价一个算法性能的主要指标。那么如何计算一个算法的时间复杂度和空间复杂度呢? 简单理解,计算时间复杂度就是评估一个算法完成后执行了多少行代码,也就是算法所消耗的时间,但是该如何用数学的方式其表示出来呢? 假设现在有个一个算法需要执行n次运算,我们用T(n)表示,n即表示算法的规模(比如n=10时,循环输出10次Hello World;n=100时,循环输出100次Hello World)。如果假设存在一个函数f(n),表示随着n的变化,算法需要执行的次数,当T(n)=O(f(n)),那么O(f(n))即为算法的时间复杂度。 比如,一个普通的循环: public int calc(int n) { int total = 0; for (int i = 0; i &...
相关文章
文章评论
共有0条评论来说两句吧...