Android 6.0系统 内存和缓存清理及相关动画

前言

最近,做了一个清理android系统(基于6.0的一个定制系统)的内存等清理相关的模块,里面涉及到该系统的运行的相关进程清理和各个应用的缓存清理(提前说一下,需要系统签名,然后push 到系统目录中);由于6.0后,非本应用的data/data等目录都是不可读写的目录,当然这是为了应用安全,完全可以理解,所以清理这部分缓存的时候,就需要使用系统权限或者叫root权限

功能说明

能够将当前系统中正在运行的非系统进程清理掉
能够清理各大应用的缓存数据

UI实现

这里根据UI需求,做了一个简单的清理加速动画


Android 6.0系统 内存和缓存清理及相关动画_第1张图片
11.gif

清理逻辑

因为只针对6.0系统来做的,所以,这里就只贴了6.0的代码,其余版本的,请自行google解决

下面是杀死进程释放内存的关键方法,需要利用反射和系统签名:

/**
     * Kill掉某个正在运行的应用
     * @param context
     * @param packageToKill
     */
    private void killAppByPackage(Context context, String packageToKill) {
 
        List 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

你可能感兴趣的:(Android 6.0系统 内存和缓存清理及相关动画)