背景
應(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)
截取一張圖,大家感受一下碰辅,這是冷啟動的標(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)檢測功能,目前主要是分了五大模塊萌业,如下圖所示:
- 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)容包括
大致就是以上8大模塊,一一做詳細(xì)的闡述和分析欢摄。具體鏈接如下:
以上會以單獨的一篇內(nèi)容做分享熬丧。每一篇更加注重細(xì)節(jié)和實踐,但仔細(xì)想一想怀挠,如果一上來就到細(xì)節(jié)分析析蝴,仿佛不利于我們的理解,所以我也準(zhǔn)備了框架的整體分析绿淋,從整體到局部闷畸,從局部到細(xì)節(jié),從細(xì)節(jié)到實踐吞滞。
Matrix的框架結(jié)構(gòu)
項目中主要分為三種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項目择诈,依賴該插件如下圖所示:
整體來看,我沒有很詳細(xì)的介紹每個lib的功能和內(nèi)容出皇,后續(xù)源碼解讀中會一一提到羞芍。
Matrix的目錄結(jié)構(gòu)
結(jié)合上面的框架結(jié)構(gòu)圖,基本可以不用解釋了吧郊艘。話不多說荷科,我們再深入一些,看下項目的類結(jié)構(gòu)設(shè)計纱注。
Matrix的類結(jié)構(gòu)
通過類的結(jié)構(gòu)圖畏浆,我們可以清晰的看到框架的代碼組織結(jié)構(gòu),請看圖:
我們發(fā)現(xiàn)幾個點:
- 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和措。