Framework到底該怎么學(xué)習(xí)?

作者:qing的世界

相信大家在找工作的時候,肯定或多或少都被面試官問到過安卓的八股文。比如ActivityManagerService(簡稱AMS),或者WindowManagerService(WMS) 怎么實現(xiàn)的啊,有些什么細(xì)節(jié)需要注意啊,View被加入到ViewRoot的流程啊等等。每每看到這些文章,教人怎么準(zhǔn)備安卓framework面試,我都覺得很痛心。。。

因為在我看來,對于應(yīng)用開發(fā)來說,面試考這些純粹就是扯淡,很有可能面試官自己也只是在網(wǎng)上看看文章,然后照本宣科的再去問面試者。這種現(xiàn)象其實說白了就是卷。因為面試的內(nèi)容已經(jīng)在app層挖掘完了,再想提高面試門檻就只能往深了挖。

安卓的系統(tǒng)framework的代碼就成了最好的替罪羔羊,因為framework的內(nèi)容足夠多。多到什么程度呢,你下載一套新的AOSP代碼可能都要一個小時,全量編譯就更不用說了,我自己每次開新的Repo都非常開心,因為我可以心安理得的邊看視頻邊等代碼下載了。所以在代碼量如此龐大的情況下,面試官想出什么問題都可以,只要你面試者有時間,我總可以問倒你。

但是這些代碼都是好代碼么?或者說安卓framework里面的所有代碼都值得面試者學(xué)習(xí)么?

答案是NO。這也是一個非常明顯的答案。

安卓的framework經(jīng)過快十二年的迭代,很多地方其實是又臭又長。比如臭名昭著的View class:

https://android.googlesource.com/platform/frameworks/base/+/a175a5b/core/java/android/view/View.java#15354

已經(jīng)演變成一個一萬五千行的類了。。。。。

很多地方不是不想優(yōu)化,而是沒人敢動,搞出問題了咋辦,你負(fù)責(zé)?

一不小心扯遠(yuǎn)了。。?;氐矫嬖嚨膯栴}。

那么對于有些面試官考到的八股文。那些考點,或者考點指向的代碼同樣也不是圣經(jīng)。他們很有可能只是谷歌的安卓團(tuán)隊在當(dāng)初定義的一些規(guī)則而已,在谷歌里面做安卓framework,或者說有權(quán)限能改安卓framework代碼的人數(shù)不勝數(shù),難道每個人都是天才,可以一點錯誤都不犯?顯然不可能。

那難道看framework源碼就一文不值了?那也肯定不是,前提是我們在看源代碼的時候能夠做到取其精華去其糟粕。

有的讀者肯定會說我站著說話不腰疼,話都可以說的好聽,具體怎么操作,我怎么知道什么是精華什么是糟粕?

在說具體怎么操作之前,我想先舉個反例。

源碼分析?

很多初學(xué)者一上來就雄心壯志,覺得要全面學(xué)習(xí)安卓系統(tǒng),起頭就開始讀源碼,或者看源碼分析:

這樣做的后果往往就是在起跑線就被勸退了。原因很簡單,當(dāng)你連framework某個類具體是干什么都不知道的情況下,就去讀源代碼,你是不會有動力的。這和很多學(xué)生剛剛畢業(yè),代碼還沒寫多少行就想開始看開源項目,學(xué)習(xí)源代碼一樣,基本上可以說沒有意義。

很多嘗試閱讀安卓源代碼的朋友,甚至連刷寫設(shè)備都沒試過,這怎么可能可以學(xué)到framework的精華呢。說白了,想不動手操作就學(xué)習(xí)源碼,也是一種偷懶的行為,以為自己學(xué)習(xí)很努力,其實都在做無用功。

刷機(jī)!

學(xué)習(xí)源碼的第一步,其實是刷設(shè)備。跟著官方教程,從第一步下載AOSP源代碼開始:

1、https://source.android.com/setup/develop

再到用AOSP源代碼build操作系統(tǒng):

2、 https://source.android.com/setup/build

最后把build好的系統(tǒng)image刷到手機(jī)上:

3、https://source.android.com/setup/build/running

學(xué)代碼?先修bug

最后,就是動手操作了。

落實到具體的操作就是,修bug?。?!

沒錯,學(xué)習(xí)任何龐大的框架,一個人都沒辦法從面到點的學(xué)習(xí),都是從點到面,從下到上。因為你不可能一開始就對全局都有認(rèn)識。

所以修bug就成了一個最好的切入點。安卓的AOSP有數(shù)不盡的bug,每天都會有一大堆進(jìn)入到bug tracker里面。Framework的bug tracker:

https://issuetracker.google.com/issues?q=componentid:192705+

大到系統(tǒng)fatal error,小到注釋沒加,都在里面。大家不要覺得參與進(jìn)去很難,我隨手一看,就找到一個簡直不能再弱智的bug:

https://issuetracker.google.com/issues/196574813

同樣的,這個解決它的code review,就一行改動:

https://android-review.googlesource.com/c/platform/frameworks/base/+/1799607

是不是頓時覺得自己也能參與到安卓的開源行動里面了?

只要有毅力,哪怕是自己解決不了,你都可以跟蹤一個你感興趣的bug,看看別人是怎么解決的,看看別人是怎么復(fù)現(xiàn)這個bug的,對自己也是有很大幫助的。至少,這樣的方式會比自己苦讀源碼要強(qiáng)。源碼分析不是不可以看,而是要用對的方式去看,比如把源碼分析的博文當(dāng)成一個字典,有遇到相關(guān)的bug的時候翻一番。

最后

最后的最后!我也不是說讓大家以后面試都不準(zhǔn)備了,而是提供另外一個平時可以學(xué)習(xí)的思路,兩手抓難道不是更穩(wěn) :)

正所謂知其然知其所以然,底層的實現(xiàn)龐大而又復(fù)雜,完全不用心去讀源碼很難將知識點深入理解。

這里給大家推薦一套學(xué)習(xí)路線,并附有相關(guān)《Android Framework核心知識筆記》,相信可以給大家提供一些幫助,有需要的朋友們也可以下載下來隨時查漏補(bǔ)缺。

如果需要這份《Android Framework核心知識筆記》,可以順手幫我點贊評論一下,有需要的朋友可以直接前往公號:Android開發(fā)之家免費領(lǐng)取

Handler

  • 宏觀理論分析與Message源碼分析
  • MessageQueue的源碼分析
  • Looper的源碼分析
  • handler的源碼分析
  • ……

Binder

  • 學(xué)習(xí)Binder前必須要了解的知識點
  • ServiceManager中的Binder機(jī)制
  • 系統(tǒng)服務(wù)的注冊過程
  • ServiceManager的啟動過程
  • 系統(tǒng)服務(wù)的獲取過程
  • Java Binder的初始化
  • Java Binder中系統(tǒng)服務(wù)的注冊過程
  • ……

Zygote

  • Android系統(tǒng)的啟動過程及Zygote的啟動過程
  • 應(yīng)用進(jìn)程的啟動過程
  • ……

如果需要這份《Android Framework核心知識筆記》,可以順手幫我點贊評論一下,有需要的朋友可以直接前往公號:Android開發(fā)之家免費領(lǐng)取

AMS

  • Activity生命周期管理
  • onActivityResult執(zhí)行過程
  • AMS中Activity棧管理詳解
  • ……

PMS

  • PMS的啟動過程和執(zhí)行流程
  • APK的安裝和卸載源碼分析
  • PMS中intent-filter的匹配架構(gòu)
  • ……

WMS

  • WMS的誕生
  • WMS的重要成員和Window的添加過程
  • Window的刪除過程
  • ……

如果需要這份《Android Framework核心知識筆記》,可以順手幫我點贊評論一下,有需要的朋友可以直接前往公號:Android開發(fā)之家免費領(lǐng)取

如果需要這份《Android Framework核心知識筆記》,可以順手幫我點贊評論一下,有需要的朋友可以直接前往公號:Android開發(fā)之家免費領(lǐng)取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容