在長沙待的那些年枯冈,身邊所看到的大概可分為兩類人,一類是不斷反復(fù)的做業(yè)務(wù)邏輯昆咽,只求功能能夠?qū)懗鰜砑菪祝刻熘貜?fù)上下班,不想過多的去折騰掷酗;還有一類是不斷的反思總結(jié)和學(xué)習(xí)调违,不只停留在做的層次上,是真正的喜歡做這行泻轰,且覺得非常有意思技肩。沒有什么好與壞,只是大家的追求不同而已浮声。但如果我們想要去大一點(diǎn)的公司虚婿,或者找一份工資稍微高些的工作,后面我們就會(huì)有很多坎要去邁泳挥,其中一個(gè)就是閱讀源碼然痊,所以這期我們主要來探討一下閱讀源碼的 一些姿勢。在真正踏上這條路之前屉符,希望我們能明確以下幾點(diǎn):
沒有人一上來就可以看得懂源碼剧浸,我們都是從 Hello World 開始的锹引,所以沒有什么捷徑可以走,無非就是看我們誰花的時(shí)間多辛蚊,誰更愿意折騰粤蝎。
大家都是上下班,為啥別人工資拿得高福利又好袋马,而自己大小周,偶爾還需要加班通宵秸应。同樣三四年別人拿 20k虑凛,我自己卻只拿了 10k。注意我說的是 20k 软啼,之前寫過一篇文章 《從3K到30K桑谍,23歲的年紀(jì)我到底經(jīng)歷了什么》 這次同樣怕某些哥們會(huì)噴,哪有那么高祸挪?我們心中要有美好的信念锣披,要有不斷向上的激情。
能力提升過程中我們能從中獲得很多東西贿条,內(nèi)心也會(huì)變強(qiáng)大雹仿,關(guān)鍵是我們在做項(xiàng)目的時(shí)候,的確會(huì)要順手很多整以,這就可以拿來換錢和時(shí)間胧辽,前提是我們愿意拿時(shí)間去換。
一.常用工具
首先來介紹一些看源碼的工具公黑,第一個(gè)就是我們的開發(fā)工具 Android Studio 邑商,這里我們以具體的示例來說,假設(shè)現(xiàn)在我想看 setContentView 的源碼凡蚜,那么我們可以直接跟進(jìn)到源碼的方法里面去:
這時(shí)如果再往里面跟發(fā)現(xiàn)是一個(gè)抽象類人断,我們必須要找到實(shí)現(xiàn)類,一般來講我們可以搜索(ctrl + F)找到其創(chuàng)建實(shí)例的地方:
是紅色的朝蜘,這個(gè)時(shí)候我們再也沒法往里面跟了(一碰到紅尷尬癥就犯了恶迈,腎得慌),碰到這種情況我們可以試試全局的搜索(雙擊 shift)
但很多情況下我們?nèi)炙阉饕菜阉鞑坏角畚瘢酉聛斫o大家介紹第二個(gè)工具蝉绷,我們可以在線瀏覽源碼閱讀:http://androidxref.com 這里面不光有 Java 層的源代碼還有 native 層的源代碼
在線查看一般都是比較精確要看哪個(gè)類的時(shí)候,并不能滿足我們快速查看的需求枣抱。我就想在 Android Studio 中看熔吗,可以不斷快速的往下跟進(jìn)。其實(shí)我們在下載 sdk 的時(shí)候一般都會(huì)下載源碼佳晶,只不過剛好 android.jar 包中沒有這個(gè) class 類的源碼桅狠,所以我們才找不到而已。這個(gè)時(shí)候我們需要一個(gè)比較完整的 android.jar ,用來替換我們 sdk 中的 android.jar 文件中跌,關(guān)鍵是這個(gè) jar 怎么來咨堤?最好的方式是自己去編譯,但很多哥們可能覺得自己編譯成本高漩符,那么我們也可以去 github 上下載一喘。https://github.com/anggrayudi/android-hidden-api 把原來的保存一份改下命名,把下載的復(fù)制進(jìn)去嗜暴,然后重啟 Android Studio 再去看看凸克,發(fā)現(xiàn)不僅沒有報(bào)紅而且可以點(diǎn)擊了。
到后面這些還是無法滿足我們的需求闷沥,比如現(xiàn)在我們已經(jīng)把 C++ 進(jìn)階學(xué)完了萎战,我想跟到 native 層的源碼去看看,比如去看看底層的 Binder 驅(qū)動(dòng)舆逃,或者去看看類的加載機(jī)制蚂维,我再送大家一個(gè)鏈接,里面所有的源碼基本都能找到:https://pan.baidu.com/s/1tGtBt5Y1G50yI10EkVRPAw
再啰嗦幾句路狮,如果我們對(duì)源碼非常感興趣虫啥,我建議大家還是自己去編譯源碼,這樣我們就可以利用 Android Studio 去調(diào)試跟蹤源碼览祖,屢試不爽孝鹊。
二.前輩力量
文章的開頭有提到,沒有人一上來就可以看得懂源碼展蒂,我們都是從 Hello World 開始的又活,所以沒有什么捷徑可以走,無非就是看我們誰花的時(shí)間多锰悼,誰更愿意折騰柳骄。別看網(wǎng)上有很多大牛寫了很多分析源碼的文章,但其實(shí)他們都是經(jīng)過反復(fù)折騰箕般,才能寫出那一篇形如流水卻很抽象的文章耐薯。所以我們寫了那么多分析源碼的文章,錄了那么多直播課程丝里,無非就是我們在背后花了很多時(shí)間而已曲初。只要你愿意我能行的,你也能行杯聚。
當(dāng)然剛一開始我并不建議大家自己去看源碼臼婆,我記得自己第一次看源碼的時(shí)候,點(diǎn)擊進(jìn)去是一臉蒙 B幌绍。所以剛一開始我們需要借助前輩的力量颁褂,跟著大牛的思路去看源碼故响,也就是大家通常所說的老司機(jī)帶帶我。
有幾點(diǎn)需要提醒大家是颁独,有些文章可能篇幅比較長彩届,要有耐心不斷反復(fù)的多看幾遍。當(dāng)然有時(shí)也不必在一棵樹上吊死誓酒,其他樹上也可以多試幾次樟蠕。其次我們找一些稍微靠譜一點(diǎn)的,閱讀量多一些的文章丰捷,排版稍微好點(diǎn)坯墨,圖文并茂的。最后病往,不管別人的文章寫得有多好有多清晰多牛掰,始終不是我們自己的骄瓣,也有可能存在 bug 停巷。這也是我為什么建議大家看閱讀量稍微高些的文章,因?yàn)橛袉栴}大家會(huì)評(píng)論提出來榕栏,會(huì)經(jīng)過很多次的修正調(diào)整畔勤。我們最好自己親身去實(shí)踐,自己做做筆記或者寫寫文章扒磁,把它真正變成自己的知識(shí)庆揪,這樣提升的速度是非常快的妨托,屢試不爽缸榛。
以下是一些源碼分析的文章,我們可以選擇性的挑一些啃一啃兰伤,如果文章看不太懂還可以看看直播視頻:
- JNI 基礎(chǔ) - Android 共享內(nèi)存的序列化過程
- 第三方開源庫 Glide - 源碼分析(補(bǔ))
- 第三方開源庫 Retrofit - 源碼設(shè)計(jì)模式分析
- 第三方開源庫 RxJava - 基本使用和源碼分析
- 第三方開源庫 EventBus - 源碼分析和手寫
- Handler通信 - 源碼分析和手寫Handler框架
- 編譯時(shí)注解 - ButterKnife源碼分析和手寫
- 源碼閱讀分析 - Window底層原理與系統(tǒng)架構(gòu)
- 源碼閱讀分析 - View的Touch事件分發(fā)
- 源碼解析 - View的繪制流程
- Android插件化架構(gòu) - 攔截Activity的啟動(dòng)流程繞過AndroidManifest檢測
- Android插件化架構(gòu) - Activity的啟動(dòng)流程分析
- Android進(jìn)程間的通信 - IPC(機(jī)制)Binder的原理和源碼閱讀
- 插件式換膚框架搭建 - setContentView源碼閱讀
- 插件式換膚框架搭建 - 資源加載源碼分析
- Android無限廣告輪播 - ViewPager源碼分析
三.慣用套路
每個(gè)人閱讀源碼的思路都會(huì)有些不一樣内颗,姿勢也會(huì)有所不同,下面我僅代表個(gè)人的觀點(diǎn)談?wù)勎业膽T用套路敦腔,假如我們想去分析 glide 這個(gè)開源庫均澳,假設(shè)現(xiàn)在網(wǎng)上的資料也沒法滿足我們了:
第一步會(huì)去畫 UML 時(shí)序圖,相信我們在分析 glide 源碼的時(shí)候符衔,剛開始可能連訪問網(wǎng)絡(luò)的碼頭都找不到找前。畫時(shí)序圖不光能防止我們沉入茫茫大海,還能讓整個(gè)加載顯示流程都非常清晰判族,好記性不如畫流程圖躺盛。
第二步會(huì)去畫 UML 類圖,每個(gè)第三方庫在其架構(gòu)設(shè)計(jì)上五嫂,都會(huì)有其值得借鑒的地方颗品。如 retrofit 這個(gè)開源庫肯尺,雖然類文件并不多,但里面的封裝解耦思想躯枢,都能夠在我們實(shí)際的開發(fā)過程中派上用場则吟。
第三步會(huì)去抓細(xì)節(jié),比如 glide 怎么壓縮適配圖片的锄蹂,緩存怎么處理的氓仲,是如何加載 gif 圖片的,怎么解析視頻封面的得糜。抓細(xì)節(jié)其實(shí)就是帶著問題去看源碼敬扛,我們在開發(fā)過程中遇到的很多疑問,源碼會(huì)給我們很多更好的解決方案朝抖。
第四步會(huì)去參考模仿啥箭,并不是建議大家去重復(fù)造輪子,比如我們知道了 IOC 的實(shí)現(xiàn)原理治宣,就能完美的解決 mvp 中多 prsenter 的情況急侥;清楚了 RxPermission 的實(shí)現(xiàn)方式我們就能很輕松的寫出類似 RxPay 和 RxShare 等等。
第五步會(huì)去反思現(xiàn)有的架構(gòu)設(shè)計(jì)侮邀,我們在寫項(xiàng)目的時(shí)候坏怪,往往由于時(shí)間的原因,只是考慮了怎么實(shí)現(xiàn)绊茧,能實(shí)現(xiàn)能按時(shí)上線就好铝宵。隨著業(yè)務(wù)的不斷修改增加,可能已經(jīng)沒有了高蛋白低脂肪华畏。當(dāng)然隨著經(jīng)驗(yàn)的增長考慮的也會(huì)多一些鹏秋,但仍然需要不斷的反思和學(xué)習(xí)碱鳞。
四.隨心所欲
當(dāng)我們閱讀了大量的源碼和第三方開源庫后勿侯,我們就能打通任督二脈,學(xué)習(xí)的速度會(huì)越來越快窘游。當(dāng)同事遇到一些棘手的 bug 况芒,我們能從源碼的角度去分析解決惜纸;一些難以實(shí)現(xiàn)的需求,我們也能很快的找到解決方案绝骚。這時(shí)我們要么是在大公司鍍金耐版,要么是在小公司做負(fù)責(zé)人,是真正的喜歡工作压汪、學(xué)習(xí)和折騰粪牲。