Android 存储路径浅析

作者: 秀花123 | 来源:发表于2017-05-09 22:42 被阅读2746次

    Android 文件系统

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


    Android 文件系统

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

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

    一、内存

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

    1、 /data/app

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


    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 文件系统中是 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 的快捷方式:


    相关文章

      网友评论

      • 彼岸青园:写的很清楚
      • b464477555a7:请教一下 卸载app的时候 保存在外部存储 即Environment.getExternalStorageDirectory() + 报名 + /xxx 下的文件 会不会被删除
      • b005d514085a:总结的很好🐔🐔🐔

      本文标题:Android 存储路径浅析

      本文链接:https://www.haomeiwen.com/subject/dsuvtxtx.html