存储全景:内部、外部、分区与 FUSE
2026/8/9大约 2 分钟存储与多媒体Android 14存储FUSE分区
存储全景:内部、外部、分区与 FUSE
Android 存储问题至少包含物理分区、挂载路径、应用看到的 FUSE 视图和 Framework 访问策略。 “文件在哪里”与“当前 UID 能否通过某个 API 访问”是两个需要分别回答的问题。
路径、视图与访问策略要分开
| 常见误解 | 正确理解 |
|---|---|
| 内部存储和外部存储是两块物理盘 | 通常是同一块磁盘上按权限划分的两套目录语义 |
| 外部存储是“SD 卡” | /storage/emulated 是模拟的外部存储视图,SD 卡是另一回事 |
| 存储权限管一切文件 | 应用私有目录不需要权限,权限主要管共享媒体与外部文件 |
核心结论
- 内部存储按用户与包隔离,应用私有目录无需权限。
- 外部存储经 FUSE 呈现,MediaStore 管理共享媒体。
- 存储权限影响的是外部共享区域,不影响私有目录。
- 系统分区只读为主,data 分区承载用户数据。
- 排查存储问题先分清“哪一层视图、哪个目录、要不要权限”。
存储视图主链
逐步解释:
- 内部存储:按用户与包隔离。
- 外部存储:FUSE 呈现共享视图。
- 媒体索引:MediaStore 管理共享媒体。
- 系统分区:只读承载系统。
常见目录速查
| 位置 | 示例 | 说明 |
|---|---|---|
| 应用内部 | /data/user/0/<pkg>/ | 私有 |
| 应用外部私有 | /storage/emulated/0/Android/data/<pkg>/ | 私有 |
| 共享媒体 | /storage/emulated/0/Pictures/ | MediaStore 管理 |
| 系统分区 | /system、/vendor、/product | 只读 |
常用在哪些地方
按排查频率排列:
- 媒体文件读不到:MediaStore 与权限。
- 清除数据/卸载残留:目录与权限。
- 大文件传输:外部存储与 FUSE。
- 磁盘不足:分区与缓存。
- 多用户隔离:/data/user。
验证与排障
环境:开发设备或模拟器;查看 /data 需要 root。
adb shell df -h
adb shell ls -l /storage/emulated/0/
adb shell content query --uri content://media/external/images/mediadf 看分区;外部存储看 FUSE 视图;content query 查 MediaStore。存储问题先分清 “文件系统层还是媒体索引层”。
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
Environment.java | 目录路径 | 存储视图 |
StorageManager.java | 卷管理 | 分区 |
| FUSE 实现 | 外部视图 | 权限代理 |
MediaStore.java | 媒体索引 | 共享媒体 |
公共路径:frameworks/base/core/java/android/os/ 与 frameworks/base/media/java/android/provider/。行号以 r75 检索为准。
共享存储的访问边界,见 Scoped Storage。