安卓存储位置
- 行业动态
- 2025-04-24
- 2652
安卓存储分内部(系统/用户数据)和外部(SD卡),应用可装内置或外存,需权限访问,管理通过系统设置或文件应用
安卓存储位置详解
安卓存储架构
安卓系统采用分层存储设计,主要分为以下两类存储空间:
|存储类型|特点|
|——————–|————————————————————————–|
|内部存储| 设备内置的闪存空间,包含系统分区和用户可用空间 |
|外部存储| 可扩展的存储介质(如SD卡),或集成在设备中的虚拟外部存储空间(如EMMC) |
内部存储(Internal Storage)
系统分区
/system
:存放Android操作系统核心文件、驱动/vendor
:厂商定制文件/boot
:启动加载程序
用户数据分区
/data/data/
:安装应用的默认存储位置- 示例路径:
/data/data/com.example.app/
- 包含应用安装文件、数据库、SharedPreferences等
- 示例路径:
/data/user/
:用户配置信息(如桌面布局、Wi-Fi密码)
特殊目录
|路径|用途|
|————————|———————————–|
|/cache
| 系统级缓存(如地图离线包) |
|/sdcard
| Android 10前的公共外部存储挂载点 |
外部存储(External Storage)
物理外部存储(SD卡)
- 标准路径:
/storage/sdcard0
(主存储)、/storage/sdcard1
(副卡) - 特性:可移除、支持FAT32/exFAT格式
- 标准路径:
虚拟外部存储
- Android 4.4+ 引入:
/storage/emulated/0
(主存储)、/storage/emulated/1
(SD卡模拟) - Android 10+ 变更:应用默认只能访问自身创建的外部存储目录
- Android 4.4+ 引入:
常见数据存放路径
|文件类型|路径示例|
|——————–|—————————————————————————–|
|图片/视频|DCIM/Camera
(系统相机)、Pictures
(第三方应用) |
|下载文件|Download/
|
|文档|Documents/
|
|应用安装包|Download/
(部分厂商)或Android/data/
(Split APK场景) |
|缓存文件|Android/data/包名/cache/
|
存储权限管理
危险权限声明
READ_EXTERNAL_STORAGE
:读取外部存储文件WRITE_EXTERNAL_STORAGE
:写入/删除外部存储文件- Android 10+ 新增:
ACCESS_MEDIA_LOCATION
(精确定位媒体文件)
运行时权限处理
// 请求权限示例 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
分区存储限制(Android 10+)
- 应用默认只能访问:
/sdcard/Android/data/包名/
(文件)/sdcard/Android/media/包名/
(媒体) - 突破限制方案:
- 使用
Storage Access Framework
(Intent.ACTION_OPEN_DOCUMENT) - 申请
MANAGE_EXTERNAL_STORAGE
特权权限(需Google Play签名认证)
- 使用
- 应用默认只能访问:
存储空间管理
查看存储占用
- 命令行工具:
df -h
(显示各分区使用情况) - 系统设置:
Settings > Storage
(图形化界面)
- 命令行工具:
清理策略
|文件类型|清理方式|
|——————–|—————————————————————————-|
|应用缓存| 通过Context.getCacheDir()
获取路径,调用deleteRecursive()
递归删除 |
|残留安装包| 删除/sdcard/Download/
下的.apk
文件 |
|缩略图缓存| 清理/sdcard/.thumbnails/
目录 |
相关问题与解答
Q1:如何判断当前设备的存储类型(内部/外部)?
A:
- 通过
Environment.getExternalStorageState()
检查存储状态 - 使用
StatFs
类获取路径可用空间:StatFs stats = new StatFs(Environment.getExternalStorageDirectory().getPath());
- Android 10+可通过
Context.getExternalFilesDir()
获取应用专属外部存储路径,若返回null
则为内部存储。
Q2:应用如何迁移用户数据到新的存储位置?
A:
兼容性处理:
- Android 10+使用
getExternalFilesDir()
获取应用专用目录 - 低版本仍使用
Environment.getExternalStorageDirectory()
- Android 10+使用
数据迁移步骤:
// 旧路径(Android 9及以前) File oldDir = new File(Environment.getExternalStorageDirectory(), "MyAppData"); // 新路径(Android 10+) File newDir = getExternalFilesDir("MyAppData"); // 迁移逻辑 if (oldDir.exists() && newDir != null) { FileUtils.copyDirectory(oldDir, newDir); // 需自行实现递归拷贝 }
注意事项:
- 迁移后需删除旧数据目录,避免冗余
- 使用
MediaScannerConnection
通知系统更新媒体库索引