当前位置:首页 > 行业动态 > 正文

安卓存储结构

安卓存储结构详解

存储类型划分

安卓系统采用分层式存储架构,主要分为以下三类:

存储类型 特点
内部存储 设备内置的闪存空间,包含系统分区和应用数据分区
外部存储 可扩展存储介质(如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的虚拟路径 | 传统外部存储访问入口 |

安卓存储结构  第1张

特殊存储区域

  1. 应用专属外部目录
    通过getExternalFilesDir()获取,无需申请危险权限,适合存储多媒体素材:

    File[] externalDirs = context.getExternalFilesDirs(null); // 多存储介质支持
  2. 提供器
    通过MediaStore API操作:

    -插入图片示例
    INSERT INTO MediaStore.Images.Media (_data, mime_type) VALUES ('/path/to/image.jpg', 'image/jpeg');
  3. 系统配置存储
    关键配置文件位置:

    /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中的数据会在应用卸载时被清除

0