流量
常用方法
方法一:Android系統自帶統計功能(總體流量數值)
Proc/uid_stat//tcp_snd和tcp_rcv
- UID是每個app安裝時候分配的唯一編號用於識別該app.
- tcp_snd:表示發送數據累計大小,單位是字節
- tcp_rcv:表示接收到的數據累計大小。
具體步驟:
(1)通過包名獲取app的PID;
(2)再訪問/proc//status文件查找app對應的UID;
(3)通過UID號加上100000號查看接收和發送的流量文件
方法二:Wireshark+tcpdump
./tcpdump -s 0 -w ./t1.pcap -v
- -s 0:默認抓包抓取長度是68字節,加上-s 0可以抓到完整的數據包。
- -w xxx:抓取到的包存放路徑。
- -v:抓包過程中顯示抓包的數量
方法三:GT(隨身調)工具(直接調用android的api): TrafficStats類是Android提供的一個流暢統計類,可以統計手機開機累計到現在使用的流量,也可以統計某個或者多個進程或者應用所使用流量,包括Wi-Fi和移動數據GPRS。
GT使用TrafficStats.getUidTxBytes(uid)來獲取流量數據(該方法號稱是獲取到指定 uid 發送流量的總和,但實測情況是只有 tcp 層的流量)。
GT(隨身調)是APP的隨身調試平台,是直接運行在手機上的IDTE。可以使用GT對APP進行快速的性能測試(CPU、內存、流量、電量、幀率/流暢度等)、開發日志查看、Crash日志查看、網絡數據包的抓取、APP內部參數的調試、真機代碼耗時統計等。
流量測試的分析
- 域名的流量消耗:抓包后,利用現有工具統計不同域名下的流量消耗。便於發現某個服務器是否存在流量消耗過大。
- 協議的流量消耗:便於發現某個協議是否存在流量消耗過大或者協議拉取較頻繁的現象。
電量
Battery Historian:Google提供的電量分析工具,Android 5.0以上支持
adb shell dumpsys battery //讀取電量和溫度
adb shell dumpsys batterystats --reset //重置電池統計信息
adb shell dumpsys batterystats > batterystats.txt // 獲取電池統計信息
python historian.py batterystats.txt > batterystats.html //生成報告
CPU
/proc 文件系統是一個偽文件系統,只存在內存中而不占用外存空間。它以文件系統的方式為內核與進程提供通信的接口。
從proc文件可以獲取:系統、進程、線程的CPU時間片使用情況,所以兩次采集時間片的數據就可以獲取進程CPU占用率。
CPU占用率=(進程T2-進程T1)/(系統T2-系統T1)
進程總CPU時間
總CPU時間 totalCPUTime=user+nice+system+idle+iowait+irq+softird
processCPUTime=utime+stime+cutime+cstime
線程總CPU時間 threadCPUTime=utime+stime+cutime+cstime
- utime:該任務在用於態運行的時間,單位為jiffies
- stime:該任務在核心態運行的時間,單位為jiffies
- cutime:累計的該任務所有waited-for進程曾經在用戶態運行的時間,單位為jiffies
- cstime:累計的該任務的所有的waited-for進程曾經在核心態運行的時間,單位為jiffies
獲取系統CPU時間片:讀取proc/stat
獲取進程CPU時間片:proc/pid/stat 線程時間片:/proc/pid/task/tid/stat
內存
- 系統內存:
- 系統內存:/proc/meminfo
- 系統空閑內存:ActivityManager
- 系統已有內存:總內存-空閑內存
- 進程內存:
- 進程內存上限、總內存都可以直接使用 am.getProcessMemoryInfo(PID)獲取
- 也可以直接使用top命令
流暢度檢測
流暢度:Android系統每隔16.7ms發出垂直同步信號(VSync信號)(1000ms/60=16.67ms)觸發對UI進行渲染。流暢畫面需要60幀/s,為了能夠實現60幀/s,意味着計算渲染的大多數操作必須在16.7ms完成。
當繪幀間隔超過16.7ms,垂直同步機制會讓顯示器硬件等待GPU完成柵格化渲染操作,我們就可以說此時掉幀了,也會造成用戶直接感官的卡頓。
1秒內vSync信號的次數定義為流暢值,即SM。
卡頓分類:
- 低流暢值區間:連續小卡頓造成的丟幀,即平均流暢值低於40幀/s的區間。
- 單次大卡頓:單次大卡頓造成的丟幀,即兩次繪幀間隔大於70ms,相當於丟了4幀以上的區間。
Android的幀繪制流程是:CPU主線程圖像處理->GPU進行光柵化->顯示幀。APP產生掉幀的情況大多是由“CPU主線程圖像處理”這一步超負載引起。
頁面啟動時長
頁面啟動時長:
- Activity啟動時長:喚醒Activity到Activity在前台進行第一次繪制的時間,繪幀檢測
- Fragment啟動時長:喚醒Fragment到Fragment執行onResume的完成時間。
- 冷啟動:頁面從startActivity開始
- 熱啟動:頁面從onStart或者onResume開始