Android進(jìn)階之旅 - 源碼閱讀的經(jīng)驗(yàn)總結(jié)

在長沙待的那些年枯冈,身邊所看到的大概可分為兩類人,一類是不斷反復(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í)庆揪,這樣提升的速度是非常快的妨托,屢試不爽缸榛。

以下是一些源碼分析的文章,我們可以選擇性的挑一些啃一啃兰伤,如果文章看不太懂還可以看看直播視頻:

三.慣用套路


每個(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í)和折騰粪牲。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市止剖,隨后出現(xiàn)的幾起案子腺阳,更是在濱河造成了極大的恐慌落君,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亭引,死亡現(xiàn)場離奇詭異绎速,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)焙蚓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門纹冤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人购公,你說我怎么就攤上這事萌京。” “怎么了宏浩?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵知残,是天一觀的道長。 經(jīng)常有香客問我比庄,道長橡庞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任印蔗,我火速辦了婚禮,結(jié)果婚禮上丑勤,老公的妹妹穿的比我還像新娘华嘹。我一直安慰自己,他們只是感情好法竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布耙厚。 她就那樣靜靜地躺著,像睡著了一般岔霸。 火紅的嫁衣襯著肌膚如雪薛躬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天呆细,我揣著相機(jī)與錄音型宝,去河邊找鬼。 笑死絮爷,一個(gè)胖子當(dāng)著我的面吹牛趴酣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坑夯,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岖寞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柜蜈?” 一聲冷哼從身側(cè)響起仗谆,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤指巡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后隶垮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體藻雪,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年岁疼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阔涉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捷绒,死狀恐怖瑰排,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暖侨,我是刑警寧澤椭住,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站字逗,受9級(jí)特大地震影響京郑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葫掉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一些举、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俭厚,春花似錦户魏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扛门,卻和暖如春鸠信,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背论寨。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工星立, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人政基。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓贞铣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沮明。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辕坝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,104評(píng)論 25 707
  • 電視連續(xù)劇《風(fēng)箏》觀后感: 英雄是無名的;誓言是無聲的荐健; 奉獻(xiàn)是畢生的酱畅;使用是免費(fèi)的琳袄; 尊嚴(yán)是沒有的;自由是妄想的...
    梅鶴樓主閱讀 3,252評(píng)論 0 2
  • 都鎮(zhèn)非老師作品 繾綣兩雞并徘徊 夫婦同心共喜悲 四海八荒不分離 生生世世永相隨
    獨(dú)酌月下閱讀 196評(píng)論 0 0
  • 是否有推薦的需求(玩原型前) 平時(shí)喜歡吃什么纺酸?日料窖逗、西餐、火鍋餐蔬? 推薦一家你認(rèn)為最好的一家日料(以上說的一個(gè)) 你...
    安西閱讀 261評(píng)論 0 0
  • 在生活中碎紊,我們聽到的每一首歌,看到的每一本書樊诺,都會(huì)帶給我們不一樣的感受和意義仗考。 最近我再聽陳奕迅的一首歌《讓我留在...
    李木木子子閱讀 419評(píng)論 0 4