Android一键清理原理

2023-11-13

欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa


说明


在总篇中提到过垃圾清理,本篇将着重介绍针对缓存、卸载残留、无用数据等“静态内容”的清理,有关于系统进程的清理以及手机加速的相关功能,将放到《手机加速篇》中介绍研究。


什么是垃圾


关于系统垃圾的定义


现在很多手机管理软件中都有垃圾清理的功能,本篇也来对垃圾清理做一个简单的分析和介绍。在正式分析之前,让我们首先看一下“什么叫系统垃圾?”。在百度本科中,关于“系统垃圾”是这样定义的:系统垃圾,就是系统不再需要的文件的统称。当你浏览过网页,安装后又卸载掉的程序残留文件及注册表的键值。这些都是对系统毫无作用的文件,只能给系统增加负担,所以叫垃圾。

关于系统垃圾其实就一句话”所有我们所不再需要的资源、文件、缓存,就是垃圾”。我们清理系统垃圾就是要清理掉这些不再需要的文件。


Android中有哪些可以清理的垃圾


首先看一下在目前流行的手机管理软件总,都将那些作为可以清理的垃圾,下面是使用率比较高的四款手机管理软件的垃圾清理部分截图:




结合这些手机管理软件,对Android手机中可以清理的垃圾总结如下:

A.       应用缓存文件

B.       应用卸载残留

C.       无用的安装包

D.       内存数据

E.        系统垃圾(日志、缩略图、空文件夹等)

F.        广告文件

G.       大文件(文件大小大于某个值的文件)

H.       SD卡上的无用文件

在清理这些垃圾文件时,有的需要root权限,有的不需要,接下来将统一做一下介绍分析。


Android应用数据管理策略


在了解了关于垃圾文件的定义后,下面介绍一些Android中关于应用数据的管理策略:

Android中数据存储可以简单的分为内置存储(主要指应用data目录)和外置存储(主要是SD卡)两种情况。Android对这两种不同情况的管理策略是不一样的。对于内置存储中的数据采用进程隔离的原则存储,外置存储则采用全局共享的原则存储。

对于清理内置存储中的应用私有数据一般来说是需要root权限的,对于清理外置存储中的数据一般来说是不需要特殊权限的。


快速清理与深度清理


在很多手机管理类软件中都会发现有“快速清理”和“深度清理”,这里简单说一下:

  • 所谓快速清理,其实往往就是指在垃圾扫描时只扫描两到三层目录,暂时不做一些需要深度遍历等的耗时操作。
  • 所谓深度清理,往往就是指对所有可清理的垃圾进行全面扫描,对目录进行深度遍历。

这里有一点要说的是,二者的看似泾渭分明,实则是可以相互融合的,一个可行测策略是:

在管理软件启动后,选择系统空闲时间,定时做深度扫描,在用户手动触发时做快速扫描。不过这里又引出另外一个问题是:在空闲时扫描要有合适的策略,什么时候开始,什么时候暂停,必须保证在不影响应用正常使用的前提下进行。


系统垃圾清理


应用缓存清理


对于应用缓存的清理,本文将介绍两种实现方案,分别为:自己实现应用缓存清理和利用系统接口实现应用缓存清理,接下来将分别介绍。


自己实现应用缓存清理


要清理应用缓存,首先要了解应用的缓存是怎么存放的。一般来说,Android中应用的缓存包括如下部分:

A.       /data/data/ package_name /cache(应用缓存)

B.       /mnt/sdcard/Android/ package_name /cache(外部应用缓存,FROYO以后支持)

C.       /data/data/package_name/database/webview.db*(WebView缓存)

D.       /data/data/package_name/database/webviewCache.db*(WebView缓存)

E.        其他一些/data/data/ package_name /*cache目录(应用缓存)

F.        /data/data/package_name/files(比较严格的清理策略时也可以选择清理)

对于保存在/data/data/ package_name目录下文件,应用本身及与其共享userId的应用拥有全部的读写执行权限,其他应用是没有读写权限的,如下:




通过上面的分析,我们得出了清理应用缓存的第一种方案:

在获得root权限的前提下,遍历扫描应用的上述缓存目录,如果发现则删除即可。下面两段是计算缓存大小和清理缓存的部分示例代码:

计算缓存大小部分的代码片段:



清理缓存部分的代码片段:




当然,这里的扫描和清理工作也可以通过JNI放到C代码里去做,实现都是类似的。在通过C代码是否缓存时可以参见@frameworks/native/cmds/installd/commands.c中的free_cache函数。


利用系统接口实现应用缓存清理


用过Android手机的朋友相信都知道在手机的“设置->应用”中的应用详情页里面有“清除缓存”的功能,下面是在我我个人的手机上一个应该的截图:




OK,到这里,问题来了,我们是否可以利用系统接口实现应用”清除缓存“功能呢?Android系统中应用详情页位于@/packages/apps/Settings/src/com/android/settings/applications/InstalledAppDetails.java中。

InstalledAppDetails中清理应用缓存部分的代码如下所示:




在PackageManager中关于deleteApplicationCacheFiles的实现如下:




这里我们要注意如下几点:

A.       deleteApplicationCacheFiles接口是hide的,在代码中不能直接调用。

B.       使用deleteApplicationCacheFiles接口需要声明DELETE_CACHE_FILES权限。

C.       通过deleteApplicationCacheFiles接口是无法清除系统应用缓存的。

D.       缓存清理结果通过IPackageDataObserver接口完成回调。

除了deleteApplicationCacheFiles接口,PackageManager中还有如下两个接口可以选择调用:




下面是采用第二种缓存清理方式的部分示例代码,如下:






下面是获取各个应用缓存大小的部分示例代码:








两种实现方案对比


在介绍了两种应用缓存清理方式以后,这里做一个简单的对比,以供使用时进行选择:

A.       从范围:第一种方式清理范围更广,更彻底。第二种方式只能清理非系统应用,第一种方式可以清理所有应用,甚至应用自定义缓存文件。

B.       从权限:第一种方式需要root权限,第二种方式只需要在AndroidManifest中指定DELETE_CACHE_FILES即可。

C.       从安全:采用第一种方式时要有合适的策略,避免清理掉不应该清理的缓存。

综上,第一种方式的清理范围更广更彻底一些,在取得root权限的情况下,建议采用第一种方式。


应用卸载残留清理


如在1.3中所介绍,应用安装后的数据存放有内置存储和外置存储两种方式。对应内置存储中的数据在应用删除时会自动被删除,这里可以不用关心。但是许多Android应用程序会在移动终端的存储卡上创建自己应用程序专用的目录,用来存放缓存文件、临时文件或者通过网络下载的视频、音频、书籍等媒体文件。但是,当Android应用程序被卸载时,残留在存储卡上的文件不会被删除,而其中大部分文件对于用户来说是无用处的,属于垃圾文件。如果用户频繁的安装和卸载新软件,就会在存储卡产生大量的应用程序残留文件,不但占用存储卡空间,而且使存储卡的文件管理变得困难起来。因此,实现Android应用程序残留目录的识别与清理是十分必要的。

应用卸载残留清理的一个关键点就是:应用残留目录的识别。这里有两种可行的方案:


方案一:维护文件映射信息


在文件或者数据库中应用包名(唯一)与SD卡上文件的一个映射信息,可以采用应用包名为Key,因为不同应用的包名是唯一的,不会重复;采用SD卡上的文件作为Value,建立映射如下所示:

Key

Value

应用包名(唯一)

文件夹

在检测到应用卸载事件后判断该应用是否有对应的文件存在,有则提示用户删除。采用这种方案时需要如下几个问题:

A.       映射表的建立:需要对使用频率和用户量较高的应用建立映射表。这里最好有后台提前扫描应用建立,然后下发给客户端;也可以客户端先上报信息到后台,后台修正。映射表的建立是识别的关键。

B.       错误识别问题:一般来说不同应用的数据放在不同的文件夹中,不会有重复。但在实际中难免会出现重复的情况。对于这种情景有两种处理方式:

1)        映射关系细化到文件,删除完文件后再判断上层文件夹是否为空,为空则删除。

2)        有多个应用的映射关系重复时判断所有应用都已卸载再删除文件夹。


方案二:记录应用安装过程


该方案的普遍性并不如第一种方案强,但也可作为一种实现方案作为参考。方案如下:

1)        在通过管理软件进行安装时,通过log记录安装应用所产生的文件。在应用运行时,监控SD文件的变化,发现变化时,当前应用(运行时栈顶)即文件的创建者,同样在log中记录这种对应关系。

2)        在通过管理软件卸载应用时,根据log信息执行逆过程。


无用安装包清理


无用安装包的清理比较简单。判断无用安装包的标准是:

A.       存储目录中存在APK文件,但是该APK已被安装

B.       APK文件已损坏

扫描安装包有两种处理方式:

A.       深度扫描:扫描SD卡上的所有目录

B.       快速扫描,只扫描手机管理软件(豌豆荚、360手机助手、应用宝等)和浏览器(UCWeb、QQ浏览器)和Download目录。

要清理其他下载文件也可以按照这个思路来实现。


系统垃圾清理


系统垃圾清理包括临时文件、缩略图、系统日志、失效文件、空白文件等的清理,下面做一下介绍。


清理系统日志


日志文件分为系统日志和应用日志两部分,其各自的存放位置分别为:

1)        系统日志的存放位置如下(不同手机可能会有所差异):

A.       /data/local/tmp/*

B.       /data/tmp/*

C.       /data/system/usagestats/*

D.       /data/system/appusagestates/*

E.        /data/system/dropbox/*

F.        /data/tombstones/*

G.       /data/anr/*

H.       /dev/log/main

2)        应用日志存放位置可以判断的有:SD卡上后缀名为“.log”或者“*log.txt”等结尾的文件。


清理图片缩略图


在SD卡上的DICM目录下有一个隐藏的目录,名字叫“.thumbnails”,这个目录存放的是系统图片的缓存。清理缓存主要就是清理这个目录。应用目录也可能有缩略图文件,但不容易识别,所以不建议清理,可以放在清理残留数据时一起清理。


清理失效文件与空白文件


判断标准:

A.       文件的长度为0则认为是空白文件,可以删除

B.       文件夹中不包含任何文件或文件夹,则认为是空白文件夹,可以删除。

C.       除了上面两种情况外,还可以扫描文件的创建时间,很长时间未使用的文件认为是无效文件。



大文件清理


对于大文件的识别比较简单,只判断文件大小是否超过一定的阀值(例如:豌豆荚认为大小超过10M即为大文件)即可。但这里有两个需要注意的点:

A.       大文件一般是视频文件或者应用数据(例如百度map的数据),对于这些文件在清理是建议默为“不选中”状态。

B.       可以充分利用2.2.1中建立的映射关系,对大文件是否建议删除提供更加准确的建议。

对于广告文件等的识别和处理这里不再赘述了,原理都与上面的类似。



总结


通过本篇中的方法基本上可以实现对Android系统中垃圾文件的全面清理。这里要强调的是:

A.       垃圾清理是把双刃剑,一定要有合适的策略,否则反而影响用户体验。

B.       在清理垃圾文件时一定要抱着这样的态度:宁可错,不可过。

 

最后,希望本文能够给所有对垃圾清理和手机管理感兴趣的朋友带来一点帮助,将荣幸之至。有任何问题欢迎交流和讨论。下一篇将介绍《手机加速》


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android一键清理原理 的相关文章

  • 计算机中¥符号按哪个键,电脑键盘符号快捷键大全 电脑键盘上每个键的作用?...

    电脑键盘符号快捷键大全 电脑键盘符号怎么打 很多朋友还不太清楚电脑的各个符号要怎么打 快捷键是什么呢 那么下面就一起来看看电脑键盘符号大全吧 电脑键盘符号怎么打 电脑键盘符号大全 常见的标点符号 分号 书名号 双引号 单引号 破折号 竖线
  • sublime简用

    1 使用goto anything 快速查询各种文件 可以快速定位CSS中选择器 或JavaScript中的function 2 其中的输入时选取简化的输入则可 bgc就代表background color 3 多行游标 光标放在单词中 然
  • hashmap为什么8转成红黑树_深入分析HashMap的红黑树实现方式

    在分析jdk1 8的HashMap实现原理之前 咱们先可以了解一下红黑树的设计 相比jdk1 7的HashMap而言 jdk1 8最重要的就是引入了红黑树的设计 当冲突的链表长度超过8个的时候 链表结构就会转为红黑树结构 01 故事的起因
  • Mysql——压缩包方式安装教程

    一 Mysql压缩包下载方式 zip版 5 7及8 0 的下载需到官方网站下载 不同版本对应能安装在不同的操作系统下 本次介绍的是mysql 8 0 30 winx64在win10下的安装方式 下载网址 MySQL Download MyS
  • android模拟器与宿主机通讯

    android模拟器与PC的端口映射 一 概述 Android系统为实现通信将PC电脑IP设置为10 0 2 2 自身设置为127 0 0 1 而PC并没有为Android模拟器系统指定IP 所以PC电脑不能通过IP来直接访问Android
  • Mysql增强半同步模式_MySQL增强半同步的搭建实验,和一些参数的个人理解

    环境信息 role ip port hostname master 192 168 188 101 4306 mysqlvm1 slave 192 168 188 201 4306 mysqlvm1 1 5306 6306 7306 MyS
  • eclipse搜索类快捷键

    习惯的编辑器可以提高编程效率 熟悉的快捷键可以提高工作效率 本文更新eclipse中常用的搜索快捷键 打开资源快捷键 Ctrl Shift R 通过在搜索框中输入名字可以很方便的在项目或工作空间中找某个文件 支持模糊查询功能 例如输入文件的
  • Linux防火墙

    关于linux系统防火墙 centos5 centos6 redhat6系统自带的是iptables防火墙 centos7 redhat7自带firewall防火墙 ubuntu系统使用的是ufw防火墙 必要操作 linux系统防火墙开放相
  • AOP之5种增强方法应用范例

    林炳文Evankaka原创作品 转载请注明出处http blog csdn net evankaka Spring AOP 提供了 5 种类型的通知 它们分别是 Before Advice 前置通知 After Returning Advi
  • PyTorch 手把手搭建神经网络 (MNIST)

    推荐下我自己建的Python学习群 856833272 群里都是学Python的 如果你想学或者正在学习Python 欢迎你加入 大家都是软件开发党 不定期分享干货 还有免费直播课程领取 包括我自己整理的一份2021最新的Python进阶资
  • python写入文件后换行_python写入文件自动换行问题的方法

    现在需要一个写文件方法 将selenium的脚本运行结果写入test result log文件中 首先创建写入方法 def write result str writeresult file r D eclipse4 4 1 script
  • 一些文件头

    由这些文件头即使文件后缀被乱改也可以通过查看二进制文件查出文件的匹配格式 当然这就是一些播放器识别文件的方法 1 从Ultra edit 32中提取出来的 JPEG jpg 文件头 FFD8FF PNG png 文件头 89504E47 G
  • 浅析进程与线程之间的区别

    文章目录 浅析进程与线程之间的区别 从最普遍的答案出发 什么是计算机资源 计算资源 存储资源 I O设备资源 什么是进程 线程 操作系统怎样给进程分配资源的 操作系统怎样调度进 线程的 进程的上下文切换 为什么需要线程 参考链接 浅析进程与
  • mybatis generator

    文章目录 generatorConfig xml GeneratorSqlmap java log4j properties lib maven pom generatorConfig xml
  • 【deep_thoughts】30_PyTorch LSTM和LSTMP的原理及其手写复现

    文章目录 LSTM API 手写 lstm forward 函数 LSTMP 修改 lstm forward 函数 视频链接 30 PyTorch LSTM和LSTMP的原理及其手写复现 哔哩哔哩 bilibili PyTorch LSTM
  • Ubuntu 下安装 OpenSSH Server

    Ubuntu 下安装 OpenSSH Server 是无比轻松的一件事情 需要的命令只有一条 sudo apt get install openssh server 查看返回的结果 如果没有出错 则用putty SecureCRT SSH
  • Deprecated usages detected, please refer to the el-pagination documentation for more details

    遇到这个问题 说明你用el pagination分页器参数传递不正确 在这里插入图片描述 https img blog csdnimg cn 5952bad428654dda8d956181f45183d5 png 我的是由于total没有
  • 在tinymce富文本中插入本地视频解决方案

    前言 最近在改一个别人的项目时候 遇到一个需求 要在tinymce富文本中添加本地视频 tinymce富文本本身是不具备添加本地视频的功能的 需要使用一些其他手段来添加本地视频 小demo截图 方法 1 在富文本的外面写一个添加视频的按钮
  • 第二十九章 Unity关节Joint

    关节组件将刚体连接到另一个刚体或空间中的固定点 关节施加使刚体移动的力 而关节限制功能可以限制该移动 Unity 提供的以下关节可以对刚体组件施加不同的力和限制 从而使这些刚体具有不同的运动 Hinge Joint铰链关节 使两个刚体像被连

随机推荐

  • 软件工程——结构化设计

    一 结构化软件设计的任务 在结构化设计方法中 概要设计阶段将软件需求转化为数据结构和软件的系统结构 概要设计阶段要完成体系结构设计 数据设计及接口设计 详细设计阶段要完成过程设计 二 结构化设计与结构化分析的关系 结构化设计方法的实施要点
  • android 旋转屏幕导致Activity重建解决方法

    横竖屏切换时候activity的生命周期 1 不设置Activity的android configChanges时 切屏会重新调用各个生命周期 切横屏时会执行一次 切竖屏时会执行两次 2 设置Activity的android configC
  • python 根据当前时间创建文件

    在当前目录中批量创建文件 文件名为 Y m d H M S格式的当前时间 精确到秒 为防止出现重名文件 在每创建一个文件后 让线程休眠一秒 import time def create global name localTime time
  • vue-router 源码:前端路由

    前言 在学习 vue router 的代码之前 先来简单了解一下前端路由 前端路由主要有两种实现方法 Hash 路由 History 路由 先来看看这两种方法的实现原理 接着我们将用它们来简单实现一个自己的前端路由 前端路由 Hash 路由
  • 开关电源电感电压波形过冲和下冲原理以及处理办法

    以一个同步降压电路例子来讲解 测量电感左端的电压波形如图所示 很明显可以看到电压尖刺 那么为什么会产生这个尖刺 从电路原理中我们知道 实际上电路是有很多寄生参数的 从图中可以知道实际电路可以等效一个RCL电路 过冲和下冲原理是一样的 这里以
  • Linux带宽限速———针对网卡与进程操作限速

    使用 Wondershaper 限制网络带宽 yum y install wondershaper Wondershaper 可以用于限制特定网络接口 如 eth0 wlan0 的下载和上传速度 使用 Wondershaper 来限制接口的
  • 概要设计的必要性及写法

    1 1 文档的重要性 很多小伙伴在需求 开发 测试阶段不注重文档 认为这耽误时间 画蛇添足 实际上文档对于软件行业是十分重要的 软件的定义 软件是包括程序 数据及其相关文档的完整集合 从这个定义中我们能够体会到文档的重要性 很多小伙伴常说要
  • 物联网智能家居系统

    源码部分可以找我我给你的哦 l3O6l4O8O52 扣扣 物联网智能家居系统 18年07 19 实训项目 1 需求分析 原理 基础准备 1 1实验目的 1 2基本功能 1 3模块功能描述 1 3 1主功能函数模块 1 3 2串口通信模块 1
  • gensim.models.word2vec 参数说明

    使用gensim训练词向量的实例 Initialize and train a Word2Vec model gt gt gt from gensim models import Word2Vec gt gt gt sentences ca
  • Es、kibana安装教程-ES(二)

    上篇文章介绍了ES负责数据存储 计算和搜索 他与传统数据库不同 是基于倒排索引来解决问题的 Kibana是es可视化工具 分布式搜索ElasticSearch ES 一 一 ElasticSearch安装 官网下载地址 https www
  • VS Code自动补全生成代码免费插件BitoAI使用指南2023

    2023年是AI爆发元年 已经被各种AI工具 新闻轰炸了几个月 只有一种感觉 时间不够用 本文介绍编程辅助神器 Bito AI Bito是什么 Bito是一款插件 它目前支持VS Code Chrome插件 以及Jetbrains的全系列I
  • Linux安装镜像仓库Harbor

    先来看一下Harbor的页面 不管是页面布局 还是操作功能 明显比registry好 1 安装docker docker安装 2 安装docker compse Harbor对docker compse的版本是有要求的 我记得是要高于1 1
  • 去银行写代码是种什么体验?

    本文转载自程序员技术 一线互联网岗位和银行 国企还是有点区别的 这篇文章 讲详细讲一讲银行或者金融科技的相关问题 包括面试 待遇等等 虽然前阵子网传几大互联网公司都去掉了大小周 但是我和某团的一个哥们儿聊 其实本质是把周末要加的班 放在了平
  • 登录Unity官方商店时提示Sorry, this link is no longer valid.(此链接已失效)

    看了看网上的资料 主要有以下四种方法 第一种非常有效 1 彻底断开当前使用的wifi或者有线网络 打开手机热点 让电脑连接热点 重新登录 就可以进去了 2 关闭魔法 3 打开系统防火墙 设置Unity相关程序为允许专用网络和允许公用网络 都
  • 哨兵-1 Sentinel-1数据下载(欧空局)

    Sentinel 1数据下载 1 Sentinel 1 数据简介 2 Sentinel 1 数据下载步骤 2 1 在欧空局 ESA 下载Sentinel 1 数据 2 1 1网站页面介绍 2 1 2 数据下载步骤 1 Sentinel 1
  • Python pyinstaller打包opencv程序出错(ImportError: OpenCV loader: missing configuration file: [‘config.py‘)

    在打包含有opencv库的程序时 打包 F w 后运行程序报错 运行失败 查看命令行提示 打包时只 F 错误为 ImportError OpenCV loader missing configuration file config py C
  • 数据结构之栈

    栈 什么是栈 1 后进者先出 先进者后出 这就是典型的 栈 结构 2 从栈的操作特性来看 是一种 操作受限 的线性表 只允许在端插入和删除数据 为什么需要栈 1 栈是一种操作受限的数据结构 其操作特性用数组和链表均可实现 2 但 任何数据结
  • Windows应急响应信息采集工具

    项目地址 GitHub ra66itmachine GetInfo Windows Emergency Response 应急响应信息采集 Windows information collection 快速收集 Windows 相关信息 为
  • 全通系统定义、零极点关系、应用

    全通系统定义 表示方法 应用一 将任意因果稳定系统转化为 全通系统和最小相位系统 的级联 应用二 级联一个全通系统可以使非稳定滤波器变成一个稳定滤波器 把非稳定系统的单位圆外的极点映射到单位圆内 应用三 作为相位均衡器 校正系统的非线性相位
  • Android一键清理原理

    欢迎转载 转载请注明 http blog csdn net zhgxhuaa 说明 在总篇中提到过垃圾清理 本篇将着重介绍针对缓存 卸载残留 无用数据等 静态内容 的清理 有关于系统进程的清理以及手机加速的相关功能 将放到 手机加速篇 中介