更多技術文章

玩遊戲的時候最怕的就是卡頓。排位賽的緊急關頭,明明馬上就能上一段位,卻因為卡頓導緻給對方送人頭。還把對手送上了王者。引起隊友罵聲一片。作為測試工程師的你,可以忍?
卡頓測試也是專項測試裡的一種,更多精彩測試内容,可下方關注公衆号
Android系統每隔16ms會發出VSYNC信号重繪我們的界面(Activity)。App需要在16ms内完成下一次要重新整理的界面的相關運算,以便界面重新整理更新,如果無法在16ms内完成運算,就會發生卡頓,影響使用者體驗。
下面的這些内容可能會造成卡頓:
記憶體問題:記憶體抖動、full gc
cpu:計算耗時
gpu:布局複雜、overdraw
就是執行GC操作時,需要暫停線程的任何操作,GC操作完成,其他操作才能繼續,頻繁的GC會導緻界面卡頓,頻繁GC有兩個原因:
記憶體抖動(Memory Churn),建立大量的對象,在短時間内馬上釋放。
産生大量對象會占用Young Generation的記憶體區域, 如果剩餘空間不足,就會觸發GC。同時,大量對象的疊加也會增加Heap的壓力,進而觸發更多的GC操作。
UI渲染由CPU和GPU分工完成,CPU負責布局元素的運算(比如Measure, Layout)。GPU負責栅格化處理(将UI元素繪制到螢幕上)。
UI布局層次太深, 或者自定義控件的onDraw函數中存在複雜運算, 就需要CPU負荷工作,進而影響整個繪制過程。
過度繪制會導緻gpu負荷,每屏的每一幀,像素點應該隻被繪制一次,如果重複繪制像素點,就是過度繪制。
Android可以檢視過度繪制:“設定”→“開發者選項”→“調試GPU過度繪制(toggle GPU overdraw)”,打開後再通路App會出現下圖:
此時界面可能會有五種顔色辨別:
原色:沒有overdraw
藍色:1次overdraw
綠色:2次overdraw
粉色:3次overdraw
紅色:4次及4次以上的overdraw
卡頓的關鍵因素是無法在16ms内繪制一幀,sdk自帶的systrace工具可以分析每一幀的繪制情況,并且給出補救措施和建議。
需要安裝sdk,在sdk目錄下存在systrace.py:
python{sdk目錄}/platform-tools/systrace
1
2
注意:運作此工具需要python2.7。
如果運作中出現如下錯誤,安裝對應的依賴即可:
No module win32con
pip2 install pypiwin32
No module six
pip2 install six
1
2
3
4
5
首先連接配接一個Android裝置:192.168.181.102:5555
在指令行輸入:
python systrace.py -e 192.168.181.102:5555
1
2
在裝置上進行操作在指令行:按下enter,完成錄制。此時會生成一份html報告,整個過程如下:
點選生成的html報告:
參數解析:
1.幀點:綠色表示16.6ms内,黃、紅色超過16.6ms
2.任務狀态灰:休眠;藍色:可運作;綠色:運作;橙色:不響應信号
3.函數調用
在報告的頁面有快捷鍵操作:
w:放大
s:縮小
m:找到下一幀,顯示時間
如果一個幀的繪制時間超過0.7s,使用者會明顯感覺到卡頓,稱之為冰凍幀,比如上面紅色的幀點。如果幀的繪制時間剛好超過0.6ms,稱之為掉幀,比如上面黃色的幀點,但部分掉幀影響不大,主要危險來自于冰凍幀。