基于Method Trace工具解決UI卡頓的問題

??????? 很久以前就看過使用Android studio的Method Trace工具調(diào)查函數(shù)性能或者效率的問題妹蔽,一直沒有在解決日常問題過程中實戰(zhàn)過殃恒。最近剛好遇到了一個關(guān)閉wifi開關(guān)時wifi設(shè)置頁面卡頓的問題劣欢,所以就想著嘗試一下。雖然解決UI卡頓一般都用systrace工具,但是method trace可以查看各個線程中某個函數(shù)執(zhí)行情況,理論上也是可以用來定位UI卡頓問題的爽冕。

首先啟動method trace功能,然后關(guān)閉wifi披蕉,待卡頓過后颈畸,停止trace。Android studio會自動打開抓取的內(nèi)容没讲。?

雖然Eclipse通過ddms抓取的traceview也是可以查看函數(shù)調(diào)用情況眯娱,但是Adroid studio的method trace功能更強大,尤其是可以分線程查看爬凑,這就更方便我們查找問題了徙缴。由于UI卡頓肯定是主線程被block了,必然我們要看這段時間內(nèi)主線程的執(zhí)行情況嘁信。選中上圖中的主線程于样,可以看到中間有個很長的長條,鼠標放上去之后吱抚,發(fā)現(xiàn)該函數(shù)執(zhí)行了約1.5s(注意起始時間百宇,與后面做對比時可以很方便確認多線程調(diào)用時函數(shù)執(zhí)行先后順序),那么可以確認秘豹,就是這個函數(shù)出的問題了携御。

定位到源碼中的copyAndNotifyListeners函數(shù),去掉其他邏輯后主邏輯如下

private void copyAndNotifyListeners(boolean notifyListeners) {

……1……

???? synchronized (mLock) {

??????? ……2……

??? }

……3……

}

直觀的懷疑是執(zhí)行完1處的邏輯之后既绕,主線程要去拿鎖啄刹,此時由于鎖被其他線程占用,所以主線程要一直等待凄贩。但是這只是我們的懷疑誓军,要找到證據(jù)才行。這又要體現(xiàn)出Method Trace工具的強大之處疲扎。圖中的每個小方格都代表了函數(shù)的執(zhí)行情況昵时,包括函數(shù)名、函數(shù)執(zhí)行時間以及各個函數(shù)之間的調(diào)用情況椒丧。原理上壹甥,如果邏輯2中有函數(shù)調(diào)用的話,必定能在圖中體現(xiàn)出來壶熏。把圖中卡頓地方前后位置放大之后句柠,發(fā)現(xiàn)卡頓之前確實在調(diào)用1處的函數(shù),而在卡頓之后恰好在調(diào)用2處的邏輯。這樣溯职,就為我們之前的假設(shè)找到了證據(jù)精盅。

既然主線程要取的鎖被占用,肯定是被其他線程占用著谜酒,具體是什么線程叹俏,可以通過圖中左上角查看每個線程的調(diào)用情況來確認。果然甚带,在某個線程中我們發(fā)現(xiàn)了與主線程類似的長條她肯。查看函數(shù)調(diào)用堆棧的情況佳头,確實在該函數(shù)中持有對應(yīng)的鎖鹰贵,且該鎖剛好是在主線程之前拿到的。這樣卡頓的原因就找到了康嘉。進一步分析碉输,該部分卡頓是由于子線程在持鎖期間調(diào)用了WifiManager的接口,而這個接口在向WifiManager取數(shù)據(jù)時采用的是同步調(diào)用亭珍,而WifiManager最終是向WifiStateMachine中取數(shù)據(jù)敷钾,WifiStateMachine線程此時正在忙碌調(diào)用driver中的接口,無法及時處理這個請求肄梨,因此這就是應(yīng)用層被卡住的原因阻荒。

雖然經(jīng)過上面的分析,問題是WifiStateMachine引起的众羡,但是一款優(yōu)秀的應(yīng)用侨赡,還是要首先檢查自己能否兼容這種場景,自己的邏輯是否也存在問題粱侣。深入分析之后發(fā)現(xiàn)羊壹,子線程確實存在持鎖范圍過大的問題,可以進行優(yōu)化齐婴,避免不必要的等待油猫。

補充問題

在解決上面問題時,對android源碼的@GuardedBy標記有些疑惑柠偶,這個標記有啥作用呢情妖?我直觀的以為這個可以當(dāng)成一把鎖來用,但這只是我的假設(shè)而已诱担,肯定要驗證一下才能踏實毡证。查閱了一些資料,感覺還是云里霧里该肴,所以還是自己做實驗看看把情竹。

寫了上面的測試代碼,編譯之后得到.class文件,通過javap -c Test.class后查看編譯后的代碼

從這個結(jié)果可以看出秦效,@GuardedBy標簽并沒有對編譯后的結(jié)果產(chǎn)生影響雏蛮,也就沒有同步作用。事實上該標簽和@Override標簽的功能是一致的阱州,更多的作用是一種標記挑秉,標記這個變量或者這個函數(shù)是需要同步的,同時編譯器在編譯時可以根據(jù)這些標簽做lint檢查之類的工作苔货。在日常工作中犀概,可以合理的使用這些標簽以增強代碼邏輯的可讀性,同時也方便其他同學(xué)閱讀此處邏輯時能更快的領(lǐng)會設(shè)計意圖夜惭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姻灶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子诈茧,更是在濱河造成了極大的恐慌产喉,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敢会,死亡現(xiàn)場離奇詭異曾沈,居然都是意外死亡,警方通過查閱死者的電腦和手機鸥昏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門塞俱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吏垮,你說我怎么就攤上這事障涯。” “怎么了惫皱?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵像樊,是天一觀的道長。 經(jīng)常有香客問我旅敷,道長生棍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任媳谁,我火速辦了婚禮涂滴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晴音。我一直安慰自己柔纵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布锤躁。 她就那樣靜靜地躺著搁料,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郭计,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天霸琴,我揣著相機與錄音,去河邊找鬼昭伸。 笑死梧乘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庐杨。 我是一名探鬼主播选调,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灵份!你這毒婦竟也來了仁堪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤各吨,失蹤者是張志新(化名)和其女友劉穎枝笨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揭蜒,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年剔桨,在試婚紗的時候發(fā)現(xiàn)自己被綠了屉更。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡洒缀,死狀恐怖瑰谜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情树绩,我是刑警寧澤萨脑,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站饺饭,受9級特大地震影響渤早,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘫俊,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一鹊杖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扛芽,春花似錦骂蓖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春被芳,著一層夾襖步出監(jiān)牢的瞬間银酬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工筐钟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揩瞪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓篓冲,卻偏偏與公主長得像李破,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子壹将,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,343評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理嗤攻,服務(wù)發(fā)現(xiàn),斷路器诽俯,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 1妇菱、2014年8月14號,研究生舍友陳給我打電話暴区,說無聊就給我打個電話闯团。我對她表達了有了愛情之后就忘了我的牢騷,說...
    janet閱讀 218評論 0 1
  • 先來個圖吧 大概的效果就是這樣,代碼就一個監(jiān)聽事件伐割,把需要移動的View添加這個監(jiān)聽事件就可以了候味,具體的參數(shù)要根據(jù)...
    隔壁老王的雜貨鋪閱讀 385評論 0 0
  • 典韋,東漢末年曹操部將隔心,相貌魁梧白群,力大過人,一對鐵戟硬霍,好不霸氣帜慢。本屬張邈,后歸曹操须尚。曹操征討呂布時被募為陷陣崖堤,表現(xiàn)...
    老爺子l閱讀 744評論 0 0