###0. 前言
App在许多情况下都需要对数据进行缓存,通常存储的路径分为:
- 内部存储
- 外部存储(SDCard)
作为开发者,我们需要根据业务场景选定存储方式对数据进行存储。而主要分析的场景有以下几点:
- 缓存文件的大小
- 缓存文件是否跟随APP删除而清除
- 缓存文件所在位置的读写、执行权限问题
- 缓存文件的类型
- Android的”清除数据”功能带来的影响
- 针对没有外部存储的手机的兼容问题
###1.1 内部存储
内部存储指的是App的内部存储空间,路径通常为:/data/data/<包名>/...
,Android中的SharedPreferences、database、so库文件等都存放于此。
- /data/data/<包名>/cache:缓存部分APP运行中产生的临时文件
- /data/data/<包名>/databases:数据库默认的生成目录(可以通过重写ContextWrapper修改)
- /data/data/<包名>/files:App项目的assets中的文件
- /data/data/<包名>/lib:存放so库文件
- /data/data/<包名>/shared_prefs:存放SharedPreferences产生的xml文件
- /data/data/<包名>/app_webview:webView的缓存目录(HTML5使用的LocalStorage也是存放于此)
###1.2 外部存储
外部存储指的是Android手机自身扩展的存储空间或者外部插入SDCard的存储空间,路径通常为:/storage/sdcard
、/mnt/sdcard
、/storage/emulated/0
、/sdcard
等,这些路径全部都是指向同一个存储空间地址。
外部存储还包括手机外部SDCard插槽插入的SDCard和通过OTG线插入的移动U盘。它们的挂载路径以打印为准,不同品牌的手机可能不一样。
在访问外部存储时,需要声明SDCard的读写权限。
< uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE" />
< uses-permission android:name ="android.permissions.READ_EXTERNAL_STORAGE" />
###1.3 App数据存储路径(私有目录)
/data/data/<包名>/
/storage/emulated/0/Android/data/<包名>/
在App被删除的时候,上面两个相关的路径会被移除。
在android系统设置的应用列表详情页里,有一个清除数据的功能,同样也是移除上述两个路径的全部数据。
所以,在保存App相关的缓存文件时,首要选择就是这两个文件目录。其中,由于内部存储空间较小,通常会优先采用外部存储路径存储文件,在找不到外部存储时才存储必要文件到内部存储空间中。
###1.4 公共存储
如果保存的是一些可以共享的文件,例如:图片、音频、视频文件等,可以直接存储在公共的标准目录中。谷歌提供了一套存放的标准目录给开发者选择。
以下都是Environment中的dir的参数type的类型(例如:Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
):
- android.os.Environment.DIRECTORY_MUSIC //音乐存放的标准目录
- android.os.Environment.DIRECTORY_PODCASTS //系统广播存放的标准目录
- android.os.Environment.DIRECTORY_RINGTONES //系统铃声存放的标准目录
- android.os.Environment.DIRECTORY_ALARMS // 系统提醒铃声存放的标准目录。
- android.os.Environment.DIRECTORY_NOTIFICATIONS //系统通知铃声存放的标准目录
- android.os.Environment.DIRECTORY_PICTURES //图片存放的标准目录
- android.os.Environment.DIRECTORY_DCIM //相机拍摄照片和视频的标准目录
- android.os.Environment.DIRECTORY_MOVIES //电影存放的标准目录
- android.os.Environment.DIRECTORY_DOCUMENTS //文档
- android.os.Environment.DIRECTORY_DOWNLOADS //下载的标准目录
对应路径:/storage/emulated/0/
+ Type
当然,也可以自己创建新目录到SdCard中,对数据进行存储。
###1.5 文件夹权限
Android的文件系统可以参考linux的文件系统的权限。
例如:一个目录的权限为: d rwx rwx –x
- 第一个字符d代表目录
- 目录:d
- 文件:-
- 连结档(link file):l (通常app的lib目录就是此类型)
- 可读:r
- 可写:w
- 可执行:x
- 无权限:-
权限组分为3组:
d rwx(1.拥有者) rwx(2.同一群组用户) –x(3.其他用户)
###2.0 附
通用的文件路径工具类,优先采用外部存储目录: FileManager
###3.0 总结
Android的文件系统的使用需要根据业务场景进行选择,同时得考虑在不同品牌、系统的机型中的不同表现。所以,需要多测试。
END
–Nowy
–2019.02.12