《AndroidPerformanceMonitor》一個檢測UI線程處理每個message時間的工具夜畴,并分析其局限性

感覺這是一個很有意思的工具,可以檢測UI線程處理每個message時間删壮。如果時間長了贪绘,那么就發(fā)個通知,通知開發(fā)者哪里可能存在問題央碟。原理并不難税灌,不過作者能想出來這種方法來檢測手機app的一些性能問題,還是挺有心的亿虽,應該給作者點個贊菱涤。

開源庫的地址是 戳這里

哪些卡頓檢查不出來

首先說下這個工具只能檢測一些性能問題÷迕悖卡頓的問題不只是因為message的執(zhí)行時間過長粘秆。比如:界面的渲染是在Render Thread線程。主線程會把view#draw()方法的指令解析成GPU能讀懂的指令收毫,然后傳給Render Thread線程攻走。 GPU再根據(jù)這些指令進行渲染。繪制是一個很復雜的過程此再。雖然有了Render Thread線程來做渲染工作昔搂,大部分時間Render Thread 和主線程是并發(fā)進行的,但是還是會有一個點 兩個線程是互相依賴的输拇。他們需要相互等待來交換數(shù)據(jù)摘符,以便將數(shù)據(jù)寫入到 back buffer中。back buffer是從SurfaceFlinger 服務的buffer隊列請求來的。當把渲染的數(shù)據(jù)寫到back buffer后逛裤,會返回給SurfaceFlinger 服務的buffer隊列蠢古。SurfaceFlinger會根據(jù)硬件屏幕刷新時鐘Async來把buffer(這里叫frame buffer)給到android系統(tǒng)中進行屏幕展示。這里的要展示的frame buffer來自于back buffer别凹。所以如果繪制不及時(>16ms), back buffer在16ms內沒有裝載完畢。那么SurfaceFlinger只能把之前的back buffer當成frame buffer提交給屏幕進程呈現(xiàn)洽糟。因此卡頓就產生了炉菲。

因此,繪制不及時有很多種坤溃。比如上面說的Render Thread線程繪制了一個很復雜的view(比如給view添加蒙層拍霜,就會導致繪制的復雜),因為主線程與Render Thread線程存在依賴薪介,那么主線程需要等待祠饺,導致back buffer不能完成,進而產生卡頓汁政。這時候UI線程中處理msg的時間并不長道偷,只是一直在block等待。這種卡頓AndroidPerformanceMonitor并不能處理记劈。

原理分析

原理就不貼代碼了勺鸦,幾句話就能說完。貼代碼反而影響問題的闡述目木。
我們知道换途,主線程的Looper工作在一個for循環(huán)中,每次從隊列中拿到一個meesage進行處理刽射。在處理每一個message時军拟,在開始處理,到處理完成都會使用Printer來打印一些東西誓禁。開始時打有赶ⅰ:
'' logging.println(">>>>> Dispatching to " + msg.target + " " +
'' msg.callback + ": " + msg.what);

結束時打印:
'' logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);

這個Printer是Looper的mLogging成員變量现横,我們可以設置漓拾。原理就在這里。我們可以設置一個自定義的Printer戒祠。重寫Printer的println(String)方法骇两。在重寫的println(String)方法中判斷,如果參數(shù)string中包含“Dispatching to”姜盈,那么就往HandleThread線程的隊列中添加一個延時300ms的runnable低千,runnable中處理卡頓信息的邏輯。如果判斷參數(shù)string中包含“Finished“,那么如果HandleThread線程的隊列 中的runnable還在示血,就清除這個runnable棋傍。即,說明這個message執(zhí)行完還不到300ms难审,那么就認為處理這個message沒有發(fā)生卡頓瘫拣。當然如果打印”Finished“時,與”Dispatching“的時間差已經大于了300ms告喊,那么runnable便已經執(zhí)行了處理卡頓信息的邏輯麸拄。

大致原理就是這樣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末黔姜,一起剝皮案震驚了整個濱河市拢切,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秆吵,老刑警劉巖淮椰,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纳寂,居然都是意外死亡主穗,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門毙芜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黔牵,“玉大人,你說我怎么就攤上這事爷肝』郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵灯抛,是天一觀的道長金赦。 經常有香客問我,道長对嚼,這世上最難降的妖魔是什么夹抗? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮纵竖,結果婚禮上漠烧,老公的妹妹穿的比我還像新娘。我一直安慰自己靡砌,他們只是感情好已脓,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著通殃,像睡著了一般度液。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天堕担,我揣著相機與錄音已慢,去河邊找鬼。 笑死霹购,一個胖子當著我的面吹牛佑惠,可吹牛的內容都是我干的。 我是一名探鬼主播齐疙,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼兢仰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剂碴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轻专,失蹤者是張志新(化名)和其女友劉穎忆矛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體请垛,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡催训,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了宗收。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漫拭。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖混稽,靈堂內的尸體忽然破棺而出采驻,到底是詐尸還是另有隱情,我是刑警寧澤匈勋,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布礼旅,位于F島的核電站,受9級特大地震影響洽洁,放射性物質發(fā)生泄漏痘系。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一饿自、第九天 我趴在偏房一處隱蔽的房頂上張望汰翠。 院中可真熱鬧,春花似錦昭雌、人聲如沸复唤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苟穆。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雳旅,已是汗流浹背跟磨。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留攒盈,地道東北人抵拘。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像型豁,于是被迫代替她去往敵國和親僵蛛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容