转自:https://blog.csdn.net/wds1181977/article/details/51142565?locationNum=3&fps=1

说明

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

什么是垃圾

关于系统垃圾的定义

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

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

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.       在清理垃圾文件时一定要抱着这样的态度:宁可错,不可过。

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

Android一键清理原理相关推荐

  1. android一键清理任务,Android 一键清理、内存清理功能实现

    基本思路就是列出所有运行的进程,查看其重要值(RunningAppProcessInfo.importance,值越大说明进程重要程度越低),可以设定一个阈值, ~~~~~~~~~~~~~~~~~~~ ...

  2. android一键清理后台,Android 一键清理、内存清理功能实现

    360桌面.金山清理大师等都提供了一键清理.一键加速等功能,其实就是杀一些后台进程来达到释放内存的目的. 基本思路就是列出所有运行的进程,查看其重要值(RunningAppProcessInfo.im ...

  3. Android 一键清理内存,缓存,文件代码

    一键清理工具类:主要清理 1.系统的内存 2.App的缓存 3.系统的临时文件 .apk .log .tmp .temp .back package com.hitv.process;import j ...

  4. Android 一键清理动画

    版本:1.0  日期:2014.7.29  2014.7.30 版权:© 2014 kince 转载注明出处 一键清理是很多Launcher都会带有的功能,其效果也比较美观.实现方式也许有很多中,其中 ...

  5. android一键清理任务,[玩机组出品]全球最小最高效的一键清理任务管理器。仅100......

    作为一个进程怎么杀也杀不完的手机系统,安卓系统对于程序运行后台管理不作为一直被人们所诟病.小白们喜欢下载一些"优化大师"来管理手机运存,但是往往事与愿违,安装了他们手机反而变得越来 ...

  6. Android一键清空内存,Android 一键清理内存(ARM)

    public void killProcess(){ ActivityManager activityManger=(ActivityManager) this.getSystemService(AC ...

  7. android 一键清除 清理

    前言   在Android设备中,我们经常会看到与系统或者应用相关的清除功能有:清除数据.清除缓存.一键清理,这么多清除功能对于一个程序猿就够难理解了,偏偏很多安卓设备上都有这些功能,对于用户来说就更 ...

  8. Android缓存处理和清除数据、清除缓存、一键清理的区别

      在Android设备中,我们经常会看到与系统或者应用相关的清除功能有:清除数据.清除缓存.一键清理,这么多清除功能对于一个程序猿就够难理解了,偏偏很多安卓设备上都有这些功能,对于用户来说就更难理解 ...

  9. 模仿实现360桌面水晶球式的一键清理特效

    半年前,鄙人想搞一下 android一键清理的特效,于是乎研究了一下市面上各个产品的界面效果,发现360桌面的水晶球效果很细腻,所以就试着模仿了一下.今天翻阅以前写的代码,刚好看到了它,所以就想把它分 ...

最新文章

  1. 五分钟让你了解 Java方法(或者叫函数)
  2. 关于Linux前后台程序切换
  3. 烂泥:kickstart无人值守安装CentOS6.5
  4. WCF wsHttpBinding之Transport security Mode, clientCredentialType=”Basic”
  5. MYSQL、SQL在LIKE里传的参数没有赋进去的原因
  6. Skype for Business Server 2015-09-测试-基本功能(建议:看PDF!)
  7. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件
  8. Python中常用的高阶函数
  9. [蓝桥杯] 连号区间数
  10. Xcode做简易计算器
  11. LeetCode MySQL 1336. 每次访问的交易次数
  12. ❤️力扣线性枚举算法第二题数组中连续为一的最大个数
  13. 20200208(补):翻转游戏Ⅰ Ⅱ(leetcode)
  14. adb查看activity的堆栈信息
  15. js接收php 回调,JS callback回调函数的使用(附代码)
  16. VIBE算法(一)——论文翻译
  17. Linux用户管理基本配置命令运用1
  18. 光缆接续盒图标_光缆线路施工技术(超全)
  19. 网盘目录搜索系统源码+搭建教程
  20. 7-151 计算存款利息

热门文章

  1. 《Linux操作系统 - RK3288开发笔记》第3章 G-3288-02 SD卡启动及变砖恢复
  2. H.264——H.264的基本介绍
  3. [电脑桌面右击新建没有excel、ppt、word]
  4. CityEngine学习资料——
  5. html5 swipe滑动选择身高,Swipe 移动端滑动插件使用详解
  6. Linux下shell自动输入密码,shell脚本通过expect脚本实现自动输入密码
  7. 8051芯片选型 - 新唐MS51
  8. 【数据分析案例】美国2015-2018年牛油果销售数据分析
  9. 信号与系统sa函数求积分_信号与系统_第三章_学习心得
  10. html ui标记是什么,ui是啥