如果您曾经尝试过在 Android 设备上管理文件,您可能会注意到,根据您运行的 Android 版本,情况会有所不同。从 Android 10 开始,Google 对应用程序与文件系统的交互方式进行了根本性转变。这一更改称为 范围存储,重新定义了在共享存储上读写文件的规则。对于旁加载应用程序、管理 OBB 文件或使用文件管理器的用户来说,了解范围存储至关重要。
在本文中,我们将探讨什么是作用域存储、Google 实施它的原因、它如何影响日常用户和开发人员,以及它对于在 Play 商店之外安装 APK 或 XAPK 文件的任何人意味着什么。
旧存储模型的问题
在 Android 10 之前,任何请求 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 权限的应用都可以访问设备共享存储上的几乎任何文件。这包括照片、文档、下载,甚至其他应用程序创建的文件。虽然这使文件管理变得方便,但也带来了严重的隐私和安全问题。
考虑一个简单的手电筒应用程序。在旧模型下,如果您授予它存储权限,它可以默默地读取您的照片,扫描您下载的文档,甚至修改属于其他应用程序的文件。没有细粒度的控制。您要么授予应用程序对整个存储的完全访问权限,要么完全拒绝它。
这种广泛的访问导致了现实世界的问题。一些应用程序通过扫描存储中的敏感文件来收集用户数据。其他人则留下了孤立的文件,这些文件在应用程序被卸载后很长一段时间内使设备变得混乱。谷歌需要一个平衡可用性和隐私的解决方案,而范围存储就是他们的答案。
作用域存储实际上是做什么的
分区存储从根本上改变了应用程序和文件系统之间的关系。在此模型下,每个应用程序在外部存储上都有自己的私有沙箱,通常位于 /Android/data/[package.name]/。应用程序可以在自己的沙箱中自由读写,无需任何权限。
但是,访问此沙箱之外的文件需要通过受控 API。新模型的工作原理如下:
应用程序特定存储
每个应用程序都有一个只有它可以访问的专用目录。当应用程序卸载时,该目录会自动清理。如果没有 root 访问权限,其他应用程序无法读取或写入此位置。这消除了孤立文件的问题并防止跨应用程序数据窥探。
媒体收藏
对于照片、视频和音频文件等共享媒体,Android 提供了 MediaStore API。应用程序可以向共享集合提供媒体并读取其他应用程序创建的媒体,但只能通过此结构化界面。应用无需任何权限即可查看自己的媒体,但访问其他应用的媒体需要 Android 13 中引入的 READ_MEDIA_IMAGES、READ_MEDIA_VIDEO 或 READ_MEDIA_AUDIO 权限。
存储访问框架
对于文档和其他非媒体文件,应用程序必须使用存储访问框架 (SAF)。这向用户提供了一个系统文件选择器,用户可以明确选择应用程序可以访问哪些文件或目录。该应用程序永远无法全面访问整个文件系统。
MANAGE_EXTERNAL_STORAGE 权限
对于真正需要广泛文件访问的应用程序,例如文件管理器、备份工具和防病毒软件,Android 提供了 MANAGE_EXTERNAL_STORAGE 权限。但是,对于通过 Play 商店分发的应用程序,此权限需要 Google 的特别批准,并且用户必须通过系统设置而不是简单的对话框手动授予该权限。
推出时间表
谷歌并没有在一夜之间强制实施范围存储。转变是逐渐发生的:
- 引入了 Android 10(API 29): 范围存储,但应用程序可以选择在其清单中不使用 requestLegacyExternalStorage="true"。这给了开发人员适应的时间。
- Android 11(API 30): 对于面向 API 30 或更高版本的应用程序,旧标志被忽略。 Play 商店中新的和更新的应用程序必须使用分区存储。
- Android 12 及更高版本: 进行了进一步的改进,包括精细的媒体权限和改进的 SAF 性能。
- Android 13(API 33): 广泛的 READ_EXTERNAL_STORAGE 权限已被弃用,取而代之的是特定的媒体权限。
- Android 14(API 34): 引入了部分照片和视频访问权限,允许用户授予对特定文件而不是整个媒体库的访问权限。
分区存储如何影响旁加载
对于从 Play 商店外部安装应用程序的用户来说,范围存储带来了一些值得理解的实际挑战。
下载并访问 APK 文件
当您通过浏览器下载 APK 文件时,它通常会位于“下载”文件夹中。在范围存储下,浏览器应用程序拥有该文件。如果您想使用其他应用程序(例如文件管理器)安装它,则该文件管理器需要适当的访问权限。大多数现代文件管理器通过 SAF 正确处理此问题,但较旧的文件管理器可能会遇到困难。
系统包安装程序仍然可以访问您通过文件选择器明确选择的文件,因此下载和安装 APK 的基本流程仍然有效。但是,依赖于直接文件路径访问的自动化安装工作流程可能会中断。
OBB 文件和游戏数据
这是范围存储给侧面加载器带来最大阻力的地方。许多大型游戏都使用存储在 /Android/obb/[package.name]/ 中的 OBB(不透明二进制 Blob)文件。在旧模型下,您只需使用任何文件管理器将 OBB 文件复制到正确的目录即可。
对于范围存储,/Android/obb/ 目录受到限制。在 Android 11 及更高版本上,常规应用无法写入其他应用的 OBB 目录。这意味着,如果您下载包含 OBB 数据的 XAPK 文件,安装程序需要特殊处理才能正确放置这些文件。
像我们的 OBB提取器 这样的工具可以帮助您从 XAPK 包中提取 OBB 文件,但在较新的 Android 版本上将它们放在正确的目录中可能需要使用具有 MANAGE_EXTERNAL_STORAGE 权限的文件管理器或使用计算机上的 ADB 命令。
XAPK 安装注意事项
XAPK 文件将 APK 与 OBB 数据捆绑在一起,有时会拆分 APK 配置。在运行 Android 11 或更高版本的设备上安装它们需要了解范围存储限制的安装程序。安装程序需要持有 MANAGE_EXTERNAL_STORAGE 权限或使用正确的 API 将 OBB 文件放置在正确的位置。
这就是将 XAPK 文件转换为标准 APK 格式非常有用的原因之一。独立 APK 不需要放置 OBB 文件,从而简化了较新 Android 版本的安装过程。您可以使用我们的 XAPKS 到 APK 转换器 从 XAPK 包中提取基本 APK。
开发人员需要了解什么
如果您正在开发 Android 应用程序,范围存储需要重新考虑如何处理文件:
- 使用特定于应用程序的目录 适用于只有您的应用程序需要的任何文件。这些不需要权限,并且会在卸载时自动清除。
- 使用媒体商店 用于其他应用程序应可见且卸载后仍可正常使用的照片、视频和音频。
- 使用SAF 当您的应用程序需要使用用户选择的文档或目录时。
- 避免硬编码文件路径。 像 /sdcard/MyApp/ 这样的路径不再可靠。请改用 Context.getExternalFilesDir()。
- 在多个 API 级别上进行测试。 Android 10、11、13 和 14 之间的行为存在显着差异。
迁移策略
如果您的应用程序以前将文件存储在共享存储中,则您需要一个迁移计划。建议的方法是在更新后首次启动时将现有文件复制到应用程序特定的存储,然后删除旧副本。在过渡期间使用带有旧标志的 Environment.getExternalStorageDirectory() 来读取旧文件,然后将它们移动到新位置。
常见的误解
“范围存储意味着应用程序无法访问任何文件”
这是错误的。应用程序仍然可以自由访问自己的文件,贡献共享媒体收藏,并通过系统选择器请求访问特定文件。改变的是应用程序不能再默默地浏览整个文件系统。
“文件管理器在新的 Android 版本上被破坏”
请求 MANAGE_EXTERNAL_STORAGE 的文件管理器仍然有效。用户只需通过设置授予此特殊权限即可。大多数流行的文件管理器已经适应了这一要求。
“作用域存储仅影响 SD 卡”
作用域存储适用于所有共享存储,包括内部共享存储。 Android 中的术语“外部存储”是指可供多个应用程序访问的共享存储,不一定是物理 SD 卡。
给用户的实用技巧
如果您经常在 Android 设备上旁加载应用程序或管理文件,以下是一些实用的建议:
- 使用现代文件管理器,支持MANAGE_EXTERNAL_STORAGE。 Solid Explorer、MiXplorer 和 Total Commander 等应用程序已经很好地适应了范围存储。
- 仔细授予权限。 当文件管理器请求“所有文件访问权限”时,请了解这是 MANAGE_EXTERNAL_STORAGE 权限,并且是完整功能所必需的。
- 使用 ADB 进行顽固的文件操作。 如果您无法通过文件管理器放置 OBB 文件,则将设备连接到计算机并使用 adb push 可以完全绕过范围存储限制。
- 将复杂的包转换为更简单的格式。 如果 XAPK 文件在较新的设备上给您带来麻烦,则仅提取 APK 组件可能是阻力最小的路径。
- 保持您的安装程序应用程序更新。 旧版本的 XAPK 安装程序可能无法正确处理作用域存储。
Android 存储的未来
Google 在每个 Android 版本中不断完善存储模型。 Android 14 引入了部分媒体访问,让用户可以通过应用程序共享特定照片,而不是整个图库。 Android 15 预计将进一步改进存储访问框架的性能和可用性。
趋势很明显:Android 正在转向一种用户可以对每个应用程序可以查看和修改的内容进行细粒度控制的模型。虽然这给高级用户和侧加载器带来了一些摩擦,但它显着提高了更广泛用户群的隐私和安全性。
使用分区存储而不破坏应用程序数据
作用域存储是近年来 Android 架构最重大的变化之一。通过将应用程序限制在自己的沙箱中并要求用户明确同意才能进行更广泛的访问,谷歌极大地改善了该平台的隐私状况。对于旁加载应用程序并手动管理文件的用户来说,了解这些限制可以帮助您解决偶尔出现的摩擦点。对于开发人员来说,适应作用域存储不是可选的,而是现代 Android 开发的基本要求。
安装 APK、放置 OBB 文件以及日常管理存储都运行在同一个系统中:作用域存储。一旦您了解了它的工作原理,您就可以控制您的设备,而不是受到可能滥用广泛文件访问的应用程序的摆布。