閱讀源碼的方法論

隨著互聯(lián)網(wǎng)行業(yè)的發(fā)展钾军,優(yōu)秀的開源框架越來越多,我們可以輕易地在 Github 上找到業(yè)界頂尖的大佬親手寫的代碼绢要,對于這種放在眼前的美食我們怎么能視而不見呢吏恭?
但實際上,源碼一般比較復(fù)雜重罪,一個框架動輒上萬行樱哼、幾百個類,互相之間又有著各種各樣奇奇怪怪的聯(lián)系蛆封。想要從這一堆復(fù)雜冗長的代碼中理清楚頭緒實在是非常困難唇礁。下面這篇文章就總結(jié)了我在閱讀源碼時的一些方法與技巧,希望可以幫到大家惨篱。
下面的框架我會按照 Android 中的圖片加載框架 Glide 為案例來進行講解盏筐。

此外如果大家有興趣可以看看我專門針對 Glide 源碼解讀的文章:
http://www.reibang.com/p/9bb50924d42a

自頂向下的分析

在拿到一份源碼時(假設(shè)你已經(jīng)學(xué)會如何使用這個框架),我們第一件要做的事情是思考如果讓我們來設(shè)計這個框架砸讳,我們會怎樣設(shè)計琢融,應(yīng)該分成哪幾個模塊界牡,模塊之間如何耦合,如何讓用戶使用起來很簡單的同時又可以擴展自己的功能等等漾抬。
當(dāng)我們仔細分析一波后宿亡,會逐漸明白這個框架的設(shè)計難點、關(guān)鍵節(jié)點纳令、核心等等挽荠。例如要我們設(shè)計一個加載圖片的框架,那第一個想到的肯定就是緩存(內(nèi)存緩存平绩、磁盤緩存等等)圈匆、加載源(HTTP、File捏雌、Resource 等等)跃赚、格式轉(zhuǎn)換等等這些要點径密,然后我們帶著這些問題去看框架纽门,效率自然就高了很多巡通。
用宏觀角度去分析代碼細節(jié)粱侣,自頂向下縷清關(guān)系暮顺。

模塊劃分

用模塊化思維分析鹤啡。
其實通過上面的思考枯芬,我們已經(jīng)能大概的給這個框架分出幾個模塊了绍坝,例如:緩存模塊着裹、加載模塊领猾、圖片處理模塊等等。
然后我們開始看代碼骇扇,一個優(yōu)秀的框架都會有很清晰的模塊劃分摔竿,我們先根據(jù)模塊來看,因為包是按照模塊劃分的少孝,所以可以根據(jù)分包來了解框架中的模塊继低,下面看一下 Glide 框架源碼的包劃分:

分包結(jié)構(gòu)

第一個 load 包肯定是加載相關(guān)的東西,例如圖片請求的執(zhí)行稍走、數(shù)據(jù)解碼袁翁。
request 包應(yīng)該是請求封裝模塊,我們發(fā)起一個請求時應(yīng)該會通過這個包下面的類進行包裝婿脸。
signature 叫簽名粱胜,大概是關(guān)于請求標識、資源標識相關(guān)的狐树?我們可以先這么理解焙压。
util 是工具包,放一些全局共用的工具類。
其它的可以自己理解涯曲。到了這里我們已經(jīng)能對這個框架有個粗淺的認識了野哭。

另外,要相對模塊劃分有更深的了解幻件,我們光看這個還是不行的拨黔,需要看一些代碼才能更深入的了解,例如根據(jù)我們平時使用的方式绰沥,來看整個圖片加載的流程是怎樣的篱蝇,每個流程負責(zé)什么任務(wù),這樣可以加深對模塊的認識徽曲。

下面我們就可以按照模塊來學(xué)習(xí)源碼了态兴,例如先學(xué)習(xí) request 包下面的代碼,明白請求是如何創(chuàng)建的等等疟位,閱讀源碼時一定要時刻保持著清醒的頭腦,千萬不可迷失在層層的嵌套調(diào)用關(guān)系中喘垂。
有一點需要注意:千萬不可急于求成甜刻,看不明白的就放在后面看,先看能看明白的正勒。

流程分析

了解一套圖片加載的請求流程比較重要得院,我們通過分析這些流程能明白每個模塊之間的關(guān)系。
如果看過一些代碼已經(jīng)知道章贞,模塊之間都是使用接口耦合祥绞,每個接口又有很多實現(xiàn)類,具體的實現(xiàn)類要在代碼運行時才能知道鸭限,所以想要找到一個方法具體的實現(xiàn)也是一件比較麻煩的事情蜕径。除了通過調(diào)試可以很方便的看到調(diào)用流程之外我這里再給一個技巧:關(guān)鍵點打印方法調(diào)用棧
打印方法調(diào)用棧的代碼如下:

StringBuilder traceBuilder = new StringBuilder();
for(StackTraceElement e : Thread.currentThread().getStackTrace()){
    traceBuilder.append(e.toString());
    traceBuilder.append("\n");
}
Log.d(TAG, traceBuilder.toString());

搞懂流程之后可以畫一個流程圖出來败京,例如下面這樣:

加載流程

當(dāng)然了想要畫出這樣的流程圖是需要時間的兜喻, 不是很輕易的就能完成,需要對源碼有了一定的了解之后才行赡麦。

類分析

類分析是指我們在實際閱讀源碼時針對同一個家族的類的分析朴皆。
類與類之間肯定會有這很多復(fù)雜的聯(lián)系,我們在閱讀時想要理清楚可以借助一些工具泛粹,例如自動生成 UML 類圖的插件遂铡。
效果如下:

UML 圖

這里用的是 Android Studio 中的 simpleUML 插件來生成的,直接搜索安裝即可晶姊。
有了這種工具我們的效率將會事半功倍扒接。

其實閱讀源碼最重要的技巧就是:死磕。沒有什么特別的方法可以讓你在很快的時間內(nèi)對一個框架了如指掌,想要學(xué)好必須多花點時間仔細閱讀珠增,看得多了超歌,自然就一回生二回熟了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂教,一起剝皮案震驚了整個濱河市巍举,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凝垛,老刑警劉巖懊悯,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梦皮,居然都是意外死亡炭分,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門剑肯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捧毛,“玉大人,你說我怎么就攤上這事让网⊙接牵” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵溃睹,是天一觀的道長而账。 經(jīng)常有香客問我,道長因篇,這世上最難降的妖魔是什么泞辐? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮竞滓,結(jié)果婚禮上咐吼,老公的妹妹穿的比我還像新娘。我一直安慰自己商佑,他們只是感情好汽烦,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著莉御,像睡著了一般撇吞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礁叔,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天牍颈,我揣著相機與錄音,去河邊找鬼琅关。 笑死煮岁,一個胖子當(dāng)著我的面吹牛讥蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播画机,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冶伞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了步氏?” 一聲冷哼從身側(cè)響起响禽,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荚醒,沒想到半個月后芋类,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡界阁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年侯繁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泡躯。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡贮竟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出较剃,到底是詐尸還是另有隱情坝锰,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布重付,位于F島的核電站,受9級特大地震影響凫乖,放射性物質(zhì)發(fā)生泄漏确垫。R本人自食惡果不足惜帽芽,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一删掀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧导街,春花似錦披泪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谍椅。三九已至锁施,卻和暖如春沾谜,著一層夾襖步出監(jiān)牢的瞬間基跑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掺逼,地道東北人吕喘。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓祠斧,卻偏偏與公主長得像琢锋,于是被迫代替她去往敵國和親钮热。 傳聞我的和親對象是個殘疾皇子隧期,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

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