關(guān)于App UI性能的測試,Android提供了一個原生的工具Systrace,正常渲染FPS一般是在60左右亡哄,但是如果有一些代碼寫的不好,可能會影響到UI的性能布疙,導(dǎo)致界面卡頓蚊惯,這種問題是最難查的,為什么會卡頓灵临,在哪卡頓拣挪,當(dāng)然你也可以打log看時間,但是畢竟不方便俱诸。Systrace是可以解決這個問題的,我在網(wǎng)上查了一下關(guān)于Systrace的資料赊舶,還是比較少的睁搭,也許用的人也少吧赶诊。所以本文大部分內(nèi)容翻譯自谷歌官方文檔
準(zhǔn)備工作
首先如果你要運行Systrace,需要安裝Python和Android SDK Tools 20 以上的版本园骆。
同時舔痪,現(xiàn)在Systrace只支持Android4.1以上的版本。
開始記錄
關(guān)于記錄有兩種方式開啟锌唾,一種就是使用Python锄码,另外一種就是使用AndroidStudio中的自帶插件。
這里有一個問題晌涕,我不確認(rèn)滋捶,是否使用AndroidStudio中的自帶插件也需要安裝Python,因為我的電腦一直安裝著這些東西余黎,所以重窟,可以直接運行。
Python 啟動
首先命令行切換到Android SDK的platform-tools下惧财,在這個文件夾下有一個systrace文件夾巡扇,然后切到這個文件夾下:
在這個文件夾下有一個python腳本,運行即可垮衷。
python systrace.py --time=10 -o mynewtrace.html sched gfx view wm
運行規(guī)則如下:
參數(shù)名 | 意義 |
---|---|
-h,--help | 幫助信息 |
-o <FILE> | 保存的文件名 |
-t N,--time=N | 多少秒內(nèi)的數(shù)據(jù)厅翔,默認(rèn)為5秒,以當(dāng)前時間點往后倒N個時間 |
-b N,--buf-size=N | 單位為千字節(jié),限制數(shù)據(jù)大小 |
-k <KFUNCS> --ktrace=<KFUNCS> | 追蹤特殊的方法 |
-l,--list-categories | 設(shè)置追蹤的標(biāo)簽 |
-a <APP_NAME>,--app=<APP_NAME> | 包名 |
--from-file=<FROM_FILE> | 創(chuàng)建報告的來源trace文件 |
-e <DEVICE_SERIAL>,--serial=<DEVICE_SERIAL> | 設(shè)備號 |
標(biāo)簽簡寫:
簡寫 | 全稱 |
---|---|
gfx | - Graphics |
input | - Input |
view | - View |
webview | - WebView |
wm | - Window Manager |
am | - Activity Manager |
sync | - Synchronization Manager |
audio | - Audio |
video | - Video |
camera | - Camera |
根據(jù)官方文檔的意思搀突,這些標(biāo)簽在SDK 17以下需要使用
--set-tags = <TAGS>
進(jìn)行添加刀闷,SDK18以及更高直接用簡寫即可,這個標(biāo)簽表示生成性能分析結(jié)果中的標(biāo)簽描姚,這個后面再看涩赢。
Android Studio啟動
打開Android Studio:
點擊如圖所示的標(biāo)簽,打開Android Device Monitor這個界面轩勘,在左上角選擇如下按鈕:
然后進(jìn)入可視化設(shè)置界面:
進(jìn)行設(shè)置筒扒,點擊ok,便可開始記錄绊寻。
數(shù)據(jù)分析
我這里將會使用命令行模式進(jìn)行數(shù)據(jù)記錄花墩。
在記錄之前,我先寫了一個簡單的demo澄步,demo有三個Activity冰蘑,一個主界面,一個放有l(wèi)istview的Activity村缸,一個放有RecyclerView的Activity(代碼很基礎(chǔ)我就不貼出來了)
在listview中我加入了1000個Item祠肥,每個item中都有文字和圖片,RecyclerView也是梯皿。特別注意仇箱,listview沒有做任何優(yōu)化县恕,因為我們要看的就是不好的效果。我先運行一下程序剂桥,然后在命令行中輸入如下:
python systrace.py --time=20 -o deep.html -a deep.testsystrace sched gfx view wm
我記錄了20秒內(nèi)的情況忠烛,指定包名deep.testsystrace,生成文件deep.html权逗,運行美尸,然后不斷滑動listview:
直到記錄結(jié)束,命令行會有如下提示:
然后我們打開這個文件夾斟薇,找到剛才生成的deep.html师坎。
打開這個網(wǎng)頁:
在分析這些數(shù)據(jù)之前,我們需要先知道一些操作:
Key | Description |
---|---|
w | Zoom into the trace timeline. |
s | Zoom out of the trace timeline. |
a | Pan left on the trace timeline. |
d | Pan right on the trace timeline. |
e | Center the trace timeline on the current mouse location. |
g | Show grid at the start of the currently selected task. |
Shift+g | Show grid at the end of the currently selected task. |
Right Arrow | Select the next event on the currently selected timeline. |
Left Arrow | Select the previous event on the currently selected timeline. |
我們在網(wǎng)頁中找到我們的工程奔垦,deep.testsystrace,但是不知道是不是bug屹耐,網(wǎng)頁只顯示了ep.testsystrace,不過根據(jù)pid也可以確認(rèn)就是我們的應(yīng)用椿猎。
之后我們逐個分析惶岭,首先是Frames,即幀數(shù)犯眠。我們將上圖放大(快捷鍵w):
可以看到幀數(shù)對應(yīng)的一行有許多F按灶,各種顏色:
當(dāng)顯示為綠色的時候為正常,紅色或者黃色分別對應(yīng)的等級是e和w筐咧,也就是不正常鸯旁,即達(dá)不到60fps的水準(zhǔn)。這是我們就可以根據(jù)下面的時間分析到底是什么占用的時間了量蕊。
首先點擊紅色即不正常的F:
與該幀無關(guān)的操作會被置成灰色:
然后將其逐漸放大:
對比正常的幀铺罢,我們可以發(fā)現(xiàn),我們obtainView和inflate調(diào)用過多残炮。我們之前說了韭赘,listview我們沒有做任何優(yōu)化,每次都會重現(xiàn)建立view势就,也沒有使用viewholder泉瞻,所以會出現(xiàn)如上結(jié)果。如果我們對listview進(jìn)行了優(yōu)化呢苞冯?我們可以試一下袖牙,修改一下adapter的getview,當(dāng)view為空時再進(jìn)行創(chuàng)建舅锄。然后再次記錄數(shù)據(jù):
我們發(fā)現(xiàn)已經(jīng)沒有紅色的F了鞭达,但是仍有少數(shù)黃色的F,我們可以根據(jù)分析再次進(jìn)行優(yōu)化,加上ViewHolder碉怔。這里不再做測試了烘贴。
同樣我們也可以根據(jù)Alert中的提示進(jìn)行修改,但是感覺提示不能直指原因撮胧,還是分析幀數(shù),更容易找到原因老翘。
自定義記錄
我們還可以通過Trace.beginSection來記錄一些信息芹啥,如下代碼:
Trace.beginSection() 與 Trace.endSection() 之間代碼工作會一直被追蹤。結(jié)果如下铺峭,為了查看方便我把結(jié)果放大了:
可以以這種方式查看某個程序塊的耗時墓怀。
總結(jié)
用這種方式可以分析出app 卡頓的一些問題的原因,從而進(jìn)行解決卫键。對于app開發(fā)人員傀履,還是掌握較好。
更多的開發(fā)知識莉炉,可以關(guān)注我的公眾號: