手机应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据?

/data /mnt /sdcard /storage 的区别和联系

内存,内部存储,外部存储,很多人常常将这三个东西搞混,能说清这三个东西是怎么回事不?


参考博客:

彻底理解android中的内部存储与外部存储

Android内存解析(二)— 详解内存,内部存储和外部存储

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/包名)清除;而两种操作对外部公有数据均无影响。

更多相关文章

  1. Android(安卓)动态加载布局文件
  2. Windows下的Android(安卓)SDK下载,2.2之前各个版本及Google API,文
  3. android 应用程序包文件 (APK)
  4. 页面调用ADB操作Android设备
  5. Android(安卓)adb不是内部或外部命令 问题解决
  6. Android(安卓)studio 使用NDK 实现串口 动态库
  7. mybatisplus的坑 insert标签insert into select无参数问题的解决
  8. python起点网月票榜字体反爬案例
  9. NPM 和webpack 的基础使用

随机推荐

  1. mysql 触发器语法与应用示例
  2. MySQL联表查询基本操作之left-join常见的
  3. MySQL8新特性之降序索引底层实现详解
  4. mysql8.0.20安装与连接navicat的方法及注
  5. MySQL 编码utf8 与 utf8mb4 utf8mb4_unic
  6. 源码编译安装MySQL8.0.20的详细教程
  7. CentOS7版本安装Mysql8.0.20版本数据库的
  8. window10下mysql 8.0.20 安装配置方法图
  9. MySql视图触发器存储过程详解
  10. mysql 8.0.20 安装配置详细教程