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

安卓存储位置

安卓存储分内部(系统/用户数据)和外部(SD卡),应用可装内置或外存,需权限访问,管理通过系统设置或文件应用

安卓存储位置详解

安卓存储架构

安卓系统采用分层存储设计,主要分为以下两类存储空间:
|存储类型|特点|
|——————–|————————————————————————–|
|内部存储| 设备内置的闪存空间,包含系统分区和用户可用空间 |
|外部存储| 可扩展的存储介质(如SD卡),或集成在设备中的虚拟外部存储空间(如EMMC) |

内部存储(Internal Storage)

  1. 系统分区

    • /system:存放Android操作系统核心文件、驱动
    • /vendor:厂商定制文件
    • /boot:启动加载程序
  2. 用户数据分区

    • /data/data/:安装应用的默认存储位置
      • 示例路径:/data/data/com.example.app/
      • 包含应用安装文件、数据库、SharedPreferences等
    • /data/user/:用户配置信息(如桌面布局、Wi-Fi密码)
  3. 特殊目录
    |路径|用途|
    |————————|———————————–|
    |/cache | 系统级缓存(如地图离线包) |
    |/sdcard | Android 10前的公共外部存储挂载点 |

外部存储(External Storage)

  1. 物理外部存储(SD卡)

    • 标准路径:/storage/sdcard0(主存储)、/storage/sdcard1(副卡)
    • 特性:可移除、支持FAT32/exFAT格式
  2. 虚拟外部存储

    安卓存储位置  第1张

    • Android 4.4+ 引入:/storage/emulated/0(主存储)、/storage/emulated/1(SD卡模拟)
    • Android 10+ 变更:应用默认只能访问自身创建的外部存储目录
  3. 常见数据存放路径
    |文件类型|路径示例|
    |——————–|—————————————————————————–|
    |图片/视频|DCIM/Camera(系统相机)、Pictures(第三方应用) |
    |下载文件|Download/ |
    |文档|Documents/ |
    |应用安装包|Download/(部分厂商)或Android/data/(Split APK场景) |
    |缓存文件|Android/data/包名/cache/ |

存储权限管理

  1. 危险权限声明

    • READ_EXTERNAL_STORAGE:读取外部存储文件
    • WRITE_EXTERNAL_STORAGE:写入/删除外部存储文件
    • Android 10+ 新增:ACCESS_MEDIA_LOCATION(精确定位媒体文件)
  2. 运行时权限处理

    // 请求权限示例
    ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
  3. 分区存储限制(Android 10+)

    • 应用默认只能访问:
      /sdcard/Android/data/包名/(文件)
      /sdcard/Android/media/包名/(媒体)
    • 突破限制方案:
      • 使用Storage Access Framework(Intent.ACTION_OPEN_DOCUMENT)
      • 申请MANAGE_EXTERNAL_STORAGE特权权限(需Google Play签名认证)

存储空间管理

  1. 查看存储占用

    • 命令行工具:df -h(显示各分区使用情况)
    • 系统设置:Settings > Storage(图形化界面)
  2. 清理策略
    |文件类型|清理方式|
    |——————–|—————————————————————————-|
    |应用缓存| 通过Context.getCacheDir()获取路径,调用deleteRecursive()递归删除 |
    |残留安装包| 删除/sdcard/Download/下的.apk文件 |
    |缩略图缓存| 清理/sdcard/.thumbnails/目录 |


相关问题与解答

Q1:如何判断当前设备的存储类型(内部/外部)?

A

  1. 通过Environment.getExternalStorageState()检查存储状态
  2. 使用StatFs类获取路径可用空间:
    StatFs stats = new StatFs(Environment.getExternalStorageDirectory().getPath());
  3. Android 10+可通过Context.getExternalFilesDir()获取应用专属外部存储路径,若返回null则为内部存储。

Q2:应用如何迁移用户数据到新的存储位置?

A

  1. 兼容性处理

    • Android 10+使用getExternalFilesDir()获取应用专用目录
    • 低版本仍使用Environment.getExternalStorageDirectory()
  2. 数据迁移步骤

    // 旧路径(Android 9及以前)
    File oldDir = new File(Environment.getExternalStorageDirectory(), "MyAppData");
    // 新路径(Android 10+)
    File newDir = getExternalFilesDir("MyAppData");
    // 迁移逻辑
    if (oldDir.exists() && newDir != null) {
        FileUtils.copyDirectory(oldDir, newDir); // 需自行实现递归拷贝
    }
  3. 注意事项

    • 迁移后需删除旧数据目录,避免冗余
    • 使用MediaScannerConnection通知系统更新媒体库索引