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

前言

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

功能说明

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

UI实现

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

清理逻辑

因为只针对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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值