android app優(yōu)化工具之traceview

1.TraceView 是什么

TraceView 是AndroidSDK 中內(nèi)置的一個(gè)工具,它可以加載trace文件,用圖形的形式展示代碼的執(zhí)行時(shí)間、次數(shù)及調(diào)用棧,便于我們分析。

手機(jī)卡頓很多時(shí)候都是由于某個(gè)操作過(guò)于耗時(shí),在茫茫代碼中查找元兇未免太過(guò)痛苦,這時(shí)候就該體現(xiàn) TraceView 的價(jià)值了,通過(guò)traceview,可以知道時(shí)間都消耗在哪里了

生成 trace 文件有三種方法:

使用代碼

使用 Android Studio

使用 DDMS

這里我只分享下用DDMS生成

2、詳細(xì)操作步驟:

打開(kāi) Android Device Monitor,在 DDMS 中打開(kāi) trace 文件,DDMS 會(huì)啟動(dòng) TraceView 加載 trace 文件:


操作手機(jī)上出現(xiàn)問(wèn)題的地方



3、分析生成的數(shù)據(jù):

先分析上半部分


上半部分顯示了不同線程的執(zhí)行時(shí)間

每種顏色代表不同的函數(shù)和步驟,同一顏色的區(qū)域越大,就代表這個(gè)步驟運(yùn)行時(shí)間越長(zhǎng)

程序中每個(gè)線程調(diào)用方法的啟動(dòng)和停止時(shí)間

同一個(gè)顏色越長(zhǎng),說(shuō)明執(zhí)行時(shí)間越久,如圖中的主線程 main

空白表示這個(gè)時(shí)間段內(nèi)沒(méi)有執(zhí)行內(nèi)容

右上角顯示程序總共運(yùn)行了13400毫秒

縱軸

TraceView界面下方表格中縱軸就是每個(gè)方法,包括了JDK的,Android SDK的,也有native方法的,當(dāng)然最重要的就是app中你自己寫(xiě)的方法,有些Android系統(tǒng)的方法執(zhí)行時(shí)間很長(zhǎng),那么有很大的可能就是你app中調(diào)用這些方法過(guò)多導(dǎo)致的。

下半部分展示了不同方法的執(zhí)行時(shí)間信息,關(guān)鍵指標(biāo)有三個(gè):

Cpu Time/Call :該方法平均占用 CPU 的時(shí)間

Real Time/Call :平均執(zhí)行時(shí)間,包括切換、阻塞的時(shí)間,>= Cpu Time

Calls + Recur Calls/Total :調(diào)用、遞歸次數(shù)

每個(gè)方法前面都有一個(gè)數(shù)字,可能是全部方法按照Incl CPU Time 時(shí)間的排序序號(hào)(后面會(huì)講到)

點(diǎn)一個(gè)方法后可以看到有兩部分,一個(gè)是Parents,另一個(gè)是Children。

Parent表示調(diào)用這個(gè)方法的方法,可以叫做父方法

Children表示這個(gè)方法中調(diào)用的其他方法,可以叫做子方法

橫軸


inclusive:就是說(shuō)除統(tǒng)計(jì)函數(shù)本身運(yùn)行的時(shí)間外再加上調(diào)用子函數(shù)所運(yùn)行的時(shí)間

Exclusive:統(tǒng)計(jì)函數(shù)本身運(yùn)行的時(shí)間

1. Incl Cpu Time

Incl Cpu Time表示方法top執(zhí)行的總時(shí)間,假如說(shuō)方法top的執(zhí)行時(shí)間為10ms,方法a執(zhí)行了1ms,方法b執(zhí)行了2ms,方法c執(zhí)行了3ms,方法d執(zhí)行了4ms(這里是為了舉個(gè)栗子,實(shí)際情況中方法a、b、c、d的執(zhí)行總時(shí)間肯定比方法top的執(zhí)行總時(shí)間要小一點(diǎn))。

publicvoidtop()?{

a();

b();

c();

d();

}

2. Excl Cpu Time

理解了Incl Cpu Time以后就可以很好理解Excl Cpu Time了,還是上面top方法的栗子:

方法top 的 Incl Cpu Time 減去 方法a、b、c、d的Incl Cpu Time 的時(shí)間就是方法top的Excl Cpu Time 了

3. Incl Real Time

這個(gè)感覺(jué)和Incl Cpu Time 差不多,第7條會(huì)講到。

4. Excl Real Time

同上

5. Calls + Recur Calls / Total

這個(gè)指標(biāo)非常重要!

它表示這個(gè)方法執(zhí)行的次數(shù),這個(gè)指標(biāo)中有兩個(gè)值,一個(gè)Call表示這個(gè)方法調(diào)用的次數(shù),Recur Call表示遞歸調(diào)用次數(shù),看下圖:


我選中了一個(gè)方法,可以看到這個(gè)方法的Calls + Recur Calls值是1 + 17,表示這個(gè)方法調(diào)用了1次,遞歸調(diào)用17次

6. Cpu Time / Call

重點(diǎn)來(lái)了!!!!!!!!!!


這個(gè)指標(biāo)應(yīng)該說(shuō)是最重要的,從上圖可以看到,這個(gè)方法的調(diào)用次數(shù)為3次,而它的Incl Cpu Time為251.793ms,方法調(diào)用了3次,所以每一次的時(shí)間為83.913(也就是Cpu Time)

getView方法執(zhí)行時(shí)間很長(zhǎng),那么必然導(dǎo)致列表滑動(dòng)的時(shí)候產(chǎn)生卡頓現(xiàn)象,可以在getView方法的Children方法列表中找到耗時(shí)最長(zhǎng)的方法,分析出現(xiàn)問(wèn)題的原因:

是因?yàn)橛羞^(guò)多的計(jì)算?

還是因?yàn)橛凶x取SD卡的操作?

還是因?yàn)閍dapter中View太復(fù)雜了?

還是因?yàn)樾枰泻芏嗯袛啵O(shè)置View的顯示還是隱藏

還是因?yàn)槠渌颉?/p>

7. Real Time / Call

Real Time 和 Cpu Time 我現(xiàn)在還不太明白它們的區(qū)別,我的理解應(yīng)該是:

Cpu Time 應(yīng)該是某個(gè)方法占用CPU的時(shí)間

Real Time 應(yīng)該是這個(gè)方法的實(shí)際運(yùn)行時(shí)間

為什么它們會(huì)有區(qū)別呢?可能是因?yàn)镃PU的上下文切換、阻塞、GC等原因方法的實(shí)際執(zhí)行時(shí)間要比Cpu Time 要稍微長(zhǎng)一點(diǎn)。

下半部分展示了不同方法的執(zhí)行時(shí)間信息,關(guān)鍵指標(biāo)有三個(gè):

Cpu Time/Call :該方法平均占用 CPU 的時(shí)間

Real Time/Call :平均執(zhí)行時(shí)間,包括切換、阻塞的時(shí)間,>= Cpu Time

Calls + Recur Calls/Total :調(diào)用、遞歸次數(shù)

點(diǎn)擊下面的任意一個(gè)方法,可以看到它的詳細(xì)信息:

Parents:選中方法的調(diào)用處

Children:選中方法調(diào)用的方法

根據(jù) TraceView 顯示內(nèi)容定位問(wèn)題

定位問(wèn)題時(shí) TraceView 的使用方式:

從上半部分查看哪些線程執(zhí)行時(shí)間長(zhǎng)?什么時(shí)候開(kāi)始執(zhí)行?與主線程交錯(cuò)時(shí)間?

哪些方法的執(zhí)行需要花費(fèi)很長(zhǎng)時(shí)間

點(diǎn)擊 TraceView 中的 Cpu Time/Call,按照占用 CPU 時(shí)間從高到低排序

哪些方法調(diào)用次數(shù)非常頻繁

點(diǎn)擊 TraceView 中的 Calls + Recur Calls/Total ,按照調(diào)用次數(shù)從高到底排序

排序后,然后逐個(gè)排查是否有項(xiàng)目代碼或者依賴庫(kù)代碼,有的話點(diǎn)擊查看詳情,查看是這個(gè)方法還是調(diào)用的子方法的問(wèn)題,進(jìn)一步定位問(wèn)題。


實(shí)例:


可以看到項(xiàng)目中我們寫(xiě)的方法的耗時(shí),可以點(diǎn)進(jìn)去,看child,查找時(shí)間消耗去向

1)

經(jīng)由上圖可以發(fā)現(xiàn),HouseListTask的doInBackground方法的時(shí)間消耗在UtilsLog和解析上了

2)GetHouseTrueCountAsynTask的doInBackground方法的時(shí)間消耗在了HttpClient.execute上了

GetHouseTrueCountAsynTask的onPostExcute方法的時(shí)間消耗在cacheToDisk這個(gè)方法上

3)getview方法時(shí)間消耗在inflate方法上了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,577評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,514評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,234評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,621評(píng)論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,822評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,128評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,319評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,548評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,970評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,229評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,048評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,285評(píng)論 2 376

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