添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

前几天和朋友聊到了APP清除数据这块,聊到了清除数据都会清掉哪些数据,我们每个人的手机在”设置–>应用管理”里面,选择任意一个App,都会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据?今天在这里验证一下。

在学习之前我们首先要搞懂内存、内部存储、外部存储的概念,内存,我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储,我们称为ExternalStorage,他们的区别在于:

内存是指手机运行程序时占用的内存,也叫RAM(简称运存)。RAM基本是固定不变的,手机买下来是多少就是多少,比如是4G运行内存,那么你的手机运行时候系统可以利用的内存最高也就是4G了,这个有别于电脑的内存(电脑内存可以通过添加内存条来增加RAM大小从而提升运行效率/速度),简而言之,理论上的手机运行内存越大,系统运行的越流畅。

data文件夹就是我们常说的内部存储,(路径为:/data/data/包名)当我们打开data文件夹之后(没有root的手机不能打开该文件夹),里边有两个文件夹值得我们关注,如下:

app文件夹:app文件夹里存放着我们所有安装的app的apk文件,其实,当我们调试一个app的时候,可以看到控制台输出的内容,有一项是uploading …..就是上传我们的apk到这个文件夹,上传成功之后才开始安装。

data文件夹:这个文件夹里边都是一些包名,打开这些包名之后我们会看到这样的一些文件:

data/data/包名/shared_prefs  //SharedPreferences存储的数据,以XML格式存储到本地
data/data/包名/databases      //数据库存储的数据,db格式的文件
data/data/包名/files          //普通数据的存储
data/data/包名/cache          //缓存文件的存储

存储在这里的文件我们都称之为内部存储。存储在内部存储的数据都会随着APP的卸载而清除。

,外部存储一般就是我们上面看到的storage文件夹,当然也有可能是mnt文件夹,这个不同厂家有可能不一样。测试使用的手机目录为(/storage/emulated/0/)。这个文件夹中的文件又分为两类,一类是公有目录,还有一类是私有目录。

公有目录:

Environment.getExternalStoragePublicDirectory(String DirName) /storage/emulated/0/DirName
Environment.DIRECTORY_MUSIC /storage/emulated/0/Music
Environment.DIRECTORY_PODCASTS /storage/emulated/0/Podcasts
Environment.DIRECTORY_RINGTONES /storage/emulated/0/Ringtones
Environment.DIRECTORY_ALARMS /storage/emulated/0/Alarms
Environment.DIRECTORY_NOTIFICATIONS /storage/emulated/0/Notifications
Environment.DIRECTORY_PICTURES /storage/emulated/0/Pictures
Environment.DIRECTORY_MOVIES /storage/emulated/0/Movies
Environment.DIRECTORY_DOWNLOADS /storage/emulated/0/Download
Environment.DIRECTORY_DCIM /storage/emulated/0/DCIM
Environment.DIRECTORY_DOCUMENTS /storage/emulated/0/Documents

私有目录
私有目录就是Android这个文件夹,这个文件夹打开之后里边有一个data文件夹,打开这个data文件夹,里边有许多包名组成的文件夹。
例:/storage/emulated/0/Android/data/包名

经过上面的分析,大家已经明白了,什么是内部存储,什么是外部存储,以及这两种存储方式分别存储在什么位置,一般来说,我们不会自己去操作内部存储空间,没有root权限的话,我们也没法操作内部存储空间,事实上内部存储主要是由系统来维护的。不过在代码中我们是可以访问到这个文件夹的。由于内部存储空间有限,在开发中我们一般都是操作外部存储空间,Google官方建议我们App的数据应该存储在外部存储的私有目录中该App的包名下,这样当用户卸载掉App之后,相关的数据会一并删除。

内部存储方法 获取的目录
getFilesDir() /data/data/packagename/files
getCacheDir() /data/data/packagename/cache
外部存储方法 获取的目录
getExternalCacheDir() /storage/emulated/0/Android/data/包名/cache
getExternalFilesDir() /storage/emulated/0/Android/data/包名/files
getExternalStorageDirectory() /storage/emulated/0
getExternalStoragePublicDirectory(String DirName) /storage/emulated/0/DirName
getExternalFilesDir(String DirName) /storage/emulated/0/Android/data/包名/files/DirName
getExternalStorageState() 获取外部存储状态(可用状态Environment.MEDIA_MOUNTED)

文件存储的路径分为两种,一类是路径中含有包名的,一类是路径中不含有包名的,含有包名的路径,因为和某个App有关,所以对这些文件夹的访问都是调用Context里边的方法,而不含有包名的路径,和某一个App无关,我们可以通过Environment中的方法来访问。

在了解了三种存储的概念之后,再回过头来看清除数据和清除缓存就容易理解了。

清除数据主要是清除用户配置,比如SharedPreferences、数据库等等,这些数据都是在程序运行过程中保存的用户配置信息,清除数据后,下次进入程序就和第一次进入程序时一样;

缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取,注意:为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在getCacheDir()或者 getExternalCacheDir()路径下。比如对微信清除缓存,则聊天记录、朋友圈缓存的用户头像、图片、文字等信息都会被清除掉,清除缓存后再次进入微信时你会发现消息记录被清空了,朋友圈的图片和用户头像需要加载一会才能正常显示。

一键清理是系统级别的功能,它主要是杀后台进程,以达到释放内存的目的,APP缓存的数据并不会被清理掉。杀掉哪些进程和清理时设置的重要值阈值有关,重要值越大说明进程重要程度越低,如果在清理时某个进程的重要值大于该阈值,该进程就会被杀掉。比如微信等应用在后台,一件清理后会将微信和与之相关的服务都杀掉(有的服务做了特殊处理,杀不死!!!)。

为了让程序被卸载后不在文件系统中留下毫无关联的无用文件,建议将应用相关的配置和缓存文件存放在程序被卸载时会删掉的文件夹下面(音乐文件、视频文件、图片、电子书这种适合多个应用阅读和浏览的文件除外),具体路径有:

  • /data/data/package/
  • getFilesDir()
  • getCacheDir()
  • getExternalCacheDir()(是否能够在程序被卸载时被删除与API的等级有关)
  • getExternalFilesDir()(是否能够在程序被卸载时被删除与API的等级有关)
在9.0的系统ROM定制化开发 ,在系统原生设置 ,可以在app的详情页里面看到清理 缓存 清理 数据 等选项,而在最近的rom产品定制化 ,有产品需求要求,在第三方app 的接口 ,调用接口来实现 清除 app里面的 数据 ,在ActivityManagerService.java 提供了清理 数据 的相关接口,可以调用api来实现功能就可以了,接下来就具体实现功能 Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆于1990年代初设计,Python提供了高效的高级 数据 结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发 应用 的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被人们用于独立的、大型项目的开发和设计 Python解释器易于 扩展 ,可以使用C语言或C++(或者其他可以通过C调用的语言) 扩展 新的功能和 数据 类型。Python也可用于可定制化软件 扩展 程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。 Python还被语言流行指数的编译器Tiobe将它被评为最受欢迎的编程语言,20多年来首次将其置于Java、C和JavaScript之上,真的非常荣幸了 自从20世纪90年代初Python语言诞生至2022年,它已被逐渐广泛 应用 于系统管理任务的处理和Web编程,Python已经成为最受欢迎的程序设计语言之一。 Python教学简单易懂,零基础小白也可以学会,只要你有耐心 学习 从入门到精通.从小白到高手 在 Android 8.0及以上版本 ,使用PackageManager的deleteApplicationCacheFiles()方法来删除 应用 缓存 数据 。而在 Android 8.0以下的版本 ,我们通过递归删除 应用 缓存 目录下的所有文件来实现清理 缓存 数据 的功能。在 Android 开发 ,清理 应用 缓存 数据 是一个常见的需求。我们使用了不同的逻辑来处理 Android 8.0及以上版本和 Android 8.0以下版本的情况,并提供了相关的源代码示例。通过清理 应用 缓存 数据 ,可以提高 应用 的性能并释放设备的 存储 空间。 在开发相关TV项目 ,有需要要求清理掉相关的app的 缓存 ,在系统设置里面有类似的功能 但是在app 调用相关的系统方法有些比较复杂,所以呢 就查询相关的方法实现功能 在adb shell pm的相关命令 不使用参数:adb shell pm list packages,打印设备/模拟器上的所有软件包 不使用参数:adb shell pm list packages,打印设备/模拟器上的所有软件包 使用-f参数:adb shell pm list packages -f,输出包和包相关联的文件 使用-d参数 public class DataCleanManager { public static void DeleteFile(File file) { if (file.exists() == false... 清除 数据 清除 缓存 的区别 清除 数据 主要是 清除 用户配置,比如SharedPreferences, 数据 库等等,这些 数据 都是在程序运行过程 保存的用户配置信息, 清除 数据 后,下次进入程序就和第一次进入程序时一样 缓存 是程序运行时的临时 存储 空间,它可以存放从网络下载的临时 图片 ,从用户角度触发 清除 缓存 对用户并没有太大的影响,但是 清除 缓存 后用户再次使用该APP时,由于本地 缓存 已经被清理,所有的 数据 需要重... 允许允许虚拟身份ID前获取一次 Android Id: attachBaseContext获取 Android Id, 此时还没有点允许虚拟身份ID,此时获取的 Android Id:0000000000000000,允许虚拟身份后后再获取也是不会变化的,需要杀进程重新打开app才能获取正确的 Android Id。 允许虚拟身份ID后获取 Android I 方案一:利用命令行pm clear 包名,系统级别 清除 App 数据 和任务管理器里面 清除 所有 数据 的操作一致,会删除所有的APP 数据 。重新进入APP还需重新申请权限。 系统会直接杀掉APP进程,无法进行拉起APP的操作。 public static Process clearAppUserData(String packageName) { Process p = execRuntimeProcess("pm clear " + p 前言前两天因为开发一个app更新的功能,我将从服务器下载的apk文件放在了 内部 存储 目录(测试手机为小米,路径为:data/user/0/packagename/files)下面,然后安装的时候一直安装不了,提示解析包出错。后来查询发现,安装apk是调用了PackageInstaller,没有相关权限,这个无法获取 内部 路径,所以会安装不了。借机也复习了一遍 Android 下面 存储 相关的知识点,总结一番...