安卓存储结构
- 行业动态
- 2025-04-22
- 5
安卓存储结构详解
存储类型划分
安卓系统采用分层式存储架构,主要分为以下三类:
存储类型 | 特点 |
---|---|
内部存储 | 设备内置的闪存空间,包含系统分区和应用数据分区 |
外部存储 | 可扩展存储介质(如SD卡、OTG设备),android 6.0后统一为/storage/emulated/0 |
虚拟存储 | 通过Storage Access Framework(SAF)访问的云存储、文档提供商等 |
系统分区结构
/
├── system # 系统核心分区(含Android OS核心文件、预装应用)
├── boot # 启动加载程序
├── recovery # 恢复模式相关文件
├── data # 用户数据分区(重点)
│ ├── user # 多用户数据隔离目录
│ ├── app-asec # APK扩展安全容器
│ └── ... # 其他系统级配置
└── cache # 系统缓存分区
应用存储空间
每个应用在/data/data/
下拥有独立沙盒:
/data/data/包名/
├── files # 应用私有文件存储
├── cache # 临时缓存文件(系统可自动清理)
├── code_cache # 优化后的Dex文件存储
├── databases # SQLite数据库存放处
└── shared_prefs # SharedPreferences存储
外部存储规范
Android 10+ 引入作用域存储(Scoped Storage):
| 路径 | 访问权限 | 典型用途 |
|————————–|——————————|————————|
| /sdcard/
| 需申请READ_EXTERNAL_STORAGE
| 公共文件存储 |
| /sdcard/Android/
| 系统保留目录 | 系统配置备份 |
| /sdcard/Documents/
| 需SAF授权 | 用户文档管理 |
| /sdcard/Pictures/
| 需SAF授权 | 图片存储 |
| /storage/emulated/0/
| 兼容旧API的虚拟路径 | 传统外部存储访问入口 |
特殊存储区域
应用专属外部目录
通过getExternalFilesDir()
获取,无需申请危险权限,适合存储多媒体素材:File[] externalDirs = context.getExternalFilesDirs(null); // 多存储介质支持
提供器
通过MediaStore
API操作:-插入图片示例 INSERT INTO MediaStore.Images.Media (_data, mime_type) VALUES ('/path/to/image.jpg', 'image/jpeg');
系统配置存储
关键配置文件位置:/system/build.prop # 设备构建信息 /data/property/persist.conf # 持久化属性 /data/system/users.xml # 多用户配置
存储权限管理
权限声明 | Android 10+ 行为变化 |
---|---|
WRITE_EXTERNAL_STORAGE |
仅能访问应用专属目录 |
READ_EXTERNAL_STORAGE |
被MANAGE_EXTERNAL_STORAGE 替代(仅限系统应用) |
MANAGE_EXTERNAL_STORAGE |
允许管理所有文件(需特殊授权) |
SYSTEM_ALERT_WINDOW |
悬浮窗权限(影响文件选择器交互) |
相关问题与解答
Q1:如何在Android 11上实现跨应用文件共享?
A1:推荐使用Storage Access Framework(SAF),通过Intent.ACTION_OPEN_DOCUMENT
接口:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("/"); startActivityForResult(intent, REQUEST_CODE);
获取URI权限后,可通过ContentResolver
进行读写操作。
Q2:应用卸载时如何保留用户数据?
A2:将重要数据存储在ExternalFilesDir
或通过SAF保存到公共目录:
// 使用应用外部专属目录 File externalDir = getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS); // 或通过SAF选择持久化存储位置
注意:internal storage
中的数据会在应用卸载时被清除