Android存储包括内部存储和外部存储。

内部存储

英文:Internal Storage,属于系统自带存储空间的一部分,在手机内部。具体说就是除了后文要提到的 非ROOT下能看到并且读取的目录 外的所有手机内部的存储。

对于应用开发来说,内部存储主要关注以下2个目录:

  • /data/app : 应用程序安装的目录
  • /data/data: 该目录存放应用程序的私有数据

应用的安装目录

应用安装的时候,系统 PMS (PackageManagerService) 进程会将 apk 文件复制到这个目录。

应用的私有目录

应用安装完成之后,Android 系统都会在 /data/data 目录下用应用包名作为名字自动创建一个文件夹,这个文件夹就是应用的私有目录

常用的私有目录有:

  • cache (/data/data/应用包名/cache)
    存放应用的缓存信息。获取 API :

    1
    context.getCacheDir()
  • shared_prefs (/data/data/应用包名/shared_prefs)
    存放应用的 SharedPreferences信息,常用API:

    1
    2
    3
    4
    // 获取指定的 SharedPreferences 对象
    context.getSharedPreferences(name,mode)
    // 删除指定的 SharedPreferences
    context.deleteSharedPreferences(name)
  • databases (/data/data/应用包名/databases)
    存放应用的数据库信息。常用 API:

    1
    2
    3
    4
    5
    6
    // 获取 database 目录
    context.getDataDir()
    // 获取指定数据库对象
    context.getDatabasePath(dbName)
    // 删除指定数据库对象
    context.deleteDatabase(dbName)
  • files (`/data/data/应用包名/files)
    存放应用的文件信息,常用API:

    1
    2
    3
    4
    5
    6
    // 获取 files 目录
    context.getFilesDir()
    // 删除指定文件对象
    context.deleteFile(fileName)
    // 获取所有文件对象
    context.fileList()

注意:应用卸载的时候,系统会自动删除应用的私有目录及其内容。

其他

除开上边应用开发常用的,还有几个获取内部存储根目录的方法也会经常用到:

1
2
3
4
5
6
// 获取 /data 目录
Environment.getDataDirectory()
// 获取 /cache 目录
Environment.getDownloadCacheDirectory()
// 获取 /system 目录
Environment.getRootDirectory()

外部存储

英文:External Storage。

外部存储不仅仅指我们的SD卡,它包含SD卡、U盘等等可加载、移除的存储介质,以及在手机内部非ROOT下能看到并且读取的内部存储

保存在外部存储的文件是全局可读写的文件,当手机通过USB连接到计算机并以传输文件后,可由用户修改这些文件。

外部存储在Android 文件系统中是 /sdcard 目录,这只是个快捷方式,真正的目录是 /storage/emulated/0 文件夹,链接过程如下:

/sdcard -> /storage/self/primary -> /mnt/user/0/primary -> /storage/emulated/0

如下图:

编程中获取外部存储的接口有如下一些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 获取外部存储目录(/storage/emulated/0)  
Environment.getExternalStorageDirectory()
// 获取Alarms目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)
// 获取DCIM目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
// 获取Download目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
// 获取Pictures目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
// 获取Movies目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
// 获取Music目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
// 获取Notifications目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)
// 获取Podcasts目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS)
// 获取Ringtones目录
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)

应用私有目录

除了上边这些,还有个可供App操作的外部存储目录(App私有目录),存储路径为:

1
/sdcard/Android/data/应用包名

操作的API:

1
2
3
4
5
6
7
8
// 对应目录/sdcard/Android/data/应用包名/files
// 一般存储长时间保存的数据
// 可通过 "应用详情 -> 清除数据" 选项清理掉
context.getExternalFilesDir()
//对应目录/sdcard/Android/data/应用包名/cache
// 看名称也知道是缓存用,一般存储临时缓存数据
// 可通过 "应用详情 -> 清除缓存" 选项清理
context.getExternalCacheDir()

注意:默认情况下,系统不会自动创建外部存储空间的应用私有目录,只有在应用开发人员在需要的时候,通过 Android SDK 提供的 API 去创建和操作目录和文件内容。
这个私有目录在用户卸载 APP 时,系统会自动删除,不会留下垃圾。