Matrix原理分析系列之開篇

背景

應(yīng)用性能監(jiān)控和性能優(yōu)化一直是老生常談的話題鲸鹦,很多大廠都有專門的團隊在做旧乞,騰訊就做了一款性能監(jiān)控的框架matrix植兰,且已經(jīng)開源,對于個人而言膏萧,這是一次絕佳的學(xué)習(xí)機會,像如何做到啟動耗時的計算蝌衔,就要去了解App的啟動過程榛泛,系統(tǒng)函數(shù)如何被調(diào)用,被調(diào)用的順序又是什么等等吧噩斟,這次內(nèi)容即將從matrix框架的各個方面進(jìn)行一一展開曹锨,弄清楚到底是怎么監(jiān)控的,且深入到代碼的實現(xiàn)來看清本質(zhì)剃允。對于公司而言沛简,這也是公司搭建線上性能監(jiān)控平臺過程中,打下了堅實且穩(wěn)定的基礎(chǔ)斥废,雖然市面上已經(jīng)有toB的APM性能監(jiān)控平臺椒楣,畢竟是收費的嘛,當(dāng)然還考慮到如果花了錢還不滿意牡肉,那豈不是得不償失捧灰,所以不如自己做,畢竟我們做技術(shù)的统锤,喜歡確定性毛俏,喜歡穩(wěn)定的接口炭庙,而不是不斷變化的不確定性。

APM簡介

APM全稱(Application Performance Management)應(yīng)用性能管理煌寇,從整個開發(fā)流程來看APM焕蹄,如圖是我們開發(fā)的大致流程
在開發(fā)階段,我使用各種工具或者第三方SDK來監(jiān)控內(nèi)存泄漏如LeakCanary唧席,還有我們熟悉的TrackView耗時分析工具擦盾,在編譯階段,通過Gradle代碼插樁可以統(tǒng)一實現(xiàn)埋點等功能淌哟,當(dāng)然也可以通過代碼插樁做函數(shù)的耗時統(tǒng)計迹卢。測試階段應(yīng)該也有體現(xiàn),這我沒有想好徒仓,跳過腐碱,在灰度發(fā)布階段我們收集到了數(shù)據(jù)后,做統(tǒng)計掉弛,統(tǒng)計出需要優(yōu)化的方方面面症见,最終交給開發(fā)做優(yōu)化⊙甓觯可見APM在整個開發(fā)過程中舉足輕重谋作。

為什么大廠都有APM平臺

  • 當(dāng)然最主要的原因是我們要交付高質(zhì)量的應(yīng)用,需要一些手段來提高應(yīng)用質(zhì)量乎芳,那么APM就提供了一系列的方式方法來高效的捕捉問題遵蚜,最終解決問題,提高體驗奈惑。
  • 團隊規(guī)模變大吭净,越來越多的組織都需要做性能監(jiān)控,這個團隊做了個內(nèi)存分析監(jiān)控肴甸,那個團隊做了個啟動耗時監(jiān)控寂殉,那么也是為了統(tǒng)一技術(shù)棧,減少其他團隊的學(xué)習(xí)和研究成本原在,那么統(tǒng)一出一個APM性能監(jiān)控平臺友扰,就顯得異常重要,有句老話說的好庶柿,聞道有先后焕檬,術(shù)業(yè)有專攻,專業(yè)的團隊干專業(yè)的事兒澳泵,這也是統(tǒng)一出APM的另一個原因

APM性能監(jiān)控的指標(biāo)

首先我們來看下性能指標(biāo)实愚,或者叫用戶體驗標(biāo)準(zhǔn),大家都在講性能監(jiān)控,都在做性能優(yōu)化腊敲,那么什么樣子的數(shù)據(jù)才是合格的呢击喂?詳細(xì)請看如下鏈接:
軟件綠色聯(lián)盟應(yīng)用體驗標(biāo)準(zhǔn)3.0——性能標(biāo)準(zhǔn)

image.png

截取一張圖,大家感受一下碰辅,這是冷啟動的標(biāo)準(zhǔn)懂昂,一般應(yīng)用類要求在2000毫秒一下,要求感覺很寬松啊没宾,一秒內(nèi)啟動我認(rèn)為更加合理一些凌彬,當(dāng)然這是大部分的標(biāo)準(zhǔn),他們給我們提供了性能優(yōu)化的依據(jù)循衰,提供有力的支持铲敛。另一方面我們也能從中找到需要監(jiān)控的模塊。還不錯会钝,如果有需要深入研究伐蒋,請移步鏈接查看詳情。
綠色聯(lián)盟官版:
軟件綠色聯(lián)盟應(yīng)用體驗標(biāo)準(zhǔn)3.0——性能標(biāo)準(zhǔn)
華為解讀版本:
《軟件綠色聯(lián)盟應(yīng)用體驗標(biāo)準(zhǔn)3.0》關(guān)鍵信息和華為解讀
有了這些標(biāo)準(zhǔn)迁酸,也有助于我們的判斷力先鱼,什么是好,什么是不好奸鬓,清晰明了焙畔。下面進(jìn)入我們這次分析的核心Matrix。

Matrix 簡介

了解了APM之后串远,接下來看一下APM具體實現(xiàn)之一Matrix的介紹:
Matrix 是一款微信研發(fā)并日常使用的應(yīng)用性能接入框架宏多,支持iOS, macOS和Android。 Matrix 通過接入各種性能監(jiān)控方案抑淫,對性能監(jiān)控項的異常數(shù)據(jù)進(jìn)行采集和分析,輸出相應(yīng)的問題分析姥闪、定位與優(yōu)化建議始苇,從而幫助開發(fā)者開發(fā)出更高質(zhì)量的應(yīng)用。
針對Android系統(tǒng):
Matrix-android 監(jiān)控范圍包括:應(yīng)用安裝包大小筐喳,幀率變化催式,啟動耗時,卡頓避归,慢方法荣月,SQLite 操作優(yōu)化,文件讀寫梳毙,內(nèi)存泄漏等等哺窄。
從官方文檔來看,**Matrix-android 幾乎涵蓋了所有的性能指標(biāo)檢測功能,目前主要是分了五大模塊萌业,如下圖所示:

image

  • APK Checker: 針對 APK 安裝包的分析檢測工具坷襟,根據(jù)一系列設(shè)定好的規(guī)則,檢測 APK 是否存在特定的問題生年,并輸出較為詳細(xì)的檢測結(jié)果報告婴程,用于分析排查問題以及版本追蹤
  • Resource Canary: 基于 WeakReference 的特性和 Square Haha 庫開發(fā)的 Activity 泄漏和 Bitmap 重復(fù)創(chuàng)建檢測工具
  • Trace Canary: 監(jiān)控界面流暢性、啟動耗時抱婉、頁面切換耗時档叔、慢函數(shù)及卡頓等問題
  • SQLite Lint: 按官方最佳實踐自動化檢測 SQLite 語句的使用質(zhì)量
  • IO Canary: 檢測文件 IO 問題,包括:文件 IO 監(jiān)控和 Closeable Leak 監(jiān)控

框架特性

與常規(guī)的 APM 工具相比蒸绩,Matrix 擁有以下特點:

APK Checker

  • 具有更好的可用性:JAR 包方式提供衙四,更方便應(yīng)用到持續(xù)集成系統(tǒng)中,從而追蹤和對比每個 APK 版本之間的變化
  • 更多的檢查分析功能:除具備 APKAnalyzer 的功能外侵贵,還支持統(tǒng)計 APK 中包含的 R 類届搁、檢查是否有多個動態(tài)庫靜態(tài)鏈接了 STL 、搜索 APK 中包含的無用資源窍育,以及支持自定義檢查規(guī)則等
  • 輸出的檢查結(jié)果更加詳實:支持可視化的 HTML 格式卡睦,便于分析處理的 JSON ,自定義輸出等等

Resource Canary

  • 分離了檢測和分析部分漱抓,便于在不打斷自動化測試的前提下持續(xù)輸出分析后的檢測結(jié)果
  • 對檢測部分生成的 Hprof 文件進(jìn)行了裁剪表锻,移除了大部分無用數(shù)據(jù),降低了傳輸 Hprof 文件的開銷
  • 增加了重復(fù) Bitmap 對象檢測乞娄,方便通過減少冗余 Bitmap 數(shù)量瞬逊,降低內(nèi)存消耗

Trace Canary

  • 編譯期動態(tài)修改字節(jié)碼, 高性能記錄執(zhí)行耗時與調(diào)用堆棧
  • 準(zhǔn)確的定位到發(fā)生卡頓的函數(shù),提供執(zhí)行堆棧仪或、執(zhí)行耗時确镊、執(zhí)行次數(shù)等信息,幫助快速解決卡頓問題
  • 自動涵蓋卡頓范删、啟動耗時蕾域、頁面切換、慢函數(shù)檢測等多個流暢性指標(biāo)

SQLite Lint

  • 接入簡單到旦,代碼無侵入
  • 數(shù)據(jù)量無關(guān)旨巷,開發(fā)、測試階段即可發(fā)現(xiàn)SQLite性能隱患
  • 檢測算法基于最佳實踐添忘,高標(biāo)準(zhǔn)把控SQLite質(zhì)量*
  • 底層是 C++ 實現(xiàn)采呐,支持多平臺擴展

IO Canary

  • 接入簡單,代碼無侵入
  • 性能搁骑、泄漏全面監(jiān)控斧吐,對 IO 質(zhì)量心中有數(shù)
  • 兼容到 Android P

目的

此次分析的主要目的是從源碼的角度又固,刨根問底,還原本質(zhì)会通,弄清楚所有性能監(jiān)控的原理口予,另一方面目的也是我們公司內(nèi)部準(zhǔn)備基于它搭建一個完整的線上性能監(jiān)控平臺,將產(chǎn)生的數(shù)據(jù)可視化涕侈,通過數(shù)據(jù)的統(tǒng)計和篩選找到最需要做優(yōu)化的點沪停,這樣有利于公司對線上App的把控,間接提高用戶體驗裳涛,同樣也能影響到開發(fā)者木张,開發(fā)出更高質(zhì)量的應(yīng)用。

分析方法

  • 源碼閱讀分析

首先通過對源碼的解讀端三,了解實現(xiàn)過程舷礼,了解細(xì)節(jié)處理等。

  • 代碼實踐

實踐是最好的老師郊闯,主要是想到學(xué)以致用妻献,我們能否寫一個簡易版的監(jiān)控,并通過真實的場景模擬团赁,來輔助我們更加深刻的理解育拨。

這次分享的系列內(nèi)容包括

image

大致就是以上8大模塊,一一做詳細(xì)的闡述和分析欢摄。具體鏈接如下:

以上會以單獨的一篇內(nèi)容做分享熬丧。每一篇更加注重細(xì)節(jié)和實踐,但仔細(xì)想一想怀挠,如果一上來就到細(xì)節(jié)分析析蝴,仿佛不利于我們的理解,所以我也準(zhǔn)備了框架的整體分析绿淋,從整體到局部闷畸,從局部到細(xì)節(jié),從細(xì)節(jié)到實踐吞滞。

Matrix的框架結(jié)構(gòu)

image.png

項目中主要分為三種Lib形式佑菩,包括C、Java冯吓、Android

  • apk-canary Jar包形式倘待,不牽扯android相關(guān)API疮跑,對java項目commons有依賴關(guān)系组贺。
  • trace-canary 安卓依賴包形式,主要依賴android-lib
  • resource-canary 文件目錄祖娘,目下三個項目一個基礎(chǔ)依賴canary-common 一個android依賴包canary-android失尖,一個canary-analyzer java項目用來分析activity內(nèi)存泄漏啊奄,重復(fù)bitmap,堆分析等掀潮。
  • io-canary Android包菇夸,依賴android-commons android-lib ,分析IO流的泄漏等
  • sqlite-lint-android Android包仪吧,依賴的C++模塊庄新,代碼在同級目錄的src中
  • gradle-plugin gradle自定義插件,這里就是我們在項目中需要引用的插件源碼薯鼠,它依賴于arsutil java項目择诈,依賴該插件如下圖所示:
image.png

整體來看,我沒有很詳細(xì)的介紹每個lib的功能和內(nèi)容出皇,后續(xù)源碼解讀中會一一提到羞芍。

Matrix的目錄結(jié)構(gòu)

image.png

結(jié)合上面的框架結(jié)構(gòu)圖,基本可以不用解釋了吧郊艘。話不多說荷科,我們再深入一些,看下項目的類結(jié)構(gòu)設(shè)計纱注。

Matrix的類結(jié)構(gòu)

通過類的結(jié)構(gòu)圖畏浆,我們可以清晰的看到框架的代碼組織結(jié)構(gòu),請看圖:
我們發(fā)現(xiàn)幾個點:

image.png
  • IPlugin 定義了插件的行為奈附,開始全度,暫停,銷毀斥滤,初始化将鸵,獲取tag標(biāo)志等等。
  • 插件收集的問題通過PluginListener匯集佑颇,且依賴了接口顶掉,并沒有依賴實現(xiàn)類DefaultPluginListener
  • 一共實現(xiàn)了四個插件,Trace挑胸、SQLiteLint痒筒、Resource、IOCanary茬贵。
  • Matrix聚合類通過Builder模式創(chuàng)建簿透,并管理所有插件,如startAllPlugins解藻、stopAllPlugins等等老充。

其實并沒有大家想象的那么復(fù)雜,很簡單的實現(xiàn)螟左,并沒有什么晦澀難懂之處啡浊,其實難的在后面觅够。

總結(jié)

簡單做個回顧,這期內(nèi)容巷嚣,從了解背景開始喘先,我們對APM有了一定的理解,并引出Matrix框架廷粒,列出了它的功能和特點窘拯,最后我們制定了分析的方法和內(nèi)容,然后從全局的角度看一下Matrix的框架結(jié)構(gòu)設(shè)計坝茎,以及類的結(jié)構(gòu)設(shè)計树枫。這樣有利于我們從整體到局部的學(xué)習(xí)。接下來我們就可以去關(guān)注細(xì)節(jié)景东,針對每一個插件的功能砂轻,接口定義的方法,一個個去翻源碼斤吐,看下到底是怎么樣的實現(xiàn)搔涝,才能做到監(jiān)控的,期待ing和措。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庄呈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子派阱,更是在濱河造成了極大的恐慌诬留,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贫母,死亡現(xiàn)場離奇詭異文兑,居然都是意外死亡,警方通過查閱死者的電腦和手機腺劣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門绿贞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橘原,你說我怎么就攤上這事籍铁。” “怎么了趾断?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵拒名,是天一觀的道長。 經(jīng)常有香客問我芋酌,道長增显,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任隔嫡,我火速辦了婚禮甸怕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘腮恩。我一直安慰自己梢杭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布秸滴。 她就那樣靜靜地躺著武契,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荡含。 梳的紋絲不亂的頭發(fā)上咒唆,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音释液,去河邊找鬼全释。 笑死,一個胖子當(dāng)著我的面吹牛误债,可吹牛的內(nèi)容都是我干的浸船。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼寝蹈,長吁一口氣:“原來是場噩夢啊……” “哼李命!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起箫老,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤封字,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后耍鬓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阔籽,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年牲蜀,在試婚紗的時候發(fā)現(xiàn)自己被綠了仿耽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡各薇,死狀恐怖项贺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情峭判,我是刑警寧澤开缎,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站林螃,受9級特大地震影響奕删,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疗认,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一完残、第九天 我趴在偏房一處隱蔽的房頂上張望伏钠。 院中可真熱鬧,春花似錦谨设、人聲如沸熟掂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赴肚。三九已至,卻和暖如春二蓝,著一層夾襖步出監(jiān)牢的瞬間誉券,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工刊愚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留踊跟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓鸥诽,卻偏偏與公主長得像琴锭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衙传,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 今天感恩節(jié)哎决帖,感謝一直在我身邊的親朋好友。感恩相遇蓖捶!感恩不離不棄地回。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,551評論 0 11
  • 彩排完俊鱼,天已黑
    劉凱書法閱讀 4,187評論 1 3
  • 表情是什么刻像,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息并闲。高興了當(dāng)然就笑了细睡,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,199評論 2 7