Android 文件系统

在 Android Studio 可以在 DDMS 的 File Exploer 窗口中查看文件系统,下图就是一个 Android 文件系统目录。

Android 存储路径浅析_第1张图片
Android 存储路径浅析_第2张图片 Android 文件系统

Android 存储分类 (/data 目录和 /sdcard 目录)

Android 的存储可以分为三类:内存、内置 SD 卡,外置 SD 卡

一、内存

对应的就是 /data 目录,需要系统 root 之后才能查看,该目录下有很多子目录,其中对于软件开发比较重要的是:

1、 /data/app

该文件夹存放着系统中安装的第三方应用的 apk 文件,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是
uploading …..就是上传我们的apk到这个文件夹,上传成功之后才开始安装。


Android 存储路径浅析_第3张图片

Android 中应用的安装就是将应用的安装包原封不动地拷贝到 /data/app 目录下,每个应用安装包本质上就是一个 zip 格式的压缩文件。为了提升应用的启动效率,Android 会将解压出来的 dex 格式的应用代码文件解析提取后,缓存在 /data/dalvik-cache 目录下。

2、/data/data

该文件夹存放存储包私有数据,对于设备中每一个安装的 App,系统都会在内部存储空间的 data/data 目录下以应用包名为名字自动创建与之对应的文件夹。
用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。
该目录下又把存储内容进行了分类:

  • data/data/包名/cache: 存放的 APP 的缓存信息
  • data/data/包名/databases: 存放 APP 的数据库信息
  • data/data/包名/files: 存放 APP 的文件信息
  • data/data/包名/shared_prefs: 存放 APP 内的 SharedPreferences

3、API

  1. /data
Environment.getDataDirectory();
  1. /data/data/包名/files
context.getFilesDir();

对于 Files 目录下的文件,通常不会通过 File 类的方式直接进行读写,而是利用一些封装过的类或函数进行操作:

public FileInputStream openFileInput(String name)public FileOutputStream openFileOutput(String name, int mode)

还可以直接删除或查询该目录下的文件:

context.deleteFile(name)context.fileList()
  1. /data/data/包名/cache
context.getCacheDir();
  1. /data/data/包名/shared_prefs
context.getSharedPreferences(name,mode)//返回的是 SharedPreferences 对象context.deleteSharedPreferences(name)
  1. /data/data/包名/databases
context.getDataDir()context.getDatabasePath(name)context.deleteDatabase(name)
  1. /data/data/包名/app_name
context.getDir(name,mode)

经测试该方法会在 /data/data/包名/ 目录下生成一个以 app_ 开头的目录

二、外部存储

每个兼容 Android 的设备都支持可用于保存文件的共享“外部存储”。 该存储可能是可移除的存储介质(例如 SD 卡)或内部(不可移除)存储。 保存到外部存储的文件是全局可读取文件,而且,在计算机上启用 USB 大容量存储以传输文件后,可由用户修改这些文件。


Android 存储路径浅析_第4张图片

外部存储在 Android 文件系统中是 sdcard 目录,这里只是一个快捷方式,真正的目录是 /storage/emulated/legacy 文件夹

1、获取外存路径和状态

要读取或写入外部存储上的文件,应用必须获取READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE系统权限。

  1. 获取状态
Environment.getExternalStorageState()

返回值是以下一种:

  • MEDIA_UNKNOWN
  • MEDIA_REMOVED
  • MEDIA_UNMOUNTED
  • MEDIA_CHECKING
  • MEDIA_NOFS
  • MEDIA_MOUNTED
  • MEDIA_MOUNTED_READ_ONLY
  • MEDIA_SHARED
  • MEDIA_BAD_REMOVAL
  • MEDIA_UNMOUNTABLE
  1. 获取目录
Environment.getExternalStorageDirectory()

返回的路径是 /storage/emulated/0

2、公共目录

Android 在外部存储上提供了十个公共目录来存储相对应的文件:
通过 API Environment.getExternalStoragePublicDirectory(type) 来访问

  • DIRECTORY_MUSIC:/storage/emulated/0/Music
  • DIRECTORY_PODCASTS:/storage/emulated/0/Podcasts
  • DIRECTORY_RINGTONES:/storage/emulated/0/Ringtones
  • DIRECTORY_ALARMS:/storage/emulated/0/Alarms
  • DIRECTORY_NOTIFICATIONS:/storage/emulated/0/Notifications
  • DIRECTORY_PICTURES:/storage/emulated/0/Pictures
  • DIRECTORY_MOVIES:/storage/emulated/0/Movies
  • DIRECTORY_DOWNLOADS:/storage/emulated/0/Downloads
  • DIRECTORY_DCIM:/storage/emulated/0/Dcim
  • DIRECTORY_DOCUMENTS:/storage/emulated/0/Documents

3、私有目录

Android2.2 引入了基于扩展存储器的应用缓存目录,该目录指向大容量的扩展存储器。与应用的内存私有目录一样,缓存目录会随着应用的卸载一并删除。
和内部存储一样,会在 SD 卡的 Android/data 目录下生成对应包名的文件夹

  1. /storage/emulated/0/Android/data/应用包名/files
context.getExternalFilesDir(type)
  1. /storage/emulated/0/Android/data/应用包名/cache
context.getExternalCacheDir()
  1. 在 Android 目录下除了 data 目录还有一个 obb 目录
    /storage/emulated/0/Android/obb/应用包名
context.getObbDir()

Android 文件系统一些其它目录

  1. /cache 目录
    通过 API Environment.getDownloadCacheDirectory() 访问,存储下载文件的缓存路径
  2. /system 目录
    通过 API Environment.getRootDirectory() 访问,该目录下也有一个 app 目录,存放的是系统应用的 apk 文件。
/system/app 和 /data/app 的区别
  • /data/app 里软件权限没全开,/system/app 里的软件获取了所有权限
  • /data/app 可以应用卸载,/system/app 只能 root 后删除
  • /data/app 文件夹大小随便,/system/app 文件夹有大小限制
  • 卸载/system/app 目录下的文件并不会增加系统空间,即可用 ROM 空间
  1. /mnt 目录
    这个目录专门用来当作挂载点挂在外部设备的,如 SD 卡,sdcard
    将会被系统视作一个文件夹,这个文件夹将会被系统嵌入到收集系统的 mnt 目录中,所以在 /mnt 目录下也会看到一个 sdcard 的快捷方式:


    Android 存储路径浅析_第5张图片

更多相关文章

  1. 传智播客—Android(二)数据存储和访问 之文件
  2. Android夸进程通信机制五:使用文件共享进行进程间通信
  3. 初涉Android之文件保存
  4. Android Studio Gradle 添加.so 支持文件
  5. 在Android设备与Mac电脑之间传输文件
  6. android中文件IO
  7. Android 常用UI控件的一些属性设置(在.xml文件里进行的设置)
  8. Android studio 如何在android选项下生成jniLibs目录

随机推荐

  1. Android动态添加Fragment
  2. Android(安卓)Custom
  3. Android(安卓)studio开发中遇到的一些异
  4. Android(安卓)工具类
  5. android视频播放的代码
  6. [Android拾怡]弱化Java方法返回值类型
  7. android位置服务
  8. Android简单、美观而且十分强大的日志工
  9. android SpannableString使用详解
  10. Android实现复制粘贴功能