指標背景
很多場景下我們去使用App,可能會碰到手機會出現發熱發燙的現象。這是因為CPU使用率過高、CPU過於繁忙,會使得整個系統無法響應用戶,整體性能降低,用戶體驗變得相當差,也容易引起ANR等等一系列問題。
Android性能指標CPU主要關注兩點:
- CPU總體使用率
- 應用程序CPU占用率
指標值獲取
直接上干貨,獲取App CPU指標值的幾種不同方式
- 讀取Linux proc文件系統(精確、方便自動化集成)
- 使用外部第三方工具來輔助測試,比如:騰訊GT,網易Emagee等(其實這些工具的原理就是基於調用android系統底層的API完成),掌握adb或者第三方工具獲取方法都可以。(精確,易獲取,推薦)
- Linux top命令(有誤差,易獲取)
proc文件獲取方式
/proc文件系統是一個偽文件系統,它只存在內存當中,而不占用外存空間。它以文件系統的方式為內核與進程提供通信的接口。用戶和應用程序可以通過/proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取/proc目錄中的文件時,/proc文件系統是動態從系統內核讀出所需信息並提交的。
我們關注的安卓性能指標cpu總體使用率和應用程序cpu占用率主要與兩個proc文件相關,分別是/proc/stat和/proc/進程id/stat文件.。
通過adb shell進入到手機內部shell模式,再通過cat /proc/stat 查看結果如下:
前面三行cpu cpu0 cpu1是我們需要關注的重點,cpu0、cpu1表示當前CPU的核心(雙核),cpu為總的Jiffies,這里引入了Jiffies(時間片)的概念,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
上述方法統計的是當前系統所有進程的CPU總和使用率
如果我們要統計某個App的使用率可以進入到/proc/進程id/stat目錄,其中就有包含某進程的CPU信息
首先,我們需要查詢到App的進程ID,以檸檬班App舉例
其中的進程ID為1228,再查詢stat文件信息:
在第14行、15行有記錄當前進程的Jiffies信息
utime=448 該任務在用戶態運行的時間,單位為jiffies
stime=2380 該任務在核心態運行的時間,單位為jiffies
所以當前進程的Jiffies計算方式為utime+stime
通過shell腳本獲取的方式:
cat /proc/進程id/stat | awk -F " " '{print $14,$15}'
要計算出一段時間內該進程的CPU使用率信息即可通過:
utime+stime(當前時間點)-utime+stime(舊時間點)/ total cpu Jiffies
騰訊GT工具
不熟悉的同學可以進入到官網先去了解一番https://gt.qq.com/,這里貼出官方的介紹:
GT(隨身調)是APP的隨身調測平台,它是直接運行在手機上的“集成調測環境”(IDTE, Integrated Debug Environment)。利用GT,僅憑一部手機,無需連接電腦,您即可對APP進行快速的性能測試(CPU、內存、流量、電量、幀率/流暢度等等)、開發日志的查看、Crash日志查看、網絡數據包的抓取、APP內部參數的調試、真機代碼耗時統計等。
使用GT獲取Jiffies指標步驟如下
測試完畢之后可以保存為csv格式的數據,用Excel工具打開查看即可
top命令獲取CPU使用率
top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。top是一個動態顯示過程,即可以通過用戶按鍵來不斷刷新當前狀態。如果在前台執行該命令,它將獨占前台,直到用戶終止該程序為止。top命令提供了實時的對系統處理器的狀態監視。
使用方式:
可查看占用cpu最高的前10個程序(-t 顯示進程名稱,-s 按指定行排序,-n 在退出前刷新幾次,-d 刷新間隔,-m 顯示最大數量):top -m 10 -s cpu
如果你想篩選出你自己的應用的話可以用下面這一命令:
adb shell top -n 1| grep PackageName
問題分析及建議
如果APP某場景進行操作時出現發燙、卡頓、ANR現象時,可以懷疑出現CPU問題,一般解決思路如下:
如果已經導致ANR, 則去logcat文件里面搜索"ANR in" ,以及adb pull拉取trace文件。
沒有導致ANR則基於以上方法獲取到的CPU占用率,如果某場景的CPU占用率走勢異常、峰值存在異常、均值大於基線,則可以利用traceview查看分析Trace文件,或者使用Android studio里面的Android Monitor根據Monitor中的CPU可以看出目前CPU明細使用,由開發負責定位解決。