Android Framework 如何學習,如何從應用深刻到Framework?|牛氣沖天新年徵文

系列文章索引面試

併發系列:線程鎖事markdown

  1. 篇一:爲何CountDownlatch能保證執行順序?併發

  2. 篇二:併發容器爲何能實現高效併發?app

  3. 篇三:從ReentrientLock看鎖的正確使用姿式ide

新系列:Android11系統源碼解析源碼分析

  1. Android11源碼分析:Mac環境如何下載Android源碼?post

  2. Android11源碼分析:應用是如何啓動的?學習

  3. Android11源碼分析:Activity是怎麼啓動的?ui

  4. Android11源碼分析:Service啓動流程分析lua

  5. Android11源碼分析:靜態廣播是如何收到通知的?

  6. Android11源碼分析:binder是如何實現跨進程的?(創做中)

  7. 番外篇 - 插件化探索:插件Activity是如何啓動的?

  8. Android11源碼分析: UI到底爲何會卡頓?

  9. Android11源碼分析:SurfaceFlinger是如何對vsync信號進行分發的?(創做中)

經典系列:Android10系統啓動流程

  1. 源碼下載及編譯

  2. Android系統啓動流程縱覽

  3. init進程源碼解析

  4. zygote進程源碼解析

  5. systemServer源碼解析

前言

做爲一個基本上能夠說是從0開始起步讀源碼,到如今已經完成了一系列源碼剖析技術文章的做者來說,我以爲個人經驗仍是有必定的可借鑑性的

如何深刻學習Framework源碼?

首先,我也是一個應用層開發者,我想大部分有「如何深刻framework源碼」這個疑問的,應該大都是應用層開發

那對於咱們來說,讀源碼最大的問題,實際上是沒有應用場景,或者說短時間來當作本高,收益底,容易半途而廢

針對這個問題,首先是要要有必定的定力和研究精神,打算拿下哪部分的源碼分析,即便遇到再多的問題,也要想辦法解決,本身定的目標,跪着也要完成 其次,就是從什麼方向入手,正如題主所說,源碼不少,ndroid11的aosp整個下載下來,有150G左右,因此找入手點很重要,不然只會把源碼下載完成以後就讓它在硬盤裏吃灰了

(上圖爲Android11的aosp源碼大小)

針對應用層開發來說,我這裏提供幾個面試比較常問,也比較容易上手的入手點

  1. 四大組件啓動流程
  2. 應用啓動流程
  3. 系統啓動流程
  4. 音頻相關內容

這裏看上去的4個小點,其實真正作起來至少要半年的時間,由於裏面涉及的內容既多又深,就第一點來說,Activity啓動流程就夠你搞至少兩週了,這裏面會涉及ActivityThread ,AMS ,Zygote, Binder跨進程調用等一系列知識

這裏再額外提一句,看到weishu大佬回答說不要關注各類流程的跟蹤,其實我是不認同的,固然這只是小弟我基於自身知識和認知的見解

對於廣大的應用層開發者也是同樣,咱們要明白自身的定位,小白走小白的路,大佬走大佬的路,我的認爲,不管是跟各類系統流程的調用鏈也好,仍是按系統服務去整塊梳理也好,這些都是「過程」,而咱們的目標,是深刻framework源碼,試問連調用鏈都沒跟過,怎麼深刻源碼?

固然,我也贊成weishu大佬說的,要分析其後面涉及的思想和原理,可是這是第二層了,沒有第一層的基礎就想幹第二層的事情,無異於空中樓閣,癡人說夢

回到正題上來,咱們已經搞定了從什麼地方入手,第二個要解決的問題是,咱們須要具有什麼樣的基礎,才能讀懂源碼,或者有能力去讀源碼

我的認爲,當你提出如何深刻學習Framework源碼這個問題的時候,你就已經具有了最基礎的條件--探索欲和求知慾。固然這個東西比較虛,我再講一些實在的

目前新版本的AOSP底層代碼基本上都用C++重構過了,所以若是你想深刻到native層,好比咱們最常提到的handler,其實在native層也有一套實現,取消息的時候會經過管道機制進行喚醒通知,避免死等阻塞問題 那是否是說咱們必需要先有C++或C語言基礎才能去讀源碼呢?我認爲,有基礎天然好,沒有也不會有太大影響,邊度邊補相關知識,可能比學完C++再來繼續讀源碼效率要更高

所以,在我看來,不論你基礎如何,只要有應用層開發經驗,有探索和研究Framework的興趣和慾望,這就夠了。只要開始,就是進步

第三點我要講的是,深刻到什麼程度是合適的。我在讀源碼的過程當中,常常會跟着單個調用鏈越挖越深,好比在研究系統啓動流程的時候,甚至到了虛擬機層面和彙編層面,可是通常來說,咱們不須要挖這麼深,一來是沒有必要,二來確實會花費大量精力,且很難見到成效

所以我在研究某個點的時候,會把這個點拆分紅一個個的小問題,舉一個具體的例子,在研究SystemServer相關流程的時候,我給本身提了這些問題

  1. SystemServer是如何被fork出來的
  2. SystemServer作了些什麼事情
  3. SystemServiceManager是負責什麼的?
  4. SystemServiceManager是如何建立的?
  5. ServiceManager是負責什麼的?
  6. 啓動服務有幾種方式?他們之間有什麼區別?
  7. SystemServiceManager和ServiceManager有什麼區別?
  8. LocalService是負責什麼工做的?
  9. SystemServer是服務端進程,那麼誰是客戶端進程?他們是如何通訊的?內部機制是什麼?(Binder相關的問題)

固然一上來可能提不出問題,或者不知道里面都涉及哪些重要的類,咱們能夠先閱讀相關文章,有個大概的思路,此時就能提出一些基礎的問題了,而後在閱讀源碼的過程當中再不斷提問和概括,這也是我寫源碼分析文章的步驟和思路

第四點,我要提到的就是,要有正向反饋。不少人不是沒有定力,但就是感受讀不下去,很大的緣由就是沒有正向反饋。個人正向反饋來自於個人文章產出,文章閱讀量和博客關注度,以及和小夥伴們能夠互相交流(但大多數時候,越深刻的方向,可交流的人越有限)

我也建議你們在學習framework的時候能夠多多交流,產出文章和成果,激勵本身繼續在這條路上走下去

第五點,須要提醒你們的是

若是你工做中有涉及相關內容(好比插件化,音視頻,launcher,setting,AudioManger等),請優先研究相關源碼

若是沒有涉及,你能夠參考我上面提到的入手點進行研究,只有你擁有了閱讀和研究的能力,才能更好的完成更有挑戰性的,甚至跨入Framework開發的行列當中

最後,在談一談閱讀源碼的好處吧,當你研究完一兩個模塊以後再來看,可能體會更深

正如weishu大神所講,研究framework的好處並不在於記住了哪些調用流程,這些不是目的(可是確實必不可少的過程哦!),咱們的目的是從更深的,或者說從更總體的視角來看咱們的技術 好比四大組件是咱們開發中最經常使用的,但fragment也是咱們開發中經常使用的,爲何它不能稱得上是「第五大組件」呢?

當我研究完四大組件的源碼以後,我發現了四大組件最大的特色--支持跨進程,他們的啓動流程都會涉及個人進程是否啓動了,是否須要先跟zygote通訊去fork出進程,而後再執行組件自身的啓動邏輯 所以四大組件的重量級是很重的,而frament只是依賴於activity的的一部分,遠達不到如此的重量級,所以也就天然不能成爲「第五大組件」了

再說回來,閱讀源碼的好處

  1. 就是在於對應用層開發能理解的更深入;
  2. 當遇到一些疑難問題的時候,咱們有能力經過讀源碼去深挖問題的緣由,並最終解決問題;
  3. 在於總體的閱讀源碼能力的提高,當咱們在看其餘三方庫源碼的時候,就會更駕輕就熟了,連AOSP這個近200G的龐然大物都能搞定,Okhttp在它面前簡直就是弟弟

最後

最後的最後,若是你打算開始讀源碼了,能夠先看一些相關的文章,好比筆者的文章(狗頭)

我是釋然小師弟,若是本文對你有所啓發,請點贊支持下!咱們下篇文章再見啦!

相關文章
相關標籤/搜索