android 清理

来源:互联网 发布:无尺度网络模型 编辑:程序博客网 时间:2024/04/29 17:11



先看下面有关android的设备信息,有关Memory量

# cat meminfoMemTotal:         352088 kBMemFree:           15728 kBBuffers:            4232 kBCached:           103788 kBSwapCached:            0 kBActive:           224688 kBInactive:          78044 kBActive(anon):     193220 kBInactive(anon):     2584 kBActive(file):      31468 kBInactive(file):    75460 kBUnevictable:         312 kBMlocked:               0 kBHighTotal:             0 kBHighFree:              0 kBLowTotal:         352088 kBLowFree:           15728 kBSwapTotal:             0 kBSwapFree:              0 kBDirty:                 0 kBWriteback:             0 kBAnonPages:        195036 kBMapped:            43684 kBShmem:               780 kBSlab:               7608 kBSReclaimable:       2896 kBSUnreclaim:         4712 kBKernelStack:        3864 kBPageTables:        12632 kBNFS_Unstable:          0 kBBounce:                0 kBWritebackTmp:          0 kBCommitLimit:      176044 kBCommitted_AS:    1889040 kBVmallocTotal:     483328 kBVmallocUsed:      197648 kBVmallocChunk:     260100 kB

dumpsys meminfo -a查看进程的内存使用情况

** MEMINFO in pid 2342 [com.pateo.VoiceRecognition] **                    native   dalvik    other    total            size:    16600     3271      N/A    19871       allocated:    16298     3014      N/A    19312            free:      233      257      N/A      490           (Pss):     4598     1147    17510    23255  (shared dirty):     1176     1804     2164     5144    (priv dirty):     4564      404    12384    17352  Objects           Views:        0        ViewRoots:        0     AppContexts:        0       Activities:        0          Assets:       18    AssetManagers:       18   Local Binders:       36    Proxy Binders:       52Death Recipients:        6 OpenSSL Sockets:        0

下面代码主要为内存的获取接口调用:

    public long readAvailMem() {        try {            long memFree = 0;            long memCached = 0;            FileInputStream is = new FileInputStream("/proc/meminfo");            int len = is.read(mBuffer);            is.close();            final int BUFLEN = mBuffer.length;            for (int i=0; i<len && (memFree == 0 || memCached == 0); i++) {                if (matchText(mBuffer, i, "MemFree")) {                    i += 7;                    memFree = extractMemValue(mBuffer, i);                } else if (matchText(mBuffer, i, "Cached")) {                    i += 6;                    memCached = extractMemValue(mBuffer, i);                }                while (i < BUFLEN && mBuffer[i] != '\n') {                    i++;                }            }            return memFree + memCached;        } catch (java.io.FileNotFoundException e) {        } catch (java.io.IOException e) {        }        return 0;    }    private boolean matchText(byte[] buffer, int index, String text) {        int N = text.length();        if ((index+N) >= buffer.length) {            return false;        }        for (int i=0; i<N; i++) {            if (buffer[index+i] != text.charAt(i)) {                return false;            }        }        return true;    }    private long extractMemValue(byte[] buffer, int index) {        while (index < buffer.length && buffer[index] != '\n') {            if (buffer[index] >= '0' && buffer[index] <= '9') {                int start = index;                index++;                while (index < buffer.length && buffer[index] >= '0'                    && buffer[index] <= '9') {                    index++;                }                String str = new String(buffer, 0, start, index-start);                return ((long)Integer.parseInt(str))* 1024;            }            index++;        }        return 0;    }

下面为清理:

    public int autoCleanup(int killImportance) {        final int sdkVersion = android.os.Build.VERSION.SDK_INT;        final ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);        final ArrayList<String> blackList = blackListArray();        final ArrayList<String> whiteList = whiteList();        List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses();        int psize = processes.size();        int cleannum = 0;        for (int i = 0; i < psize; i++) {            String pkgName = processes.get(i).processName;            if(pkgName == null) {                continue;            }            if (DEBUG)                Log.d(TAG, "process name: " + pkgName + "  " + processes.get(i).importance);            try {                PackageManager pm = mContext.getPackageManager();                ApplicationInfo info = pm.getApplicationInfo(pkgName,                        PackageManager.GET_UNINSTALLED_PACKAGES                                | PackageManager.GET_DISABLED_COMPONENTS);                if ((((processes.get(i).importance >= killImportance                        && ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) && !whiteList                            .contains(pkgName))) || blackList.contains(pkgName)) &&!pkgName.equals(getTopActivy()) ) {                    String playingPackage = getThirdPlayingPackageName();                    if(playingPackage!=null){                       if(pkgName.equals(playingPackage)){                          continue;                       }                    }                                         if (sdkVersion >= 8) {                        am.killBackgroundProcesses(pkgName);                    } else {                        am.restartPackage(pkgName);                    }                    cleannum++;                    if (DEBUG)                        Log.d(TAG,                                "kill : " + pkgName + "  "                                        + processes.get(i).importance);                }            } catch (Exception e) {                Log.w(TAG, "Exception caught: " + e);            }        }        return cleannum;    }    public String getTopActivy(){        ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);        List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1);        String cmpNameTemp = null;        if(null != runningTaskInfos){                cmpNameTemp=(runningTaskInfos.get(0).topActivity).getPackageName();                        }        return cmpNameTemp;   }

其中上面的代码blackListArray存储的是黑名单,存储对象为应用包名,whiteList为白名单,getThirdPlayingPackageName为当前播放的多媒体不需要被杀为比较好的策略,

当然你还可以定义一些自己想要的策略


可以通过按键加广播接收方式,如写在一个应用里面然后把自己杀了

android.os.Process.killProcess(android.os.Process.myPid());                 System.exit(0);



0 0
原创粉丝点击