初學安卓framework系列 一 (怎麼科學的學習安卓系統的framework)

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

因爲在我看來,對於應用開發來說,面試考這些純粹就是扯淡,很有可能面試官自己也只是在網上看看文章,然後照本宣科的再去問面試者。這種現象其實說白了就是卷。因爲面試的內容已經在app層挖掘完了,再想提高面試門檻就只能往深了挖。

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

但是這些代碼都是好代碼麼?或者說安卓framework裏面的所有代碼都值得面試者學習麼?

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

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

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

已經演變成一個一萬五千行的類了。。。。。

很多地方不是不想優化,而是沒人敢動,搞出問題了咋辦,你負責?

一不小心扯遠了。。。回到面試的問題。

那麼對於有些面試官考到的八股文。那些考點,或者考點指向的代碼同樣也不是聖經。他們很有可能只是谷歌的安卓團隊在當初定義的一些規則而已,在谷歌裏面做安卓framework,或者說有權限能改安卓framework代碼的人數不勝數,難道每個人都是天才,可以一點錯誤都不犯?顯然不可能。

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

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

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

源碼分析?

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

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

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

刷機!

學習源碼的第一步,其實是刷設備。跟着官方教程,從第一步下載AOSP源代碼開始:

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

再到用AOSP源代碼build操作系統

  1. https://source.android.com/setup/build

最後把build好的系統image刷到手機上:

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

學代碼?先修bug

最後,就是動手操作了。

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

沒錯,學習任何龐大的框架,一個人都沒辦法從面到點的學習,都是從點到面,從下到上。因爲你不可能一開始就對全局都有認識。

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

https://issuetracker.google.com/issues?q=componentid:192705%2B

大到系統fatal error,小到註釋沒加,都在裏面。大家不要覺得參與進去很難,我隨手一看,就找到一個簡直不能再弱智的bug:

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

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

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

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

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

接下來的篇章

在今後的更新裏,我會把自己解決過,而且覺得有學習價值的bug寫下來,或者以小作業的形式要求大家對某些代碼進行改動讓大家可以在寫代碼,編譯,刷機,驗證在這個動手的過程中學習。在WearOS團隊工作大半年的感觸,就是對framework有了更多的瞭解,同時也向很多安卓framework早期的開發者學習了不少。

(比如谷歌很多在公司待了10年以上的老鳥,其中有一位大神叫dianne hackborn ,這位程序員可以說是安卓系統的殿堂級人物,谷歌裏面都有段子說,在安卓組裏面的一個成就是在內部技術論壇發問題是否有得到過Dianne的回覆,本人發過的兩個安卓問題都得到了Dianne大神的臨幸 0.0)

最後的最後!我也不是說讓大家以後面試都不準備了,而是提供另外一個平時可以學習的思路,兩手抓難道不是更穩 :)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章