標籤:

Android 源碼分析開篇

在心中謀劃已久的此事終於要開篇了,雖然遲了點,十年前沒有種的樹,就從現在開始種吧。

自 2014 年底從 Windows 開發轉向 Android 開發以後,到現在的兩年多時間裡,也陸陸續續看了一些強相關的書籍和教程,按我在豆瓣標記的時間順序:

  • 《Android Programming: The Big Nert Ranch Guide》
  • 《瘋狂 Java 講義》
  • 《瘋狂 Android 講義》
  • 《Android 軟體安全與逆向分析》
  • 《深入理解 Java 虛擬機》
  • 《Android Training》
  • 《Android 開發藝術探索》
  • 《Android 群英傳》
  • 《App 研發錄》

再加上平時在 GitHub 和掘金等技術社區的晃蕩,接觸過的資料其實也不少了,但回想起年初找工作的時候一些比較失落的經歷,自身存在一些很要命的問題,就是如自己一直也知道的那樣:

  1. 技術的廣度還可以,可深度不夠,不夠聚焦;
  2. 掌握的知識是散亂的,不成體系,禁不住往深了問。

這一方面歸因於自己的學習方式需要優化,技術書籍的學習不能只是通讀,精讀、主題閱讀和針對性的實踐總結一樣不能少;另一方面挑選書籍要更有目的性,最好是明晰的由淺入深的層次遞進;還有就是市面上流行的書籍和網路上的技術分享恐怕都無法讓我徹底改善這種情況。

這個尷尬的年紀,在一個個焦慮的夜晚,躺在床上聽著窗外偶爾傳來的狗叫,汽車的呼嘯,也會對自己吶喊,我不要做一個會用九種語言寫 Hello World 但無一精通的程序員,迫切需要 聚焦精通成體系

一切就從自己的工作內容最相關的業務與技術開始入手。業務相關的知識可以在工作時間來積累,業餘的時間裡,多 Read The F*cking Source Code,從優秀的源碼和設計里汲取營養。有 AOSP 這樣包羅萬象的寶藏在側,也無需糾結和尋覓到底應該看些什麼,裡面程序設計語言、設計模式、架構模式等等,應有盡有。

所以,最近計劃開始寫一系列 Android 源碼分析的文章,包括 Android 系統源碼及一些優秀的第三方類庫等等。這將是一個比較漫長的過程,需要一個脈絡,可選的方式是自底向上和自頂向下:

自底向上,一開始就是啃硬骨頭,理解各種底層概念和知識,對我這樣的選手來講,容易失去興趣,但是後期理解上層的東西更順暢,畢竟基礎知識點已經鋪墊好了。比如《老羅的 Android 之旅》,就是比較典型的採用這種方式的。

^ 難度n| ---n| / n| | |n| / |n| | |n| / |n| | |n| | +-----------------n|/n+------------------------->n 時間n

自頂向下,預計是需要從幾個熟悉的話題展開,充分下探之後,基礎知識大致鋪墊開,後面才會比較容易。這樣做的一個好處是比較有目的性,總是知道下一個步要去找些什麼,看些什麼;另一點是從熟悉的東西講起,前期曲線比較平滑。

^ 難度n| _n| _/ |n| _/ n| _/ n| / n| _/ |n| _/ n| _/ ----n|/n+------------------------->n 時間n

自認為沒有恆心與毅力像羅昇陽那樣自底向上面面俱到地把 Android 的各個方面都分析一遍,我的大致的思路是打算從我們最常用的一些類開始,自頂向下摸索,牽扯到哪些需要深入理解的知識點,就另開一篇詳細說明,這個過程類似 JVM 的 GC 中採用的可達性演算法,只要選好了 GC roots,無論是深度優先還是廣度優先,天長日久,總會覆蓋所有我們常用的技術及其內部的原理。

舉個例子,比如我第一篇打算分析 Toast 類,那由它展開可能會逐漸講到很多的話題:

Toastn|n|--- Handlern| |n| |--- Communicating with the UI threadn| |n| |--- Looper/Message/MessageQueuen| |n| |--- ThreadLocaln|n|--- Bindern| |n| |--- ServiceManagern| |n| |--- Inter-process communicationn| |n| |--- ...n|n|--- Update UI outside the main threadn|n|--- ...n

每介紹一篇,可能會發散出一些本篇中涉及但是沒有深入講解的知識點,留待後續補上,我將在文章最後把這些知識點列出來。在當前文章中需要提到的地方,就插個樁,留個盡量恰當的比喻在那裡,「把它當作 XXX 理解就好了」。

當暫時沿著某一個主題延伸不下去,又沒有找到合適的新主題的時候,就按一些比較有體系的主題來寫,比如「Android 里的設計模式」,可以單獨寫一個系列。

這樣做的目的,主要是想進行一些比較深入的學習和對過往知識的整理,將一個一個散落的知識點孤島串聯起來,讓它們成為我的技能戰鬥群,寫著應用代碼時能對錶面之下的原理瞭然於胸,減少寫代碼時對猜測和調試的依賴,對每一個我敢寫出來的技能點,都能自信滿滿地與人對談。

目前的計劃是按照我最近一段時間更新公眾號的頻率,大約十天更新一篇,閱讀源碼主要使用的工具和方式是:

  • GitHub 上的 android/platform_frameworks_base 等源碼配合 Chrome 插件 insight.io
  • 自己電腦上搭建的 OpenGrok 瀏覽 Android 7.1.2 源碼
  • androidxref.com/7.1.1_r

大致思路就是這樣,實踐一陣試試。不知道自頂向下的方法是否走得下去,要是實在不行,還是乖乖回去跟著老羅的腳步學習吧。

開篇,就當先立個 Flag 在這裡,萬一堅持做下去了呢,牛皮都不敢吹還哪敢做成什麼事啊,最次也「世上無難事,只要肯放棄」嘛。對此有興趣的朋友,請關注我的微信公眾號 isprogrammer,一起 Read The F*cking Android Source Code。

後續相關的系列文章,會在 GitHub 倉庫 mzlogin/rtfsc-android 匯總更新,歡迎關注,看我起高樓,或是啪啪打臉。

原始鏈接:Android 源碼分析開篇

推薦閱讀:

Android Design in CN

TAG:Android |