手机应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据?
/data /mnt /sdcard /storage 的区别和联系
内存,内部存储,外部存储,很多人常常将这三个东西搞混,能说清这三个东西是怎么回事不?
参考博客:
Android内存解析(二)— 详解内存,内部存储和外部存储
一个文件夹是app文件夹,还有一个文件夹就是data文件夹,app文件夹里存放着我们所有安装的app的apk文件,其实,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading .....就是上传我们的apk到这个文件夹,上传成功之后才开始安装。另一个重要的文件夹就是data文件夹了,这个文件夹里边都是一些包名,打开这些包名之后我们会看到这样的一些文件:
1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files
4.data/data/包名/cache
如果打开过data文件,应该都知道这些文件夹是干什么用的,我们在使用sharedPreferenced的时候,将数据持久化存储于本地,其实就是存在这个文件中的xml文件里,我们App里边的数据库文件就存储于databases文件夹中,还有我们的普通数据存储在files中,缓存文件存储在cache文件夹中,存储在这里的文件我们都称之为内部存储。
Environment类和Context类相关方法测试
整个存储空间分为内部存储和外部存储两部分,内部存储中又包含RAM和ROM等部分
1. 内存
RAM,即常说的运行时内存,是手机运行时存储数据和指令的地方,注意是运行时内存。
ROM,用来存放一些系统文件,应用配置和其他数据的地方,是内部存储中主要存储区域。
2. 内部存储
内部存储,即InternalStorage,也常说内置存储卡,这是手机内置的存储空间,出厂时就被确定,是手机的一个硬件指标。
3. 外部存储
外部存储,即ExternalStorage,也常说外置存储卡,手机出厂时并不存在,是由用户自由扩展的存储空间,常见的就是SD卡。
4. data目录
/data/app文件夹下存放三方应用的apk文件;
/data/data文件夹下存放系统应用和三方应用的包私有数据,每个应用都有独属于自己的包。
5. /mnt/sdcard/storage包
/mnt/sdcard是Android2.2及之上版本使用;
/sdcard是Android2.1及之下版本使用。
以内置存储卡来说 ,通常用sdcard0表示:
Android4.1上,首先挂载到目录/storage/sdcard0上面,/sdcard和/mnt/sdcard都只是指向/storage/sdcard0的软链接;
Android4.2上,首先挂载到目录/storage/emulated/0(0就表示内置存储)上面,为兼容之前版本,又挂载到/storage/emulated/legency上面,/storage/sdcard0、/sdcard和/mnt/sdcard都只是指向/storage/emulated/legency的软链接。(挂载相当于真正位置,软链接相当于指针)。
Google官方建议开发者将App的数据存储在私有目录即/storage/emulated/0/Android/data包下,这样卸载App时数据会随之被系统清除,不会造成数据残留。
所有的Android设备都有两块存储区域:Internal Storage和External Storage。它们的名称来源于早期的Android系统,那时候大家的手机都内置(Permanent)一块较小存储板(即Internal Storage),并配上一个的外置的(Removable)储存卡(即External Storage)。后来部分手机开始将最初定义的“Internal Storage”,即内置存储,分成Internal和External两部分。这样一来就算没有外置储存,手机也有Internal和External两块存储区域。
这个Primary和Secondary是怎么来的呢?实际上最开始Android也没有考虑这个区分,但是后来有一个情况发生了,就是上面所说到的:后来部分手机开始将最初定义的“Internal Storage”,即内置存储,分成Internal和External两部分。那么如果这个时候手机再插入sd卡,那不是有多个External Storage了吗? 这个时候,从Internal Storage里面分出来的那块“External Storage”我们称之为主存储(Primary Storage),插入的外置储存称之为副存储(Secondary Storage)。主存储路径的获取方式非常简单,可以通过Environment.getExternalStorageDirectory()或者Context.getExternalFilesDir(null)来获取。副存储路径在4.4及以上的Android系统中,可以使用Context.getExternalFilesDirs(null)(注意最后多了一个’s’),它返回的是一个字符串数组。第0个就是主存储路径,第1个是副存储路径(如果有的话)。在4.4及以下系统中,的副存储的获取方式就是一个大坑了,一个一个介绍一下笔者看到过的方法。
副储存路径-StorageManager
在Android中可以通过context.getSystemService(STORAGE_SERVICE)来获取到StorageManager,但是很可惜的是,它里面有价值的方法都是hide的。庆幸的是还有反射。我们可以调用getVolumeList()函数,这个返回的List里面,主存储是第0个,副存储(如果有的话)是第1个。你可以看到Environment.getExternalStorageDirectory()里面就是用它实现的,可以说这个方法是目前最稳妥的。它通过系统的MountService来获取已mount上来的设备,并且能够通过StorageVolume知道该存储是否removable、是否是emulated、mount状态等等。涉及到存储,由于Android rom千奇百怪,不可能是万全的。如果反射出来的方法缺少变量、方法,或者有别的什么坑,那只能试一下其他方法来保底。靠谱程度:99%
清除缓存:将外部私有数据下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,将内部数据下的cache包下的内容(/data/data/包名/cache)清除 。
清除数据:将外部私有数据包(/storage/emulated/0/Android/data/包名)清除,将内部数据下的所有内容(/data/data/包名)清除;而两种操作对外部公有数据均无影响。
网友评论