標籤:
寫在前面:
測試一道,博主接觸的也是皮毛而已,沒有接觸過rom的測試,下邊所說的都是博主接觸過的app的效能測試。我只談方法,少提概念。各位大神不喜勿噴。
概述
除啟動時間外,我們應該做的測試,可能需要在幾種狀態下來驗證app的效能情況。具體的業務形態也可能會更加的複雜,請根據具體的業務來決定需要做什麼樣的測試。
1、app空閑狀態。
2、app正常使用狀態。
3、app壓力狀態下(正常快速控制項目)的狀態。
4、monkey(隨機無須)操作狀態下的效能情況。
1、啟動時間
啟動時間一般我們會測試三種情況。
·初次開機
·非初次開機
·activity 切換所消耗的時間
測試方法一般使用兩種:
1)、程式內部打點到logcat,手動操作後擷取log日誌,來擷取相應的時間。
2)、使用adb 命令來操作,在操作的前後分別記錄消耗的時間。(由於adb 操作可能會有延時等可能,此方法並不是很準確)
ps. 還有一種方式是採用告訴攝像機的方式來做,由於本人沒有接觸過,不做過多說明,感興趣的可以自己查一查怎麼來做。
2、cpu和記憶體
1)、擷取cpu資料
adb shell dumpsys cpuinfo | grep $package_name
輸出格式為;
45% TOTAL: 18% user + 20% kernel + 6.2% iowait + 0.2% softirq
可取total得值作為整體cpu利用率。
2)、擷取記憶體資料
adb shell dumpsys meminfo | grep $package_name或者adb shell dumpsys meminfo $package_name
直接dumpsys meminfo $package_name 可以看到比較完整的堆,線程,java等層級的記憶體資料,pss 可以作為記憶體的參考。
3)、使用top 同時擷取cpu和記憶體,-d 參數指定採樣資料的間隔時間。
adb shell top -d 2
輸出:
PID PR CPU% S #THR VSS RSS PCY UID Name
名詞解釋:
- VSS- Virtual Set Size 虛擬耗用記憶體(包含共用庫佔用的記憶體)
- RSS- Resident Set Size 實際使用實體記憶體(包含共用庫佔用的記憶體)
- PSS- Proportional Set Size 實際使用的實體記憶體(比例分配共用庫佔用的記憶體)
- USS- Unique Set Size 進程獨自佔用的實體記憶體(不包含共用庫佔用的記憶體)
一般來說記憶體佔用大小有如下規律:VSS >= RSS >= PSS >= USS
可以看到,top 命令取出的記憶體對應是vss 和 rss,其中rss會比pss稍大,如果沒有特別嚴格的要求,只是對比記憶體是否泄漏上漲等問題,rss也可以作為參考。
3、流量
1)、通過tcpdump抓包,然後wireshark 解包資訊,來擷取流量資料。
2)、通過adb 命令來擷取,先擷取應用的pid,然後通過/proc/uid_stat/uid/下的檔案來讀取流量值。此方式會有rom相容性問題,並不是所有的檔案都可以找到這兩個檔案。
adb shell dumpsys $package_nameadb shell cat /proc/uid_stat/uid/tcp_rcv -- 下載流量adb shell cat /proc/uid_stat/uid/tcp_snd -- 上傳流量
由於tcp_rcv, tcp_snd 的值是一個累加的值,想要擷取兩次操作間消耗的流量,可以在操作前和操作後分別擷取,差值即為期間消耗的流量。也可以每個一段時間做採樣,來擷取整個過程中的使用方式。
4、幀率
幀率一定程度上反應的是app在使用中的流暢程度,理想情況是每秒60幀。
1)、在開發人員選項中有個“ GPU呈現模式分析(Profile GPU rendering,計算adb shell dumpsys gfxinfo中的呈現時間)”功能,在開啟這個功能後,系統就會記錄保留每個介面最後128幀映像繪製的相關時間資訊。在開啟這個功能後,重新啟動APP,滑動頁面然後執行adb命令。
adb shell dumpsys gfxinfo $package_name
輸出結果中包含這部分資料
Draw Process Execute1.30 1.25 0.53
0.63 0.62 1.64
0.24 0.51 0.44
0.25 1.76 0.40
0.25 1.55 0.43
0.25 0.53 0.37
0.49 1.51 2.12
Draw: 表示在Java中建立顯示列表部分中,OnDraw()方法佔用的時間。
Process:表示渲染引擎執行顯示列表所花的時間,view越多,時間就越長。
Execute:表示把一幀資料發送到螢幕上排版顯示實際花費的時間。其實是實際顯示幀資料的後台緩衝區與前端緩衝區交換後並將前端緩衝區的內容顯示到螢幕上的時間。
Draw + Process + Execute = 完整顯示一幀 ,這個時間要小於16ms才能儲存每秒60幀。
2)、通過SurfaceFlinger, 這種方式還沒有研究過,過段時間再來補充
adb shell dumpsys SurfaceFlinger
5、電量
對於電量的測試沒有什麼特別好的方式,可以選擇使用物理裝置來測試電池的電量情況。
對於android 5.0 以上的系統,adb命令可以支援擷取電量資訊。
adb shell dumpsys battery
輸出內容如下:
AC powered: false USB powered: true Wireless powered: false status: 1 #電池狀態:2:充電狀態 ,其他數字為非充電狀態 health: 2 present: true level: 55 #電量: 百分比 scale: 100 voltage: 3977 current now: -335232 temperature: 335 #電池狀態 technology: Li-poly
如果是採用usb串連手機的話,(手機其實一直是處於充電的狀態),這樣測試出來的資料也不會很準確。
如果各位有什麼好辦法的話,大家可以一起探討一下。
Android 效能測試