Android进程性能监控工具Honeybadger实现
这是一个Android平台上的进程监控工具,可以实现对本机上安装的非系统app的进程的CPU利用率、PSS、网络上下行流量等数据进行准实时监控,并展示图形化结果(折线图)。
工具名称为:Honeybadger
百度移动下载地址:http://as.baidu.com/a/item?docid=6528832&pre=web_am_se
腾讯应用宝下载地址:
运行的效果图如下:
关键点总结:
1.进程CPU的利用率如何计算
Android应用是以Linux用户的模式运行在Linux之上,Linux的/proc路径下有相关统计文件,如/proc/stat文件记录了系统自开机以来的CPU时间片使用情况,该文件的第一行记录即为总的CPU使用情况记录,而如果想要查看某一指定进程的时间片段使用情况,需要首先查询到该进程的pid(可以在运行app后,通过adb shell 查询),之后/proc/pid/stat文件中便记录了该进程的时间片使用情况。(更进一步,线程级的时间片使用情况记录在/proc/pid/task/tid/stat文件中)。文件的具体格式这里不多叙述,网上有很多介绍。
某进程CPU使用率计算的方法就是:分别读出某一初始时间CPU总的时间片使用情况,以及该时间点某一进程的时间片使用情况,然后经过一个很短的时间片段,比如800毫秒,再一次读取CPU总的时间片使用情况以及该待测进程的时间片使用情况。那么在这800毫秒内该进程的CPU占用率可以通过该段时间内该进程时间片的增量与CPU总的时间片增量作商得到。
分析CPU文件的类实现如下,pickOne方法用来实现一次取样:
importjava.io.BufferedReader;
import java.io.File;
importjava.io.FileReader;
importjava.io.IOException;
import java.lang.Thread;
public class ParseStatFile {
private int pid;
public ParseStatFile(int i){
pid = i;
}
public float pickOne() throwsInterruptedException{
try{
CPU c1 = new CPU();
CPUofProccp1 = new CPUofProc(pid);
c1.fillCPU();
cp1.fillCPUofProc();
Thread.sleep(800);
CPU c2 = new CPU();
CPUofProccp2 = new CPUofProc(pid);
c2.fillCPU();
cp2.fillCPUofProc();
returncpuRateOfProc(c1,c2,cp1,cp2);
}
catch (Exception ex){
return 0;
}
}
public static StringgetStringFromFile(String filename){
StringFileName=filename;
StringfileStr = "";
File myFile=new File(FileName);
if(!myFile.exists())
{
System.err.println("Can't Find " + FileName);
}
try
{
BufferedReader in = new BufferedReader(newFileReader(myFile));
String str;
while ((str =in.readLine()) !=null)
{
fileStr+=str;
}
in.close();
}
catch (IOException e)
{
e.getStackTrace();
}
return fileStr;
}
private class CPU{
int user =0;
int nice =0;
int system = 0;
int idle = 0;
int iowait=0;
int irq = 0;
int softtirq = 0;
int stealstolen = 0;
int guest = 0;
public CPU(){
}
public void fillCPU(){
StringfileName = "/proc/stat";
StringstrOfFile = getStringFromFile(fileName);
String[]arr= strOfFile.split("\\s+");//@
user = Integer.parseInt(arr[1]);
nice = Integer.parseInt(arr[2]);
system = Integer.pars