BlockCanary的監(jiān)控流程分析

原理概述

Android系統(tǒng)中的消息機(jī)制是依靠Looper不斷從MessageQueue中取出Message進(jìn)行處理,卡頓的直接原因是處理Message的時(shí)間過(guò)長(zhǎng)张肾,所以監(jiān)控卡頓主要是監(jiān)控Message的處理時(shí)長(zhǎng)饮笛。

BlockCanary通過(guò)重設(shè)Looper中的Printer對(duì)象來(lái)記錄Message的處理時(shí)長(zhǎng),當(dāng)時(shí)長(zhǎng)超過(guò)閥值時(shí)即發(fā)生卡頓,獲取此時(shí)的棧和CPU信息供排查原因棺牧。

使用

    //依賴
    debugImplementation 'com.github.markzhai:blockcanary-android:1.5.0'
    releaseImplementation 'com.github.markzhai:blockcanary-no-op:1.5.0'

    //初始化
    BlockCanary.install(this, new BlockCanaryContext()).start();

初始化

BlockCanary

BlockCanary的參數(shù)設(shè)置在BlockCanaryContext類(lèi)中,通過(guò)繼承可以修改配置

監(jiān)控

初始化拿到BlockCanary單例后便開(kāi)始監(jiān)控

BlockCanary

向MainLooper中設(shè)置Printer

Looper
Looper.loop

Looper在消息處理的過(guò)程中會(huì)通過(guò)Printer打印日志沮翔,BlockCanary正是利用了這一點(diǎn)來(lái)測(cè)量處理Message所耗的時(shí)長(zhǎng)

Printer對(duì)象的初始化在BlockCanaryInternals單例中

BlockCanaryInternals

Looper通過(guò)調(diào)用Printer的println來(lái)打印日志陨帆,BlockCanary的監(jiān)控必須放在此方法內(nèi)

LooperMonitor

當(dāng)Message處理的時(shí)間超過(guò)閥值會(huì)回調(diào)onBlockEvent

棧、CPU信息

識(shí)別出了卡頓采蚀,接下來(lái)就是分析卡頓產(chǎn)生的原因

LooperMonitor

Message在每次處理時(shí)疲牵,都會(huì)記錄棧、CPU信息

AbstractSampler

StackSampler繼承自AbstractSampler榆鼠,在AbstractSampler內(nèi)部通過(guò)HandlerThread新啟線程纲爸,利用Handler的postDelayed方法循環(huán)取樣

StackSampler

取樣信息存在LinkedHashMap中

CPU

CpuSampler

與StackSampler代碼邏輯類(lèi)似,只不過(guò)信息的來(lái)源不同了妆够。CpuSampler的信息是通過(guò)讀取系統(tǒng)log文件的形式獲取的识啦,通過(guò)解析獲取想要的信息組成字符串,存入LinkedHashMap中

信息獲取

BlockCanaryInternals

發(fā)生卡頓時(shí)神妹,會(huì)回調(diào)onBlockEvent颓哮,四個(gè)參數(shù)分別表示:記錄開(kāi)始時(shí)間點(diǎn)、記錄結(jié)束時(shí)間點(diǎn)鸵荠、記錄開(kāi)始時(shí)間點(diǎn)線程所運(yùn)行時(shí)間冕茅、記錄結(jié)束時(shí)間點(diǎn)線程所運(yùn)行時(shí)間

StackSampler

sStackMap中的key是記錄的時(shí)間點(diǎn),落在記錄開(kāi)始蛹找、結(jié)束時(shí)間點(diǎn)中間的棧信息都是同一Message處理所產(chǎn)生的

同理獲取CPU信息姨伤,組裝成BlockInfo對(duì)象,由LogWriter寫(xiě)入單獨(dú)文件進(jìn)行存儲(chǔ)

信息展示

BlockCanaryInternals
BlockCanary

之前添加的監(jiān)聽(tīng)被回調(diào)

跳轉(zhuǎn)到信息展示頁(yè)面DisplayActivity

DisplayActivity

在頁(yè)面啟動(dòng)時(shí)加載卡頓信息

DisplayActivity.LoadBlocks

加載的過(guò)程是封裝為L(zhǎng)oadBlocks的Runnable

LoadBlocks

獲取保存的所有日志文件

轉(zhuǎn)成BlockInfoEx對(duì)象

將數(shù)據(jù)設(shè)置到Activity并更新UI

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庸疾,一起剝皮案震驚了整個(gè)濱河市乍楚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌届慈,老刑警劉巖徒溪,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異金顿,居然都是意外死亡臊泌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)串绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缺虐,“玉大人,你說(shuō)我怎么就攤上這事礁凡「叩” “怎么了慧妄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)剪芍。 經(jīng)常有香客問(wèn)我塞淹,道長(zhǎng),這世上最難降的妖魔是什么罪裹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任饱普,我火速辦了婚禮,結(jié)果婚禮上状共,老公的妹妹穿的比我還像新娘套耕。我一直安慰自己,他們只是感情好峡继,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布冯袍。 她就那樣靜靜地躺著,像睡著了一般碾牌。 火紅的嫁衣襯著肌膚如雪康愤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天舶吗,我揣著相機(jī)與錄音征冷,去河邊找鬼。 笑死誓琼,一個(gè)胖子當(dāng)著我的面吹牛检激,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播踊赠,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼呵扛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼每庆!你這毒婦竟也來(lái)了筐带?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缤灵,失蹤者是張志新(化名)和其女友劉穎伦籍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腮出,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帖鸦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胚嘲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片作儿。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖馋劈,靈堂內(nèi)的尸體忽然破棺而出攻锰,到底是詐尸還是另有隱情晾嘶,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布娶吞,位于F島的核電站垒迂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏妒蛇。R本人自食惡果不足惜机断,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绣夺。 院中可真熱鬧吏奸,春花似錦、人聲如沸陶耍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)物臂。三九已至旺拉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棵磷,已是汗流浹背蛾狗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仪媒,地道東北人沉桌。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像算吩,于是被迫代替她去往敵國(guó)和親留凭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • 在移動(dòng)APP性能評(píng)測(cè)-流暢度評(píng)測(cè)中偎巢,我們介紹了如何準(zhǔn)確客觀評(píng)價(jià)APP的流暢度蔼夜,最終采用SM指標(biāo)來(lái)評(píng)價(jià)應(yīng)用的流暢度,...
    htkeepmoving閱讀 13,152評(píng)論 0 22
  • Activity是什么 Activity是四大組件之一压昼,它提供一個(gè)界面讓用戶點(diǎn)擊和各種滑動(dòng)操作 Activity棧...
    叫我吹神閱讀 2,612評(píng)論 0 4
  • 美圖欣賞 Java求冷、Android知識(shí)點(diǎn)匯集 Java集合類(lèi) ** Java集合相關(guān)的博客** java面試相關(guān) ...
    ElvenShi閱讀 1,720評(píng)論 0 2
  • 我滴媽呀但金,今天4萬(wàn)步韭山,這是有史以來(lái)一天之內(nèi)走路最多的一次,雖然不全是耗費(fèi)在要資源的路上,但有3萬(wàn)步絕對(duì)是钱磅!我的感覺(jué)...
    楊子樣子閱讀 196評(píng)論 0 1
  • 文/青青子衿吶 1巩踏、 可可西里無(wú)人區(qū),自然條件惡劣续搀,人類(lèi)無(wú)法長(zhǎng)期居住塞琼,但是資源深厚。它位于西藏西北部面積有60萬(wàn)平...
    青青子衿吶閱讀 875評(píng)論 2 3