一、前言
1、Android性能測試分為兩類:
1、一類為rom版本(系統)的性能測試
2、一類為應用app的性能測試
2、Android的app性能測試包括的測試項比如:
1、資源消耗
2、內存泄露
3、電量功耗
4、耗時
5、網絡流量消耗
6、移動終端相關資源利用率
7、幀率
8、渲染等等....
3、工具:
(工具的原理都是基於調用android底層的一些api來獲取到測試所用到的值)GT等
4、測試方法:
1、設計場景 :手工或自動化場景
2、獲取數據:可獲取的數據包括:內存、cpu、電量功耗、hprof(內存泄露分析文件)、響應時間等等。。。。配合手工或自動化場景來獲取數據(最好多取幾次而且每次配合不同的設備看平均值)作為最后的對比分析
3、結果分析 :拿到數據后分析哪些模塊的數據異常再去Check code定位問題的原因
5、Android系統的幾種場景狀態:
1、空閑狀態: 指打開應用后,點擊home鍵讓應用后台運行,此時應用處於的狀態叫做空閑
2、中等規格和滿規格狀態:中等規格和滿規格指的是對應用的操作時間的間隔長短不一,中等規格時間較長,滿規格時間較短
二、內存
1、內存測試中的測試子項
1)空閑狀態下的應用內存消耗情況
2)中等規格狀態下的應用內存消耗情況
3)滿規格狀態下的應用內存消耗情況
4)應用內存峰值情況
5)應用內存泄露情況
6)應用是否常駐內存
7)壓力測試后的內存使用情況
2、內存問題現象
1)內存抖動
2)大內存對象被分配
3)內存不斷增長
4)頻繁GC
3、內存數據獲取
1)各種Linux命令(free、top、meninfo等等。。。)
2)通過dumpsys
adb shell dumpsys meminfo pakagename
4、android檢查內存泄漏步驟
1)運行Monkey運行壓力測試
adb shell monkey -p [包名] --pct-touch 100 --throttle 1000 -s 100 -v -v 50 //運行APP,50次隨機點擊時間,每次時間間隔1s,並生成種子值100
2)監控內存值,如果出現過大等遞增異常則保存HPROF文件(hprof文件是Java 虛擬機的Heap快照)用於分析查看應用內存的命令:
adb shell dumpsys meminfo cn.microinvestment.weitou(進程名)
如果發現內存過大,則保存HPROF文件:adb shell am dumpheap <進程名> <保存路徑>
3)分析hprof文件
用工具MAT來查看,首先還要這個HPROF文件轉換成MAT可讀的文件
在Android SDK tool里面有個hprof-conv命令:
hprof-conv <原HPROF文件路徑> <轉換后的HPROF路徑>
hprof-conv a.hprof b.hprof
4)用MAT工具打開轉換后的HPROF文件
一般選擇Leak Suspects Report(通過SQL語句來查詢對象有沒有被釋放掉,如果有多個相同的對象,則會存在內存泄露的問題)
三、CPU篇
1、CPU測試中的測試子項:
1)空閑狀態下的應用CPU消耗情況
2)中等規格狀態下的應用CPU消耗情況
3)滿規格狀態下的應用CPU消耗情況
4)應用CPU峰值情況
2、CPU數據獲取:
1)adb shell dumpsys cpuinfo | grep packagename
2)top命令 adb shell top -m 10 -s cpu
#查看占用cpu最高的前10個程序(-t 顯示進程名稱,-s 按指定行排序,-n 在退出前刷新幾次,-d 刷新間隔,-m 顯示最大數量) adb shell top | grep PackageName > /address/cpu.txt
說明:
VSS – Virtual Set Size 虛擬耗用內存(包含共享庫占用的內存)
RSS – Resident Set Size 實際使用物理內存(包含共享庫占用的內存)
PSS – Proportional Set Size 實際使用的物理內存(比例分配共享庫占用的內存)
USS – Unique Set Size 進程獨自占用的物理內存(不包含共享庫占用的內存) USS 是針對某個進程開始有可疑內存泄露的情況,
是一個程序啟動了會產生的虛擬內存,一旦這個程序進程殺掉就會釋放
三、流量篇
1、概念:
中等負荷:應用正常操作
高負荷:應用極限操作
2、流量測試中的測試子項:
1)應用首次啟動流量值
2)應用后台連續運行 2 小時的流量值
3)應用高負荷運行的流量峰值
4)應用中等負荷運行時的流量均值
3、獲取流量數據:
1)tcpdump+wireshark
2)/proc/net/目錄下相關文件
cat /proc/net/dev 獲取系統的流量信息
3)查詢應用的pid: adb shell ps | grep tataufo #如:31002
通過PID獲取該應用的流量數據: adb shell cat /proc/31002/net/dev
(wlan0代表wifi上傳下載量標識, 單位是字節可以/1024換算成KB, 打開手機飛行模式再關掉就可以將wlan0中的值初始化0)
4)查詢應用的pid: adb shell ps | grep tataufo #如:31002
通過PID獲取UID:adb shell cat /proc//status
通過UID獲取:adb shell cat /proc/net/xt_qtaguid/stats | grep 31002
5)通過adb shell dumpsys package來獲取應用的uid信息,然后在未操作應用之前,通過查看 :
adb shell cat /proc/uid_stat/uid/tcp_rcv
adb shell cat /proc/uid_stat/uid/tcp_snd
獲取到應用的起始的接收及發送的流量,然后我們再操作應用,再次通過上述2條命令可以獲取到應用的結束的接收及發送的流量,通過相減及得到應用的整體流量消耗
6)Android代碼:Android的TrafficStats類
四、功耗篇
1、功耗測試中的測試子項:
1)手機安裝目標APK前后待機功耗無明顯差異
2)常見使用場景中能夠正常進入待機,待機電流在正常范圍內
3)長時間連續使用應用無異常耗電現象
2、功耗測試方法:
方法一:軟件
1)采用市場上提供的第三方工具,如金山電池管家之類的。
2)就是自寫工具進行,這里一般會使用3種方法:
(1)基於android提供的PowerManager.WakeLock來進行
(2)比較復雜一點,功耗的計算=CPU消耗+Wake lock消耗+數據傳輸消耗+GPS消耗+Wi-Fi連接消耗
(3)通過 adb shell dumpsys battery來獲取
3、battery-historian(google開源工具)
方法二:硬件
一般使用萬用表或者功耗儀安捷倫進行測試,使用功耗儀測試的時候,需要制作假電池來進行的,有些不能拔插電池的手機還需要焊接才能進行功耗測試
五、GPU篇
1、概念
過度繪制: 界面顯示的activity套接了多層而導致
幀率:屏幕滑動幀速率
幀方差: 屏幕滑動平滑度
**FPS:**Frames Per Second 每秒顯示的幀數 根據人眼的生理結構,幀率高於24時就被認為是連貫的。對於游戲畫面30fps是最低能接受的,
60fps逼真感,如果幀率高於屏幕刷新頻率就是浪費。要達到30fps,每幀所占用的時間要小於33毫秒
2、GPU測試中的測試子項:
1)界面過度繪制
2)屏幕滑動幀速率
3)屏幕滑動平滑度
3、過度繪制測試:(人工進行測試)
打開開發者選項中的顯示GPU過度繪制(Debug GPU overdraw)
驗收的標准:
1)不允許出現黑色像素
2)不允許存在4x過度繪制
3)不允許存在面積超過屏幕1/4區域的3x過度繪制(淡紅色區域)
4、屏幕滑動幀速率測試:
方法一:
1)手機端打開開發者選項中的啟用跟蹤后勾選Graphics和View
2)啟動SDK工具Systrace,勾選被測應用,點擊Systrace,在彈出的對話框中設置持續抓取時間,在trace taps下面勾選gfx及view選項
3)手工滑動界面可以通過節拍來進行滑動或者掃動,幀率數據會保存到默認路徑下,默認名稱為trace.html
4)將trace.html文件拷貝到linux系統下通過命令進行轉換,生成trace.csv文件
grep 'postFramebuffer' trace.html | sed -e 's/.]\W//g' -e 's/:.*$//g' -e 's/.//g' > trace.csv
5)用excel打開文件計算得到幀率
方法二:
硬件的方法,打開高速相機,開啟攝像模式,錄制手工滑動或者掃動被測應用的視頻,再通過人工或者程序數幀的方法對結果進行計算得到幀率
5、屏幕滑動平滑度的測試:
方法如同幀率測試,唯一的差異就是最后的結果計算公式的差異
6、捕獲app幀率(android流暢度FPS測試):
1)打開手機開發者選項,勾選GPU顯示配置文件(系統會記錄保留每個界面最后128幀圖像繪制的相關時間信息)
2)adb shell dumpsys gfxinfo com.xxx.xxx > zinfo.txt
3)結果數據分析
Profile data in ms部分:
Draw: 創建顯示列表的時間(DisplayList),所有View對象OnDraw方法占用的時間
Process: Android 2D渲染引擎執行顯示列表所花的時間,View越多時間越長
Execute:將一幀圖像交給合成器(compsitor)的時間,較小
7、其他工具:
GameBench 測試android app的FPS工具
Gfxinfo 查看app繪制性能工具
六、響應時間篇
1、理解:
1)從單擊事件觸發到容器啟動NativeAPP消耗的時間(埋點)
2)NativeAPP完整啟動消耗的時間(可以通過system.log獲取)
3)Native調用RPC請求方法的延遲時間(埋點)
4)RPC請求發出去過程中的具體數據(req_size req_header req_time等,通過埋點獲取)
5)RPC請求返回的具體數據(res_size res_header res_time等,通過埋點獲取)
6)本地解析返回數據所消耗的時間(埋點或者TraceView工具可獲取)
7)界面渲染的時間(可以通過慢速攝像機或者埋點獲取)
2、android app啟動時間測試
(安卓Activity啟動過程性能剖視: http://www.rudy-yuan.net/archives/59/)
3、應用的啟動時間的測試,分為三類:
1)首次啟動 --應用首次啟動所花費的時間
2)非首次啟動 --應用非首次啟動所花費的時間
3)應用界面切換--應用界面內切換所花費的時間
4、應用啟動時間數據獲取:
1)adb logcat > /address/logcat.txt
#所有activity打印的日志 find “Displayed” /address/logcat.txt > /newaddress/fl.txt
#通過日志過濾關鍵字Displayed來過濾 find “ActivityName” /newaddress/fl.txt > /newaddress/last.txt
#通過activity名來過濾獲取所測應用
通過計算activity最后剩余的時間之和即可
2)硬件測試, 使用高速相機或者手機采用錄像的方法把應用啟動過程給錄制下來,然后通過人工數幀或者程序數幀的方式計算啟動時間
七、弱網測試
1、測試方法:
1)使用真實的SIM卡、運營商網絡來進行測試(移動無線測試中存在一些特別的BUG必須在特定的真實的運營商網絡下才會發現)
2)通過代理的方式模擬弱網環境進行測試(charles 硬延遲)
3)連接模擬弱網的熱點進行測試
2、熱點模擬方法:
1)通過設置iPhone的開發者模式之后共享熱點(硬延遲)
2)FaceBook開源的ATC(可使用樹莓派來搭建ACT環境)
3、用戶體驗需要做的:
1)在應用中統一弱網加載的界面樣式、動畫效果、菊花icon等
2)統一網絡錯誤、服務端錯誤、超時等展現給用戶的界面和提示語句
3)定義清楚在每個中間過程是的用戶交互行為
注:本文轉自:https://www.zybuluo.com/defias/note/592309