android获取cpu信息

效果图

这里写图片描述

关于调研

几种获取方式的对比

序号方法应用案例描述
1通过proc文件系统的cpuinfo文件获取1)AnotherMonitor
2)网易的Emmagge
不需要root,/proc文件系统是一个伪文件系统,存在于内存内,以文件系统的方式为内核与进程提供通信接口。
2adb shell dumpsys cpuinfoDumpsy获取内核cpu信息
3adb shell top -n 1| grep “+PackageName通过top命令获取内核信息

获取内容:
1)Proc文件系统可利用reader以文件系统读取方式从内存中proc文件读取内核cpu信息,可获取用户态的cpu时间、负进程的cpu时间、核心时间、io等待和非io等待时间、硬中断时间、软中断时间。比如:/proc/stat,可获取cpu总使用时间情况,获取文件内容如下:

cpu 432661 13295 86656 422145968 171474 233 5346
cpu0 123075 2462 23494 105543694 16586 0 4615
cpu1 111917 4124 23858 105503820 69697 123 371
cpu2 103164 3554 21530 105521167 64032 106 334
cpu3 94504 3153 17772 105577285 21158 4 24
intr 1065711094 1057275779 92 0 6 6 0 4 0 3527 0 0 0 70 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7376958 0 0 0 0 0 0 0 1054602 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 19067887
btime 1139187531
processes 270014
procs_running 1
procs_blocked 0

参数 解释
user (432661) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (13295) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (86656) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (422145968) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (171474) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
irq (233) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)

其中,cpu0-cpu3表示当前cpu为四核,计算时我们主要考虑第一个,也就是这行信息即可:

cpu 432661 13295 86656 422145968 171474 233 5346

实现方式

计算公式:
1)totalTime = user+system+nice+idle+iowait+irq+softtirq
2)cpuWorkTime = user+system+nice
3)cpu占用率 = (work - workBefore) / (totalCpu - totalCpuBefore)
解释:totalTime为cpu总使用时间,workTime为cpu工作时间,两个时间都为连续的片段,所以,我们在计算总占用率时,需要获取两次数据,两次数据的获取时间间隔可以自己设置,1s or 60s都可以,我们用第二次获取的工作时间-历史获取工作时间,就是这段时间内cpu的工作耗时,再除总耗时,即可获取cpu占用率。
以下是我在android中实现的代码:

//将读取的cpu信息存于字符串数组
String[] cpuInfos = null;
//计算总cpu占用率
try {
    //读文件的形式从proc文件系统中读取stat的信息
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/stat")),           1000);
    String load = reader.readLine();
    reader.close();
    //存储信息
    cpuInfos = load.split(" ");
} catch (IOException ex) {
    ex.printStackTrace();
}
//totalCpu = user+system+nice+idle+iowait+irq+softtirq
work = Long.parseLong(cpuInfos[2])
        + Long.parseLong(cpuInfos[3]) + Long.parseLong(cpuInfos[4]);
totalCpu = work
        + Long.parseLong(cpuInfos[6]) + Long.parseLong(cpuInfos[5])
        + Long.parseLong(cpuInfos[7]) + Long.parseLong(cpuInfos[8]);

......(省略获取历史工作时间的方式,可使用计时器再本次数据保存为历史数据)
//cpu占用率 = (work - workBefore) / (totalCpu - totalCpuBefore)
float CpuRate = 100 * ((float) (work - workBefore) / (float) (totalCpu - totalCpuBefore));

2)adb shell dumpsys cpuinfo:
这里写图片描述
3)adb shell top -n 1| grep “+PackageName:

20151201163739 0.8% 9819/com.yzt:remote:
20151201163739 0% 9699/com.yzt:
20151201163743 5.2% 9699/com.yzt:
20151201163743 1% 9819/com.yzt:remote:
20151201163743 0% 14177/com.yzt:pushservice:

2)和3)方式获取cpu信息可以获取完整内核信息,但缺点是需要root,而且无法普及所有机型,我们主要考虑使用1)方式获取cpu信息,有兴趣的可以用adb命令查看,如果希望做成android端,可以使用Process.execute命令运行看看输出数据(前提是手机已root)。android端实现原理是通过Process的方法去获取。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值