获取当前系统的cpu使用率和进程使用率,主要是通过使用时间计算;
安卓原生类:
/frameworks/base/core/java/com/android/internal/os/ProcessCpuTracker.java
//获取一瞬间的系统cpu时间
public float getTotalCpuTime() {
final long[] sysCpu = mSystemCpuData;
if (Process.readProcFile("/proc/stat", SYSTEM_CPU_FORMAT,null, sysCpu, null)){
//当前系统的cpu 关键字段,可以在adb shell下,/proc/stat中查看
// Total user time is user + nice time.
final long usertime = (sysCpu[0]+sysCpu[1]) * mJiffyMillis;
// Total system time is simply system time.
final long systemtime = sysCpu[2] * mJiffyMillis;
// Total idle time is simply idle time.
final long idletime = sysCpu[3] * mJiffyMillis;
// Total irq time is iowait + irq + softirq time.
final long iowaittime = sysCpu[4] * mJiffyMillis;
final long irqtime = sysCpu[5] * mJiffyMillis;
final long softirqtime = sysCpu[6] * mJiffyMillis;
return usertime + systemtime + idletime + iowaittime + irqtime + softirqtime;
}else{
return 0f;
}
}
/**
* 原生方法,获取一瞬间的pid的cpu时间
* Returns the total time (in milliseconds) spent executing in
* both user and system code. Safe to call without lock held.
*/
public long getCpuTimeForPid(int pid) {
synchronized (mSinglePidStatsData) {
final String statFile = "/proc/" + pid + "/stat";
final long[] statsData = mSinglePidStatsData;
if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
null, statsData, null)) {
long time = statsData[PROCESS_STAT_UTIME]
+ statsData[PROCESS_STAT_STIME];
return time * mJiffyMillis;
}
return 0;
}
}
进程cpu使用率计算公式: 两次进程cpu时间差/两次系统cpu时间差