在長沙待的那些年,身邊所看到的大概可分爲兩類人,一類是不斷反覆的作業務邏輯,只求功能可以寫出來,天天重複上下班,不想過多的去折騰;還有一類是不斷的反思總結和學習,不僅停留在作的層次上,是真正的喜歡作這行,且以爲很是有意思。沒有什麼好與壞,只是你們的追求不一樣而已。但若是咱們想要去大一點的公司,或者找一份工資稍微高些的工做,後面咱們就會有不少坎要去邁,其中一個就是閱讀源碼,因此這期咱們主要來探討一下閱讀源碼的 一些姿式。在真正踏上這條路以前,但願咱們能明確如下幾點:android
沒有人一上來就能夠看得懂源碼,咱們都是從 Hello World 開始的,因此沒有什麼捷徑能夠走,無非就是看咱們誰花的時間多,誰更願意折騰。git
你們都是上下班,爲啥別人工資拿得高福利又好,而本身大小周,偶爾還須要加班通宵。一樣三四年別人拿 20k,我本身卻只拿了 10k。注意我說的是 20k ,以前寫過一篇文章 《從3K到30K,23歲的年紀我到底經歷了什麼》 此次一樣怕某些哥們會噴,哪有那麼高?咱們心中要有美好的信念,要有不斷向上的激情。github
能力提高過程當中咱們能從中得到不少東西,心裏也會變強大,關鍵是咱們在作項目的時候,的確會要順手不少,這就能夠拿來換錢和時間,前提是咱們願意拿時間去換。api
一.經常使用工具緩存
首先來介紹一些看源碼的工具,第一個就是咱們的開發工具 Android Studio ,這裏咱們以具體的示例來講,假設如今我想看 setContentView 的源碼,那麼咱們能夠直接跟進到源碼的方法裏面去:
這時若是再往裏面跟發現是一個抽象類,咱們必需要找到實現類,通常來說咱們能夠搜索(ctrl + F)找到其建立實例的地方:
是紅色的,這個時候咱們再也無法往裏面跟了(一碰到紅尷尬症就犯了,腎得慌),碰到這種狀況咱們能夠試試全局的搜索(雙擊 shift)
但不少狀況下咱們全局搜索也搜索不到,接下來給你們介紹第二個工具,咱們能夠在線瀏覽源碼閱讀:http://androidxref.com 這裏面不光有 Java 層的源代碼還有 native 層的源代碼
在線查看通常都是比較精確要看哪一個類的時候,並不能知足咱們快速查看的需求。我就想在 Android Studio 中看,能夠不斷快速的往下跟進。其實咱們在下載 sdk 的時候通常都會下載源碼,只不過恰好 android.jar 包中沒有這個 class 類的源碼,因此咱們才找不到而已。這個時候咱們須要一個比較完整的 android.jar ,用來替換咱們 sdk 中的 android.jar 文件,關鍵是這個 jar 怎麼來?最好的方式是本身去編譯,但不少哥們可能以爲本身編譯成本高,那麼咱們也能夠去 github 上下載。https://github.com/anggrayudi/android-hidden-api 把原來的保存一份改下命名,把下載的複製進去,而後重啓 Android Studio 再去看看,發現不只沒有報紅並且能夠點擊了。
到後面這些仍是沒法知足咱們的需求,好比如今咱們已經把 C++ 進階學完了,我想跟到 native 層的源碼去看看,好比去看看底層的 Binder 驅動,或者去看看類的加載機制,我再送你們一個連接,裏面全部的源碼基本都能找到:https://pan.baidu.com/s/1tGtBt5Y1G50yI10EkVRPAw網絡
再囉嗦幾句,若是咱們對源碼很是感興趣,我建議你們仍是本身去編譯源碼,這樣咱們就能夠利用 Android Studio 去調試跟蹤源碼,屢試不爽。架構
二.前輩力量ide
文章的開頭有提到,沒有人一上來就能夠看得懂源碼,咱們都是從 Hello World 開始的,因此沒有什麼捷徑能夠走,無非就是看咱們誰花的時間多,誰更願意折騰。別看網上有不少大牛寫了不少分析源碼的文章,但其實他們都是通過反覆折騰,才能寫出那一篇形如流水卻很抽象的文章。因此咱們寫了那麼多分析源碼的文章,錄了那麼多直播課程,無非就是咱們在背後花了不少時間而已。只要你願意我能行的,你也能行。工具
固然剛一開始我並不建議你們本身去看源碼,我記得本身第一次看源碼的時候,點擊進去是一臉蒙 B。因此剛一開始咱們須要藉助前輩的力量,跟着大牛的思路去看源碼,也就是你們一般所說的老司機帶帶我。學習
有幾點須要提醒你們是,有些文章可能篇幅比較長,要有耐心不斷反覆的多看幾遍。固然有時也沒必要在一棵樹上吊死,其餘樹上也能夠多試幾回。其次咱們找一些稍微靠譜一點的,閱讀量多一些的文章,排版稍微好點,圖文並茂的。最後,無論別人的文章寫得有多好有多清晰多牛掰,始終不是咱們本身的,也有可能存在 bug 。這也是我爲何建議你們看閱讀量稍微高些的文章,由於有問題你們會評論提出來,會通過不少次的修正調整。咱們最好本身親身去實踐,本身作作筆記或者寫寫文章,把它真正變成本身的知識,這樣提高的速度是很是快的,屢試不爽。
三.慣用套路
每一個人閱讀源碼的思路都會有些不同,姿式也會有所不一樣,下面我僅表明我的的觀點談談個人慣用套路,假如咱們想去分析 glide 這個開源庫,假設如今網上的資料也無法知足咱們了:
第一步會去畫 UML 時序圖,相信咱們在分析 glide 源碼的時候,剛開始可能連訪問網絡的碼頭都找不到。畫時序圖不光能防止咱們沉入茫茫大海,還能讓整個加載顯示流程都很是清晰,好記性不如畫流程圖。
第二步會去畫 UML 類圖,每一個第三方庫在其架構設計上,都會有其值得借鑑的地方。如 retrofit 這個開源庫,雖然類文件並很少,但裏面的封裝解耦思想,都可以在咱們實際的開發過程當中派上用場。
第三步會去抓細節,好比 Glide 怎麼壓縮適配圖片的,緩存怎麼處理的,是如何加載 gif 圖片的,怎麼解析視頻封面的。咱們在開發過程當中遇到的不少問題,源碼會給咱們不少更好的解決方案。
第四步會去參考模仿,並非建議你們去重複造輪子,好比咱們知道了 IOC 的實現原理,就能完美的解決 mvp 中多 prsenter 的狀況;清楚了 RxPermission 的實現方式咱們就能很輕鬆的寫出相似 RxPay 和 RxShare 等等。
第五步會去反思現有的架構設計,咱們在寫項目的時候,每每因爲時間的緣由,只是考慮了怎麼實現,能實現能按時上線就好。隨着業務的不斷修改增長,可能已經沒有了高蛋白低脂肪。固然隨着經驗的增加考慮的也會多一些,但仍然須要不斷的反思和學習。
四.爲所欲爲
當咱們閱讀了大量的源碼和第三方開源庫後,咱們就能打通任督二脈,學習的速度會愈來愈快。當同事遇到一些棘手的 bug ,咱們能從源碼的角度去分析解決;一些難以實現的需求,咱們也能很快的找到解決方案。這時咱們要麼是在大公司鍍金,要麼是在小公司作負責人,是真正的喜歡工做、學習和折騰。
原創做者:紅橙Darren(曾輝)
原文連接:https://www.jianshu.com/p/8012d5d38b01