當前位置:
首頁 > 知識 > Android Framework 如何學習,如何從應用深入到Framework?

Android Framework 如何學習,如何從應用深入到Framework?

謝邀,不太贊同最高票的答案。


Android的功夫,在Android之外。


這句話我很認同,Android Framework只不過是對底層系統的封裝,要想深入理解它,必須熟悉JNI、讀得懂C++、理解Java虛擬機、Linux系統甚至彙編、指令集等等。但是,這並不意味著想要理解Android Framework就必須熟悉這些東西!逆命題與原命題並不是等價的。等你學完上述那些知識,Android說不定已經黃了(當然如果你真的掌握了這些,下一代操作系統是什麼已經不重要了)舉個例子,回想一下你小時候學習說話的時候,大人教你會先教你語法嗎?我可以肯定世界上所有的語言教育都不會這麼做,大家都是先教你喊爸爸媽媽,進而一些簡單的辭彙,然後一些簡單的句子,等你都熟練了,再讓你學習語法,一樣的道理。對於一個有一定語言知識的人,也是一樣,你學英語的時候,也是先學習how are you, I am fine, thank you的吧?如果一個領域對你來說是全新的,你就硬著頭皮去打基礎,有了一定的認知,再去通過你的元認知能力去深入學習。所以,我覺得不要等到萬事俱備的時候才去做某一件事,一旦決定去做,天亮就出發。

另外,我不覺得那些講源碼的書有多爛;要想搞清楚一個系統的構架、設計以及當時碰到的問題以及做出的抉擇,恐怕只有系統的設計者才能講的清楚;據我所知,按照這個觀點只有《C++的設計與演化》才能算得上所謂的「好書」。那些寫書寫博客的人,作為傳經佈道者,很有可能也無法理解某些設計——很多抉擇都是處於當時的特殊場景以及歷史原因;但是這並不妨礙他們給你講解這方面的知識。在看《深入理解XXX》這種書的時候,我有兩個經驗:


不要記那些所謂的API調用鏈,哪裡調用了哪裡,又從哪裡跳轉到了哪裡;根本沒用,而且你也記不住。你要思考以及關心的是,作者是怎麼跟蹤調用的?一個上千行的函數體,作者是如何知道哪裡是下一個關鍵入口的?比如從Java的native函數,如何找到正確的C++實現?一個Binder Client的調用,怎麼知道他的Server在哪裡?然後你自己可以嘗試跟蹤一下,看看自己會不會跟丟;如果你可以做到,那麼你差不多就可以自己分析源碼了。


既然你記不住細節,那麼你就需要理解,需要思考;想一想這裡為什麼這麼做,這樣實現是優雅還是謬誤,如果是你,你怎麼做?當然,並不是所有的地方都需要這樣,那些沒有味道的代碼,還是略過吧。把它當作參考書;自己理解一遍之後,再碰到這種問題,直接翻書,不要自己跟了浪費時間。


簡單總結一下就是,看那些講源碼的書或者博客的時候,除非你要了解某個細節,那麼不要過於關心那些複雜的函數調用鏈,學習跟蹤方法以及把握整理流程最為重要。Android源碼樹異常龐大,如果你想一行不漏地看,不可能;就算你這麼幹了,效果也不見得好——只見樹木,不見森林。打個簡單的比方,Activity的啟動流程,你不用關心在AMS裡面這裡跳到那裡是幹什麼,還有ActivityStack以及它的那個SuperXX跳來跳去是在搞毛,你需要了解的是:在Context裡面,通過AMS的Client ActivityManagerNative發起Binder調用進入system_server進程,在AMS裡面繞了一圈(處理Activity棧以及生命周期相關),然後通過IApplicationThread這個Binder調用回到App進程的Binder線程池,在線程池裡面通過Handler發送Message到App主線程,最終通過ClassLoader載入Activity類,創建對象,回調對應的生命周期,整個過程結束。

作為一個過來人,我很認同@Van BruceAndroid的功力在Android之外這個觀點;同時作為一個初學者,我也相信,要了解Android Framework也沒有想像中的那麼難。


扯了這麼多,來正面回答一下這個問題吧。


先糾正題主幾個錯誤:


1. 「沒有跳讀的習慣,每本書都想從頭看到尾」這個是絕對錯誤的,技術書與文學等其它類別的書籍不同,你沒有必要每一章都看,必須糾正這個習慣。第一,不是所有的書每一章每一節每一段每一句都是精華,花時間去看那些價值不大的,就是浪費時間;而且,越到後面,你需要掌握的知識以及要看的書也越來越多,個人壓根兒沒有精力也不可能全部看完;挑一些重點的,自己感興趣的看就可以了,如果你不知道什麼是重點,向前輩請教或者來知乎這種地方提問就行。


2. 「很多都不能充分理解,看著看著就看不動了」,這個也是不對的。沒有人能夠一看就懂,一學就會。都是一點點理解、摸索然後再融會貫通的;一次不理解沒有關係,多看幾次,慢慢就有感覺了。猶記得我當初不理解Binder,老羅的博客,《Binder設計與實現》還有源代碼,我前前後後完整地看了不下六遍;熟能生巧,如果你能把書中看到的,自己思考的,源碼裡面學到的這些散落的東西連成串,有了自己感覺,那麼前面就是通途了。

-------------------------------手動分割-------------------------------------


如何學習Android Framework?路只有一條:Read the f*cking source code。至於如何「平穩」過渡,其實我覺得學習曲線並沒有那麼陡峭——Android Framework的代碼不也是代碼?不理解是因為沒有整體把握而已。


不論是看書,看博客,你的最終目的只有一個「學會看源碼」,而不是「學會源碼」。關於如何閱讀源碼,這不是一個簡單的問題,我有幾點經驗:


看不懂的多讀。上面已經說過了,沒有人一學就會;特別是對於初學者,你剛看系統源碼,肯定一頭霧水;萬事開頭難,在你覺得艱深晦澀的時候,你就當在背課文;Android Framework的代碼時遵循一定規範的,你在背了一篇課文之後,再去讀別的課文,讀到一半的時候就算你看不懂,很有可能你就會知道下面要講什麼了,雖然下面要講的你也不懂。背熟了之後,你就可以想每一句是什麼意思了;而這裡面的「段落」、「句子」不就是普通的代碼嗎?就這樣,一步一步串聯起來,聚沙成塔,積少成多,就水到渠成了。「書讀百遍,其義自現」講的就是這道理。如果你真的想要學習Framework,一定要多讀,硬著頭皮讀,不要放棄,否則都是扯淡。


不重要的少讀。看不懂的很容易知道是什麼,那麼怎麼知道哪些代碼是不重要的呢?這裡有兩層意思:其一,強調的是大局觀,在初學習一個模塊的時候,你需要先把握整體,再了解局部;這個場景下,所有的細節都是不重要的。其二,那些真正不重要的邏輯;你剛學習的時候肯定沒有辦法知道哪些是影響不大的邏輯,所以你需要跟著書籍,博客,讓前人帶路;如果跟著它們的腳步走通了這條路,那你就自己獨立走一遍,這時候你肯定會走丟,然後你跟蹤、嘗試,接著到達終點;這時候你自然就知道,哪些重要,哪些不重要。

邊讀邊思考。學而不思則罔,思而不學則怠。帶著問題去閱讀源碼,這裡是什麼意思?為什麼需要這麼做?這樣的實現是優雅還是俗套?有沒有更好的實現辦法?如果我來寫,我會怎麼寫?諸如此類,有了思考就有了自己的理解。


不是所有的都需要思考。接上條,Framework的代碼也是人寫的,有精華,自然有糟粕,也有食之無味的。你不用對著每一段代碼都問個十萬個為什麼。一個問題通常有很多種解決方案,當時的設計者選擇目前這種實現,有兼容問題有歷史原因,還有它自己的理解;不是所有的實現在現在看來都是很好的實現,所以,追問這些問題很多時候都沒有意義,不要過度解讀。舉個例子,Android的IPC機製為什麼用Binder?也許有人說,Socket不安全,效率不夠高;共享內存使用不方便,等等。但是你去看看這個問題:為什麼 Android 要採用 Binder 作為 IPC 機制? - Android 開發你就知道,很多時候並沒有那麼多為什麼。


記得做筆記。做筆記的重要性在於,它可以記下你自己在某個階段自己的理解,當你更進一步的時候回頭再看當初的理解,想想哪裡是對的,哪裡又有問題,這是一個相當有意思的過程。我想每一個人在看自己之前寫的代碼,都會有在某個地方覺得自己是沙比的時候。根據你學習過程簡單總結一下,這樣你的元認知能力就得到了提升。


最後自薦一下我的博客:Weishu s Notes裡面有我對於Binder以及Framework的理解和學習過程,一定會有幫助 ^_^ 至於其它細節問題,可以參考一下我其他的答案。

最後,文明交流,拒絕撕逼。


請您繼續閱讀更多來自 知乎 的精彩文章:

中國航天火星計劃兩步走,第一步直接實現「繞,落,巡」,是不是太快了?
為什麼要在聚賢庄召開英雄大會對付喬峰?
有哪些流行的遊戲戰術是設計者肯定沒想到的?
保險投保時不查歷史病歷,理賠時再查,是否會出現涉嫌鼓勵帶病投保,出險就拒賠的釣魚情況?
為什麼老人睡眠時間短,起床早?

TAG:知乎 |

您可能感興趣

CrossOver Android讓你在英特爾Chromebook上運行Windows應用
Facebook,Messenger和Instagram將支持跨應用通知
Google公布可獲得Android應用的Chromebook名單
WordPress:如何應用Kubernetes和Portworx實現高可用和可擴展性
機能物料應用-Tricker』s x FilMelange 別注 Desert Boots
三星Chromebook Pro或將延期上市:Android應用支持不理想
We Play VR高峰會——如何做出優質的holographic應用?
蘋果NFC with reader mode成為現實,但你的應用準備好了嗎?
「Nintendo Switch Online」iOS應用已在App Store上架
首次應用 Jordan Trainer 2 Flyknit 正式發布!
如何開發部署Kubernetes Native應用
美翻了!Windows 10 PC端上的Office Mobile應用吃上了Fluent Design
Outlook群組功能開始推送至Outlook macOS、iOS和Android應用
Office應用現身Windows Store,但目前無法使用
Kali下安裝Shadowsocks與利用ss和ProxyChains實現任意應用代理
終於等到你:Microsoft Flow應用登陸Win10 Mobile
F-Secure 收購 Mac 安全應用 Little Flocker
Nintendo Switch Online移動應用偷跑
微軟證實應用商店更名 Microsoft Store,秋季 Creators Update SDK 發布