前言
最近,做了一个清理android系统(基于6.0的一个定制系统)的内存等清理相关的模块,里面涉及到该系统的运行的相关进程清理和各个应用的缓存清理(提前说一下,需要系统签名,然后push 到系统目录中);由于6.0后,非本应用的data/data等目录都是不可读写的目录,当然这是为了应用安全,完全可以理解,所以清理这部分缓存的时候,就需要使用系统权限或者叫root权限
功能说明
能够将当前系统中正在运行的非系统进程清理掉
能够清理各大应用的缓存数据
UI实现
这里根据UI需求,做了一个简单的清理加速动画
11.gif
清理逻辑
因为只针对6.0系统来做的,所以,这里就只贴了6.0的代码,其余版本的,请自行google解决
下面是杀死进程释放内存的关键方法,需要利用反射和系统签名:
/**
* Kill掉某个正在运行的应用
* @param context
* @param packageToKill
*/
private void killAppByPackage(Context context, String packageToKill) {
List<ApplicationInfo> packages;
PackageManager pm;
pm = context.getPackageManager();
//get a list of installed apps.
packages = pm.getInstalledApplications(0);
ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//利用killBackgroundProcesses方法(API > 8)
for (ApplicationInfo packageInfo : packages) {
if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
continue;
}
if (packageInfo.packageName.equals(packageToKill)
&& mActivityManager != null) {
mActivityManager.killBackgroundProcesses(packageInfo.packageName);
}
}
//利用反射调用forceStopPackage方法
//需要android.permission.FORCE_STOP_PACKAGES权限
//需要系统签名
try {
Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class);
method.invoke(mActivityManager, packageToKill);
}catch (Exception e) {
e.printStackTrace();
}
}
清理缓存逻辑,也需要利用反射和几个aidl文件,如,获取缓存大小需要用到IPackageStatsObserver.aidl等
利用PackageManager中的deleteApplicationCacheFiles()方法来删除应用中的缓存
/**
* 删除App Cache
* @param context
* @param pkgName
* @param observer
*/
public static void delAppCache(Context context, String pkgName, IPackageDataObserver.Stub observer){
try{
if (observer != null) {
PackageManager pm = context.getPackageManager();
Method deleteApplicationCacheFiles = pm.getClass()
.getMethod("deleteApplicationCacheFiles", String.class, IPackageDataObserver.class);
deleteApplicationCacheFiles.invoke(pm, pkgName, observer);
}
}catch (Exception e){
e.printStackTrace();
}
}
总结:
网上看过部分帖子和体验了部分清理助手app,特别是针对存储垃圾方面,有很多判断细化标准,使用常规的清理手段的确无法达到满意的程度,因此,你需要使用更多的判断标准去定义“存储垃圾”,然后,再去清理
Github源码地址:https://github.com/helang1991/ClearTool