Android UI性能的探雷針——Systrace

關(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)注我的公眾號:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钓账,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子絮宁,更是在濱河造成了極大的恐慌梆暮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍昂,死亡現(xiàn)場離奇詭異啦粹,居然都是意外死亡,警方通過查閱死者的電腦和手機窘游,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門唠椭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忍饰,你說我怎么就攤上這事贪嫂。” “怎么了喘批?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵撩荣,是天一觀的道長。 經(jīng)常有香客問我饶深,道長餐曹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任敌厘,我火速辦了婚禮台猴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己饱狂,他們只是感情好曹步,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著休讳,像睡著了一般讲婚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俊柔,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天筹麸,我揣著相機與錄音,去河邊找鬼雏婶。 笑死物赶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的留晚。 我是一名探鬼主播酵紫,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼错维!你這毒婦竟也來了奖地?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤需五,失蹤者是張志新(化名)和其女友劉穎鹉动,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏邮,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泽示,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜜氨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片械筛。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖飒炎,靈堂內(nèi)的尸體忽然破棺而出埋哟,到底是詐尸還是另有隱情,我是刑警寧澤郎汪,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布赤赊,位于F島的核電站,受9級特大地震影響煞赢,放射性物質(zhì)發(fā)生泄漏抛计。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一照筑、第九天 我趴在偏房一處隱蔽的房頂上張望吹截。 院中可真熱鬧瘦陈,春花似錦、人聲如沸波俄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懦铺。三九已至捉貌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冬念,已是汗流浹背昏翰。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刘急,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓浸踩,卻偏偏與公主長得像叔汁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子检碗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容