[Android]獲取整體APP CPU資訊

大搜車-自娛發表於2015-01-07

通過proc獲取CPU資訊。
adb shell cat /proc/stat | grep cpu > totalcpu0
此處第一行的數值表示的是CPU總的使用情況,所以我們只要用第一行的數字計算就可以了。下表解析第一行各數值的含義:
引數 解析(單位:jiffies)
(jiffies是核心中的一個全域性變數,用來記錄自系統啟動一來產生的節拍數,在linux中,一個節拍大致可理解為作業系統程式排程的最小時間片,不同linux核心可能值有不同,通常在1ms到10ms之間)
user 從系統啟動開始累計到當前時刻,處於使用者態的執行時間,不包含 nice值為負程式。
nice 從系統啟動開始累計到當前時刻,nice值為負的程式所佔用的CPU時間
system 從系統啟動開始累計到當前時刻,處於核心態的執行時間
idle 從系統啟動開始累計到當前時刻,除IO等待時間以外的其它等待時間
iowait 從系統啟動開始累計到當前時刻,IO等待時間(since 2.5.41)
irq 從系統啟動開始累計到當前時刻,硬中斷時間(since 2.6.0-test4)
softirq 從系統啟動開始累計到當前時刻,軟中斷時間(since 2.6.0-test4)
stealstolen which is the time spent in other operating systems when running in a virtualized environment(since 2.6.11)
guest which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel(since 2.6.24)
結論:總的cpu時間totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen +guest
screenshot
可以每1s獲取一次CPU資訊,分析整機CPU佔用率。
計算方法:
1、 取樣兩個足夠短的時間間隔的Cpu快照,分別記作t1,t2,其中t1、t2的結構均為:
(user、nice、system、idle、iowait、irq、softirq、stealstolen、guest)的9元組;
2、 計算總的Cpu時間片totalCpuTime
a) 把第一次的所有cpu使用情況求和,得到s1;
b) 把第二次的所有cpu使用情況求和,得到s2;
c) s2 - s1得到這個時間間隔內的所有時間片,即totalCpuTime = j2 - j1 ;
3、計算空閒時間idle
idle對應第四列的資料,用第二次的idle - 第一次的idle即可
idle=第二次的idle - 第一次的idle
4、計算cpu使用率
pcpu =100* (total-idle)/total

 

首先獲取應用的程式id:
adb shell ps | grep com.package | awk '{print $2}' > tmp
根據程式id,通過proc獲取CPU資訊
while read line; do adb shell cat /proc/$line/stat | awk '{print $14,$15,$16,$17}' >> appcpu0; done < tmp
說明:以下只解釋對我們計算Cpu使用率有用相關引數(14-17列)
引數 解釋
pid 程式號
utime 該任務在使用者態執行的時間,單位為jiffies
stime 該任務在核心態執行的時間,單位為jiffies
cutime 所有已死執行緒在使用者態執行的時間,單位為jiffies
cstime 所有已死在核心態執行的時間,單位為jiffies

 

結論:程式的總Cpu時間processCpuTime = utime + stime + cutime + cstime,該值包括其所有執行緒的cpu時間。
之後可以每1s獲取一次CPU資訊,分析獲得app的CPU佔用率等資訊。

相關文章