@lihuazhang 好的,那我重新编辑下~
楼楼工具挺好用,我也借楼分享下自己写的一个监测 Cpu、内存的 app 小 demo。
1.内存计算方式
    public static void getMemoryForPid(Context context,int pid,String fileName) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        int[] pids = {pid,};
        MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(pids);
        ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(outInfo);
        long availMem = outInfo.availMem;
        long  totalMem = outInfo.totalMem;
        Utils.writeLog(fileName,"TotalPss:" + Utils.convertFileSize(memoryInfos[0].getTotalPss()) , true);
        Utils.writeLog(fileName,"TotalPrivateDirty:" + Utils.convertFileSize(memoryInfos[0].getTotalPrivateDirty()), true);
        Utils.writeLog(fileName,"TotalSharedDirty:" + Utils.convertFileSize(memoryInfos[0].getTotalSharedDirty()), true);   
}
2.Cpu 使用率,计划调用 com.android.internal.os.ProcessCpuTracker.getCpuTimeForPid(int pid) 获取线程 CpuTime,没有反射出来,就把这个方法摘出来了;系统 CpuTime 参照 com.android.internal.os.ProcessCpuTracker.update().
    public static long getCpuTimeForPid(int pid) {
        final String statFile = "/proc/" + pid + "/stat";
        final long[] statsData = new long[4];
        try {
            Class process = Class.forName("android.os.Process");
            Method read = process.getMethod("readProcFile", String.class,int[].class,String[].class,long[].class,float[].class);                  
            if ((Boolean)read.invoke(process.newInstance(), statFile, PROCESS_STATS_FORMAT,null, statsData, null)) {
                long time = statsData[PROCESS_STAT_UTIME] + statsData[PROCESS_STAT_STIME];
                //Log.e("CpuTimeForPid", String.valueOf(time));
                return time;
              }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }      
        return 0;
    }
    public static long getCpuTotalTime() {
        final long[] sysCpu = new long[7];
        try {
            Class process = Class.forName("android.os.Process");
            Method[] methods = process.getMethods();
            Method read = process.getMethod("readProcFile", String.class,int[].class,String[].class,long[].class,float[].class);                  
            if ((Boolean)read.invoke(process.newInstance(), "/proc/stat", SYSTEM_CPU_FORMAT,null, sysCpu, null)) {
                // Total user time is user + nice time.
                final long usertime = sysCpu[0]+sysCpu[1];
                // Total system time is simply system time.
                final long systemtime = sysCpu[2];
                // Total idle time is simply idle time.
                final long idletime = sysCpu[3];
                // Total irq time is iowait + irq + softirq time.
                final long iowaittime = sysCpu[4];
                final long irqtime = sysCpu[5];
                final long softirqtime = sysCpu[6];
                long totalTime = usertime + systemtime + idletime + irqtime + softirqtime;
                //Log.e("CpuTime", String.valueOf(totalTime));
                return totalTime;
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;   
    }
}
Cpu 使用率计算:按分钟 (60000) 采样 CpuTime,Cpu 使用率=(secPidCpuTime-firstPidCpuTime)/(secCpuTime-firstCpuTime)。
3.开启监测后按分钟写日志信息到 Sdcard;内存、Cpu 使用率采用 achartengine-1.1.0.jar 以折线图的形式显示。
手机型号 华为 P6  4.2.2
源码:https://github.com/wsjunjin/AndroidTest/tree/master
ps:第一次发长贴,有问题一起交流~
赞,写的很系统
好文
好贴