隨著互聯(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 框架源碼的包劃分:
第一個 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 類圖的插件遂铡。
效果如下:
這里用的是 Android Studio 中的 simpleUML 插件來生成的,直接搜索安裝即可晶姊。
有了這種工具我們的效率將會事半功倍扒接。
其實閱讀源碼最重要的技巧就是:死磕。沒有什么特別的方法可以讓你在很快的時間內(nèi)對一個框架了如指掌,想要學(xué)好必須多花點時間仔細閱讀珠增,看得多了超歌,自然就一回生二回熟了。