作者: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:
已經(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源代碼開始:
再到用AOSP源代碼build操作系統(tǒng):
最后把build好的系統(tǒng)image刷到手機(jī)上:
學(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)取