android+5+内存使用率,在Android中获取内存使用情况

根据前面的答案和个人体验,下面是我用来监视CPU使用情况的代码。这个类的代码是用纯Java编写的。import java.io.IOException;import java.io.RandomAccessFile;/**

* Utilities available only on Linux Operating System.

*

* A typical use is to assign a thread to CPU monitoring:

*

 
 

* @Override

* public void run() {

*  while (CpuUtil.monitorCpu) {

*

*      LinuxUtils linuxUtils = new LinuxUtils();

*

*      int pid = android.os.Process.myPid();

*      String cpuStat1 = linuxUtils.readSystemStat();

*      String pidStat1 = linuxUtils.readProcessStat(pid);

*

*      try {

*          Thread.sleep(CPU_WINDOW);

*      } catch (Exception e) {

*      }

*

*      String cpuStat2 = linuxUtils.readSystemStat();

*      String pidStat2 = linuxUtils.readProcessStat(pid);

*

*      float cpu = linuxUtils.getSystemCpuUsage(cpuStat1, cpuStat2);

*      if (cpu >= 0.0f) {

*          _printLine(mOutput, "total", Float.toString(cpu));

*      }

*

*      String[] toks = cpuStat1.split(" ");

*      long cpu1 = linuxUtils.getSystemUptime(toks);

*

*      toks = cpuStat2.split(" ");

*      long cpu2 = linuxUtils.getSystemUptime(toks);

*

*      cpu = linuxUtils.getProcessCpuUsage(pidStat1, pidStat2, cpu2 - cpu1);

*      if (cpu >= 0.0f) {

*          _printLine(mOutput, "" + pid, Float.toString(cpu));

*      }

*

*      try {

*          synchronized (this) {

*              wait(CPU_REFRESH_RATE);

*          }

*      } catch (InterruptedException e) {

*          e.printStackTrace();

*          return;

*      }

*  }

*

*  Log.i("THREAD CPU", "Finishing");

* }

*/public final class LinuxUtils {

// Warning: there appears to be an issue with the column index with android linux:

// it was observed that on most present devices there are actually

// two spaces between the 'cpu' of the first column and the value of

// the next column with data. The thing is the index of the idle

// column should have been 4 and the first column with data should have index 1.

// The indexes defined below are coping with the double space situation.

// If your file contains only one space then use index 1 and 4 instead of 2 and 5.

// A better way to deal with this problem may be to use a split method

// not preserving blanks or compute an offset and add it to the indexes 1 and 4.

private static final int FIRST_SYS_CPU_COLUMN_INDEX = 2;

private static final int IDLE_SYS_CPU_COLUMN_INDEX = 5;

/** Return the first line of /proc/stat or null if failed. */

public String readSystemStat() {

RandomAccessFile reader = null;

String load = null;

try {

reader = new RandomAccessFile("/proc/stat", "r");

load = reader.readLine();

} catch (IOException ex) {

ex.printStackTrace();

} finally {

Streams.close(reader);

}

return load;

}

/**

* Compute and return the total CPU usage, in percent.

*

* @param start

*            first content of /proc/stat. Not null.

* @param end

*            second content of /proc/stat. Not null.

* @return 12.7 for a CPU usage of 12.7% or -1 if the value is not

*         available.

* @see {@link #readSystemStat()}

*/

public float getSystemCpuUsage(String start, String end) {

String[] stat = start.split("\\s");

long idle1 = getSystemIdleTime(stat);

long up1 = getSystemUptime(stat);

stat = end.split("\\s");

long idle2 = getSystemIdleTime(stat);

long up2 = getSystemUptime(stat);

// don't know how it is possible but we should care about zero and

// negative values.

float cpu = -1f;

if (idle1 >= 0 && up1 >= 0 && idle2 >= 0 && up2 >= 0) {

if ((up2 + idle2) > (up1 + idle1) && up2 >= up1) {

cpu = (up2 - up1) / (float) ((up2 + idle2) - (up1 + idle1));

cpu *= 100.0f;

}

}

return cpu;

}

/**

* Return the sum of uptimes read from /proc/stat.

*

* @param stat

*            see {@link #readSystemStat()}

*/

public long getSystemUptime(String[] stat) {

/*

* (from man/5/proc) /proc/stat kernel/system statistics. Varies with

* architecture. Common entries include: cpu 3357 0 4313 1362393

*

* The amount of time, measured in units of USER_HZ (1/100ths of a

* second on most architectures, use sysconf(_SC_CLK_TCK) to obtain the

* right value), that the system spent in user mode, user mode with low

* priority (nice), system mode, and the idle task, respectively. The

* last value should be USER_HZ times the second entry in the uptime

* pseudo-file.

*

* In Linux 2.6 this line includes three additional columns: iowait -

* time waiting for I/O to complete (since 2.5.41); irq - time servicing

* interrupts (since 2.6.0-test4); softirq - time servicing softirqs

* (since 2.6.0-test4).

*

* Since Linux 2.6.11, there is an eighth column, steal - stolen time,

* which is the time spent in other operating systems when running in a

* virtualized environment

*

* Since Linux 2.6.24, there is a ninth column, guest, which is the time

* spent running a virtual CPU for guest operating systems under the

* control of the Linux kernel.

*/

// with the following algorithm, we should cope with all versions and

// probably new ones.

long l = 0L;

for (int i = FIRST_SYS_CPU_COLUMN_INDEX; i 

if (i != IDLE_SYS_CPU_COLUMN_INDEX ) { // bypass any idle mode. There is currently only one.

try {

l += Long.parseLong(stat[i]);

} catch (NumberFormatException ex) {

ex.printStackTrace();

return -1L;

}

}

}

return l;

}

/**

* Return the sum of idle times read from /proc/stat.

*

* @param stat

*            see {@link #readSystemStat()}

*/

public long getSystemIdleTime(String[] stat) {

try {

return Long.parseLong(stat[IDLE_SYS_CPU_COLUMN_INDEX]);

} catch (NumberFormatException ex) {

ex.printStackTrace();

}

return -1L;

}

/** Return the first line of /proc/pid/stat or null if failed. */

public String readProcessStat(int pid) {

RandomAccessFile reader = null;

String line = null;

try {

reader = new RandomAccessFile("/proc/" + pid + "/stat", "r");

line = reader.readLine();

} catch (IOException ex) {

ex.printStackTrace();

} finally {

Streams.close(reader);

}

return line;

}

/**

* Compute and return the CPU usage for a process, in percent.

*

* The parameters {@code totalCpuTime} is to be the one for the same period

* of time delimited by {@code statStart} and {@code statEnd}.

*

* @param start

*            first content of /proc/pid/stat. Not null.

* @param end

*            second content of /proc/pid/stat. Not null.

* @return the CPU use in percent or -1f if the stats are inverted or on

*         error

* @param uptime

*            sum of user and kernel times for the entire system for the

*            same period of time.

* @return 12.7 for a cpu usage of 12.7% or -1 if the value is not available

*         or an error occurred.

* @see {@link #readProcessStat(int)}

*/

public float getProcessCpuUsage(String start, String end, long uptime) {

String[] stat = start.split("\\s");

long up1 = getProcessUptime(stat);

stat = end.split("\\s");

long up2 = getProcessUptime(stat);

float ret = -1f;

if (up1 >= 0 && up2 >= up1 && uptime > 0.) {

ret = 100.f * (up2 - up1) / (float) uptime;

}

return ret;

}

/**

* Decode the fields of the file {@code /proc/pid/stat} and return (utime +

* stime)

*

* @param stat

*            obtained with {@link #readProcessStat(int)}

*/

public long getProcessUptime(String[] stat) {

return Long.parseLong(stat[14]) + Long.parseLong(stat[15]);

}

/**

* Decode the fields of the file {@code /proc/pid/stat} and return (cutime +

* cstime)

*

* @param stat

*            obtained with {@link #readProcessStat(int)}

*/

public long getProcessIdleTime(String[] stat) {

return Long.parseLong(stat[16]) + Long.parseLong(stat[17]);

}

/**

* Return the total CPU usage, in percent.

* The call is blocking for the time specified by elapse.

*

* @param elapse

*            the time in milliseconds between reads.

* @return 12.7 for a CPU usage of 12.7% or -1 if the value is not

*         available.

*/

public float syncGetSystemCpuUsage(long elapse) {

String stat1 = readSystemStat();

if (stat1 == null) {

return -1.f;

}

try {

Thread.sleep(elapse);

} catch (Exception e) {

}

String stat2 = readSystemStat();

if (stat2 == null) {

return -1.f;

}

return getSystemCpuUsage(stat1, stat2);

}

/**

* Return the CPU usage of a process, in percent.

* The call is blocking for the time specified by elapse.

*

* @param pid

* @param elapse

*            the time in milliseconds between reads.

* @return 6.32 for a CPU usage of 6.32% or -1 if the value is not

*         available.

*/

public float syncGetProcessCpuUsage(int pid, long elapse) {

String pidStat1 = readProcessStat(pid);

String totalStat1 = readSystemStat();

if (pidStat1 == null || totalStat1 == null) {

return -1.f;

}

try {

Thread.sleep(elapse);

} catch (Exception e) {

e.printStackTrace();

return -1.f;

}

String pidStat2 = readProcessStat(pid);

String totalStat2 = readSystemStat();

if (pidStat2 == null || totalStat2 == null) {

return -1.f;

}

String[] toks = totalStat1.split("\\s");

long cpu1 = getSystemUptime(toks);

toks = totalStat2.split("\\s");

long cpu2 = getSystemUptime(toks);

return getProcessCpuUsage(pidStat1, pidStat2, cpu2 - cpu1);

}}

利用这个阶级有几种方法。你可以给我打电话syncGetSystemCpuUsage或syncGetProcessCpuUsage但是每个线程都阻塞了调用线程。由于一个常见的问题是同时监视当前进程的总CPU使用量和CPU使用情况,所以我设计了一个计算这两个过程的类。该类包含一个专用线程。输出管理是特定于实现的,您需要自己编写代码。

这个类可以通过几种方式进行定制。常数CPU_WINDOW定义读取深度,即读数与相应CPU负载计算之间的毫秒数。CPU_REFRESH_RATE是每个CPU负载测量之间的时间。不要设置CPU_REFRESH_RATE为0,因为它将在第一次读取之后挂起线程。import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.OutputStream;import android.app.Application;import android.os.Handler;import android.os.HandlerThread;import android.util.Log;import my.app.LinuxUtils;import my.app.Streams;import my.app.TestReport;import my.app.Utils;public final class CpuUtil {

private static final int CPU_WINDOW = 1000;

private static final int CPU_REFRESH_RATE = 100; // Warning: anything but > 0

private static HandlerThread handlerThread;

private static TestReport output;

static {

output = new TestReport();

output.setDateFormat(Utils.getDateFormat(Utils.DATE_FORMAT_ENGLISH));

}

private static boolean monitorCpu;

/**

* Construct the class singleton. This method should be called in

* {@link Application#onCreate()}

*

* @param dir

*            the parent directory

* @param append

*            mode

*/

public static void setOutput(File dir, boolean append) {

try {

File file = new File(dir, "cpu.txt");

output.setOutputStream(new FileOutputStream(file, append));

if (!append) {

output.println(file.getAbsolutePath());

output.newLine(1);

// print header

_printLine(output, "Process", "CPU%");

output.flush();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

/** Start CPU monitoring */

public static boolean startCpuMonitoring() {

CpuUtil.monitorCpu = true;

handlerThread = new HandlerThread("CPU monitoring"); //$NON-NLS-1$

handlerThread.start();

Handler handler = new Handler(handlerThread.getLooper());

handler.post(new Runnable() {

@Override

public void run() {

while (CpuUtil.monitorCpu) {

LinuxUtils linuxUtils = new LinuxUtils();

int pid = android.os.Process.myPid();

String cpuStat1 = linuxUtils.readSystemStat();

String pidStat1 = linuxUtils.readProcessStat(pid);

try {

Thread.sleep(CPU_WINDOW);

} catch (Exception e) {

}

String cpuStat2 = linuxUtils.readSystemStat();

String pidStat2 = linuxUtils.readProcessStat(pid);

float cpu = linuxUtils                            .getSystemCpuUsage(cpuStat1, cpuStat2);

if (cpu >= 0.0f) {

_printLine(output, "total", Float.toString(cpu));

}

String[] toks = cpuStat1.split(" ");

long cpu1 = linuxUtils.getSystemUptime(toks);

toks = cpuStat2.split(" ");

long cpu2 = linuxUtils.getSystemUptime(toks);

cpu = linuxUtils.getProcessCpuUsage(pidStat1, pidStat2,

cpu2 - cpu1);

if (cpu >= 0.0f) {

_printLine(output, "" + pid, Float.toString(cpu));

}

try {

synchronized (this) {

wait(CPU_REFRESH_RATE);

}

} catch (InterruptedException e) {

e.printStackTrace();

return;

}

}

Log.i("THREAD CPU", "Finishing");

}

});

return CpuUtil.monitorCpu;

}

/** Stop CPU monitoring */

public static void stopCpuMonitoring() {

if (handlerThread != null) {

monitorCpu = false;

handlerThread.quit();

handlerThread = null;

}

}

/** Dispose of the object and release the resources allocated for it */

public void dispose() {

monitorCpu = false;

if (output != null) {

OutputStream os = output.getOutputStream();

if (os != null) {

Streams.close(os);

output.setOutputStream(null);

}

output = null;

}

}

private static void _printLine(TestReport output, String process, String cpu) {

output.stampln(process + ";" + cpu);

}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值