系列文章索引面試
併發系列:線程鎖事markdown
新系列:Android11系統源碼解析源碼分析
Android11源碼分析:binder是如何實現跨進程的?(創做中)
Android11源碼分析:SurfaceFlinger是如何對vsync信號進行分發的?(創做中)
經典系列:Android10系統啓動流程
做爲一個基本上能夠說是從0開始起步讀源碼,到如今已經完成了一系列源碼剖析技術文章的做者來說,我以爲個人經驗仍是有必定的可借鑑性的
首先,我也是一個應用層開發者,我想大部分有「如何深刻framework源碼」這個疑問的,應該大都是應用層開發
那對於咱們來說,讀源碼最大的問題,實際上是沒有應用場景,或者說短時間來當作本高,收益底,容易半途而廢
針對這個問題,首先是要要有必定的定力和研究精神,打算拿下哪部分的源碼分析,即便遇到再多的問題,也要想辦法解決,本身定的目標,跪着也要完成 其次,就是從什麼方向入手,正如題主所說,源碼不少,ndroid11的aosp整個下載下來,有150G左右,因此找入手點很重要,不然只會把源碼下載完成以後就讓它在硬盤裏吃灰了
針對應用層開發來說,我這裏提供幾個面試比較常問,也比較容易上手的入手點
這裏看上去的4個小點,其實真正作起來至少要半年的時間,由於裏面涉及的內容既多又深,就第一點來說,Activity啓動流程就夠你搞至少兩週了,這裏面會涉及ActivityThread
,AMS
,Zygote
, Binder
跨進程調用等一系列知識
這裏再額外提一句,看到weishu大佬回答說不要關注各類流程的跟蹤,其實我是不認同的,固然這只是小弟我基於自身知識和認知的見解
對於廣大的應用層開發者也是同樣,咱們要明白自身的定位,小白走小白的路,大佬走大佬的路,我的認爲,不管是跟各類系統流程的調用鏈也好,仍是按系統服務去整塊梳理也好,這些都是「過程」,而咱們的目標,是深刻framework源碼,試問連調用鏈都沒跟過,怎麼深刻源碼?
固然,我也贊成weishu大佬說的,要分析其後面涉及的思想和原理,可是這是第二層了,沒有第一層的基礎就想幹第二層的事情,無異於空中樓閣,癡人說夢
回到正題上來,咱們已經搞定了從什麼地方入手,第二個要解決的問題是,咱們須要具有什麼樣的基礎,才能讀懂源碼,或者有能力去讀源碼
我的認爲,當你提出如何深刻學習Framework源碼這個問題的時候,你就已經具有了最基礎的條件--探索欲和求知慾。固然這個東西比較虛,我再講一些實在的
目前新版本的AOSP底層代碼基本上都用C++重構過了,所以若是你想深刻到native層,好比咱們最常提到的handler,其實在native層也有一套實現,取消息的時候會經過管道機制進行喚醒通知,避免死等阻塞問題 那是否是說咱們必需要先有C++或C語言基礎才能去讀源碼呢?我認爲,有基礎天然好,沒有也不會有太大影響,邊度邊補相關知識,可能比學完C++再來繼續讀源碼效率要更高
所以,在我看來,不論你基礎如何,只要有應用層開發經驗,有探索和研究Framework的興趣和慾望,這就夠了。只要開始,就是進步
第三點我要講的是,深刻到什麼程度是合適的。我在讀源碼的過程當中,常常會跟着單個調用鏈越挖越深,好比在研究系統啓動流程的時候,甚至到了虛擬機層面和彙編層面,可是通常來說,咱們不須要挖這麼深,一來是沒有必要,二來確實會花費大量精力,且很難見到成效
所以我在研究某個點的時候,會把這個點拆分紅一個個的小問題,舉一個具體的例子,在研究SystemServer相關流程的時候,我給本身提了這些問題
固然一上來可能提不出問題,或者不知道里面都涉及哪些重要的類,咱們能夠先閱讀相關文章,有個大概的思路,此時就能提出一些基礎的問題了,而後在閱讀源碼的過程當中再不斷提問和概括,這也是我寫源碼分析文章的步驟和思路
第四點,我要提到的就是,要有正向反饋。不少人不是沒有定力,但就是感受讀不下去,很大的緣由就是沒有正向反饋。個人正向反饋來自於個人文章產出,文章閱讀量和博客關注度,以及和小夥伴們能夠互相交流(但大多數時候,越深刻的方向,可交流的人越有限)
我也建議你們在學習framework的時候能夠多多交流,產出文章和成果,激勵本身繼續在這條路上走下去
第五點,須要提醒你們的是
若是你工做中有涉及相關內容(好比插件化,音視頻,launcher,setting,AudioManger等),請優先研究相關源碼
若是沒有涉及,你能夠參考我上面提到的入手點進行研究,只有你擁有了閱讀和研究的能力,才能更好的完成更有挑戰性的,甚至跨入Framework開發的行列當中
最後,在談一談閱讀源碼的好處吧,當你研究完一兩個模塊以後再來看,可能體會更深
正如weishu大神所講,研究framework的好處並不在於記住了哪些調用流程,這些不是目的(可是確實必不可少的過程哦!),咱們的目的是從更深的,或者說從更總體的視角來看咱們的技術 好比四大組件是咱們開發中最經常使用的,但fragment也是咱們開發中經常使用的,爲何它不能稱得上是「第五大組件」呢?
當我研究完四大組件的源碼以後,我發現了四大組件最大的特色--支持跨進程,他們的啓動流程都會涉及個人進程是否啓動了,是否須要先跟zygote通訊去fork出進程,而後再執行組件自身的啓動邏輯 所以四大組件的重量級是很重的,而frament只是依賴於activity的的一部分,遠達不到如此的重量級,所以也就天然不能成爲「第五大組件」了
再說回來,閱讀源碼的好處
最後的最後,若是你打算開始讀源碼了,能夠先看一些相關的文章,好比筆者的文章(狗頭)
我是釋然小師弟,若是本文對你有所啓發,請點贊支持下!咱們下篇文章再見啦!