一、簡介
在使用 App 時經常會遇到手機發熱發燙或者應用 ANR 無響應等一系列問題,這都是因為 CPU 使用率過高或過於繁忙,使整個系統無法響應用戶操作,整體性能降低,用戶體驗非常差,所以我們需要進行 CPU 測試來檢測系統是否存在這一系列問題。
1.1 CPU 性能測試指標
Android CPU 性能測試主要關注兩個指標:
1. CPU 總體使用率
2. 應用程序 CPU 占用率
- 空閑狀態下應用CPU消耗情況
- 中等規格狀態(CPU已占用50%),應用CPU消耗情況
- 高負荷(CPU占用80%以上),應用CPU消耗情況
1.2 CPU 計算公式
在Linux系統下,CPU 利用率分為用戶態、系統態、空閑態,分別表示 CPU 處於用戶態執行的時間、系統內核執行的時間、空閑系統進程執行的時間(如下圖)。

CPU 使用率計算公式:

二、查看 CPU 指標
2.1 top 命令
top 命令提供了實時的對系統處理器的狀態監控,可以按 CPU 使用內存和執行時間對任務進行排序。
優缺點:易獲取,但可能存在誤差
1. 查看 top 命令幫助信息
adb shell top -h

2. 使用命令獲取 CPU 使用情況
adb shell top -m 10 -n 1 -d 2 -s cpu -t

第一組數據(CPU占用率):
- User:用戶進程
- System:系統進程
- IOW:IO等待時間
- IRQ:硬中斷時間
第二組數據(CPU使用情況):
- User:處於用戶態的運行時間,不包含優先值為負進程
- Nice:優先值為負的進程所占用的CPU時間
- Sys:處於核心態的運行時間
- Idle:除IO等待時間以外的其它等待時間
- IOW:IO等待時間
- IRQ:硬中斷時間
- SIRQ:軟中斷時間
第三組數據(進程屬性):
- PID:進程id
- PR:優先級
- CPU%:當前瞬時CPU占用率
- S:進程狀態(D=不可中斷的睡眠狀態,R=運行狀態,S=睡眠狀態,T=跟蹤/停止狀態,Z=僵屍進程)
- #THR:程序當前所用的線程數
- VSS:Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
- RSS:Resident Set Size 實際使用屋里內存(包含共享庫占用的內存)
- PCY:調度策略優先級,SP_BACKGROUND/SP_FOREGROUND
- UID:進程所有者的用戶id
- Name:進程名稱
2.2 cpuinfo
信息較少,不推薦使用
adb shell dumpsys cpuinfo

進程917 CPU占用率4.2%,其中用戶user話費2%,內核空間kernel話費2.2%
2.3 /proc 文件獲取
/proc 文件系統是一個偽文件系統,只存在內存當中,不占用外存空間。它以文件系統的方式為內核與進程提供通信的接口。用戶和應用程序可以通過/proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取/proc目錄中的文件時,/proc文件系統是動態從系統內核讀出所需信息並提交的。
安卓性能指標 cpu 總體使用率和應用程序 cpu 占用率主要與兩個 proc 文件相關,分別是 /proc/stat 和 /proc/進程id/stat文件.。
stat 中存儲了 cpu 從啟動到當前時刻的活動信息,可查看 cpu 總體使用率 adb shell cat /proc/stat

以 cpu 開頭的行是關注重點,cpu0 表示當前 CPU 的核心(如果為雙核還會有 cpu1),cpu 為總的 Jiffies(時間片)
Jiffies 為Linux核心變數,是一個unsigned long類型的變量,它被用來記錄系統自開機以來,已經過了多少tick。每發生一次timer interrupt,Jiffies變數會被加1。
每一列的數值含義如下:
- user :從系統啟動開始累計到當前時刻,用戶態的jiffies ,不包含nice值為負進程;
- nice :從系統啟動開始累計到當前時刻,nice值為負的進程所占用的jiffies;
- system :從系統啟動開始累計到當前時刻,系統態的jiffies;
- idle :從系統啟動開始累計到當前時刻,除硬盤IO等待時間以外其它等待的jiffies;
- iowait : 從系統啟動開始累計到當前時刻,硬盤IO等待的jiffies;
- irq : 從系統啟動開始累計到當前時刻,硬中斷的jiffies;
- softirq :從系統啟動開始累計到當前時刻,軟中斷的jiffies。
總的 Jiffies 就是上面所有項加起來的總和,故系統所有進程在一段時間的總的 CPU 占用率為:
| total = user+system+nice+idle+iowait+irq+softirq cpu usage=[(user_end +sys_end+nice_end) - (user_begin + sys_begin+nice_begin)]/(total_end - total_begin)*100 |
要統計某個 App 的使用率可以進入到/proc/進程id/stat目錄
1. 先獲取 App 進程 ID,以豆瓣為例
2. 查詢對應的 stat 文件

在第14行(utime)、15行(stime)記錄了當前進程的 Jiffies 信息
- utime=963 該任務在用戶態運行的時間,單位為 jiffies
- stime=259 該任務在核心態運行的時間,單位為 jiffies
所以當前進程的Jiffies計算方式為utime+stime,要計算出一段時間內該進程的CPU使用率可使用:(當前時間(utime + stime) - 舊時間(utime + stime))/ total cpu Jiffies
2.4 第三方工具
如騰訊 GT、網易 Emagee 等。
