Android获取CPU使用率的几种方式

来源:互联网 发布:李小璐开的淘宝店名字 编辑:程序博客网 时间:2024/06/05 18:55
   最近需要做一个小功能获取Android设备的各种参数,包括内存、SD卡容量、CPU使用率等问题。发现其他几种都很好获得,有问题的是CPU的使用率。   android本质还是linux,因此可以用linux的方式获取某个进程的cpu使用率。

1.执行命令。

<code class="hljs java has-numbering"><span class="hljs-javadoc">/** get CPU rate     *<span class="hljs-javadoctag"> @return</span>     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getProcessCpuRate</span>() {        StringBuilder tv = <span class="hljs-keyword">new</span> StringBuilder();        <span class="hljs-keyword">int</span> rate = <span class="hljs-number">0</span>;        <span class="hljs-keyword">try</span> {            String Result;            Process p;            p = Runtime.getRuntime().exec(<span class="hljs-string">"top -n 1"</span>);            BufferedReader br = <span class="hljs-keyword">new</span> BufferedReader(<span class="hljs-keyword">new</span> InputStreamReader(p.getInputStream()));            <span class="hljs-keyword">while</span> ((Result = br.readLine()) != <span class="hljs-keyword">null</span>) {                <span class="hljs-keyword">if</span> (Result.trim().length() < <span class="hljs-number">1</span>) {                    <span class="hljs-keyword">continue</span>;                } <span class="hljs-keyword">else</span> {                    String[] CPUusr = Result.split(<span class="hljs-string">"%"</span>);                    tv.append(<span class="hljs-string">"USER:"</span> + CPUusr[<span class="hljs-number">0</span>] + <span class="hljs-string">"\n"</span>);                    String[] CPUusage = CPUusr[<span class="hljs-number">0</span>].split(<span class="hljs-string">"User"</span>);                    String[] SYSusage = CPUusr[<span class="hljs-number">1</span>].split(<span class="hljs-string">"System"</span>);                    tv.append(<span class="hljs-string">"CPU:"</span> + CPUusage[<span class="hljs-number">1</span>].trim() + <span class="hljs-string">" length:"</span> + CPUusage[<span class="hljs-number">1</span>].trim().length() + <span class="hljs-string">"\n"</span>);                    tv.append(<span class="hljs-string">"SYS:"</span> + SYSusage[<span class="hljs-number">1</span>].trim() + <span class="hljs-string">" length:"</span> + SYSusage[<span class="hljs-number">1</span>].trim().length() + <span class="hljs-string">"\n"</span>);                    rate = Integer.parseInt(CPUusage[<span class="hljs-number">1</span>].trim()) + Integer.parseInt(SYSusage[<span class="hljs-number">1</span>].trim());                    <span class="hljs-keyword">break</span>;                }            }        } <span class="hljs-keyword">catch</span> (IOException e) {            <span class="hljs-comment">// TODO Auto-generated catch block</span>            e.printStackTrace();        }        System.out.println(rate + <span class="hljs-string">""</span>);        <span class="hljs-keyword">return</span> rate;    }</code>

2.读取文件。
在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。
在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是 1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。
proc文件系统
/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。
/proc目录中有一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口。此外,在Linux 2.6.0-test6以上的版本中/proc/pid目录中有一个task目录,/proc/pid/task目录中也有一些以该进程所拥有的线程的线程号命名的目录/proc/pid/task/tid,它们是读取线程信息的接口。
因此可以根据/proc/stat和/proc/pid/stat中的信息计算进程的cpu使用率。
/proc/stat文件
该文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。不同内核版本中该文件的格式可能不大一致,以下通过实例来说明数据该文件中各字段的含义。
实例数据:
proc/stat结果
第一行的数值表示的是CPU总的使用情况,所以我们只要用第一行的数字计算就可以了。下表解析第一行各数值的含义:
参数
解析(单位:jiffies)
user (14624) 从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice值为负进程。
nice (771) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间
system (8484) 从系统启动开始累计到当前时刻,处于核心态的运行时间
idle (283052) 从系统启动开始累计到当前时刻,除IO等待时间以外的其它等待时间
iowait (0) 从系统启动开始累计到当前时刻,IO等待时间(since 2.5.41)
irq (0) 从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)
softirq (62) 从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)
结论1:总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq
/proc/pid/stat文件
该文件包含了某一进程所有的活动的信息,该文件中的所有值都是从系统启动开始累计
到当前时刻。以下通过实例数据来说明该文件中各字段的含义:
procpidstat
说明:以下只解释对我们计算Cpu使用率有用相关参数
参数
解析(单位:jiffies)
Pid(1327) 进程号
Utime(39) 该任务在用户态运行的时间,单位为jiffies
Stime(25) 该任务在核心态运行的时间,单位为jiffies
Cutime(0) 所有已死线程在用户态运行的时间,单位为jiffies
Cstime(0) 所有已死在核心态运行的时间,单位为jiffies
结论2:进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。
某一线程Cpu使用率的计算
计算方法:
1. 采样两个足够短的时间隔的cpu快照与线程快照,
a) 每一个cpu快照均为(user、nice、system、idle、iowait、irq、softirq、stealstealon、guest)的9元组;
b) 每一个线程快照均为 (utime、stime)的2元组;
2. 分别根据结论1、结论2计算出两个时刻的总的cpu时间与线程的cpu时间,分别记作:totalCpuTime1、totalCpuTime2、threadCpuTime1、threadCpuTime2
3. 计算该线程的cpu使用率pcpu = 100*( threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1) (按100%计算,如果是多核情况下还需乘以cpu的个数);

计算某个时间段内AppCpuTime与TotalCpuTime的变化,然后按照比例换算成该应用的Cpu使用率。

Android系统本省也有一个类是用来显示Cpu使用率的:

android/system/frameworks/base/packages/SystemUI/src/com/android/systemui/LoadAverageService.java
阅读源码发现也是读取/proc目录下的文件来计算Cpu使用率。

0 0
原创粉丝点击