標籤:

怎樣著手研究 Android 源代碼?


不需要全部了解,閱讀你感興趣或者與你工作相關的部分就可以了。比如:

頂層目錄:

.

|– bionic (bionic庫,Android的基礎庫)

|– bootable (bootloader, recovery等,ROM移植相關)

|– build (編譯和配置所需的腳本和工具)

|– dalvik (dalvik的Java虛擬機)

|– development (開發應用程序所需的模板和工具)

|– external (由其他平台移植過來的項目,對於移植工作是非常好的參考)

|– frameworks (應用程序框架層,請仔細閱讀此部分代碼,對於開發App會有很大幫助)

|– hardware (與硬體相關的庫,驅動開發相關)

|– kernel (linux內核)

|– out (編譯後生成的目錄,包含構建文件系統所需的文件)

|– packages (Android的原生應用程序,App開發者需要重點關注)

|– prebuilt (Android在各平台下編譯的預置腳本)

|– system (Android的底層庫)

`– vendor / device (設備相關的代碼,AOSP里不會有太多涉及,但是CM中卻是重點)

external目錄:

.

|– aes (ASE加密)

|– apache-http (網頁伺服器)

|– bison (自動生成語法分析器,將無關文法轉換為C,C++)

|– bluez (Linux下的藍牙工具)

|– bsdiff (diff工具)

|– bzip2 (壓縮工具)

|– clearsilver (html模板系統)

|– dbus (低延時,低開銷,高可用性的IPC機制)

|– dhcpcd (DHCP服務)

|– dosfstools (DOS文件系統工具)

|– dropbear (SSH2的伺服器/客戶端)

|– e2fsprogs (EXT2文件系統工具)

|– elfcopy (ELF複製工具)

|– elfutils (ELF工具)

|– embunit

|– emma (Java代碼覆蓋率統計工具)

|– esd (將多種音頻流混合在一個設備上播放)

|– expat

|– fdlibm

|– freetype (字體)

|– gdata (google的無線數據)

|– genext2fs

|– giflib (gif庫)

|– googleclient (google用戶庫)

|– grub

|– icu4c

|– iptables (防火牆)

|– jdiff

|– jhead (jpeg頭部信息工具)

|– jpeg (jpeg庫)

|– libffi

|– libpcap (網路數據包捕獲函數)

|– libpng (png庫)

|– libxml2 (xml解析庫)

|– netperf (網路性能測試工具)

|– opencore (多媒體框架,最讓人詬病的模塊,Andoird 4.0中已被 stagefright 取代)

|– openssl (SSL模塊,需要注意的是一定要靜態編譯此模塊,否則會出現兼容問題)

|– qemu (Android 模擬器,Android 4.0之前只支持 arm-eabi,現在已支持 arm-v7)

|– skia (SKIA圖像引擎)

|– sqlite (資料庫)

|– strace (調試跟蹤工具)

|– tcpdump (TCP抓包軟體)

|– webkit (瀏覽器核心)

|– wpa_supplicant (無線網卡管理)

|– yaffs2 (yaffs文件系統)

參考:http://www.cnrgb.com/android-source-code-structure (做了一些修改,原文比較老了)


我個人經驗, 你可以小步前進

研究源碼的第一步,肯定是要有源碼開發調試環境

所以你可以先:

  1. 有一個nexus手機
  2. 有一個ubuntu14.4環境的電腦,或虛擬機。 (你所遇到的問題最少,如果你有信心能hold住很多問題,你也可以用OS X)
  3. 選擇一個好的梯子
  4. 下載源碼https://source.android.com/source/initializing.html
  5. 編譯源碼https://source.android.com/source/building.html
  6. 刷機到nexus

這個第一步,你會經歷很多問題。在你嘗試解決,並成功解決後,會為你後續學習打下基礎。

你也會明白,源碼難,不光是源碼本書的龐雜,更是因為需要雄厚的的知識體系作為基礎,不然只能浮光掠影的看看基礎而已

研究源碼的第二步,可以選一些簡單的原生app練手

比如launcher,比如Calendar

不要看比較繁雜的Contacts、Gallery、Phone、MMS

可以熟悉google的java風格,了解編譯方式。順道看看Android.mk相關的原理

build目錄下的envsetup寫的不要太牛逼

研究源碼第三部,就可以深入java層的Framework的某一個部分了

從自己熟悉的、感興趣的東西看起。

比如binder、比如window、比如android啟動過程

binder比較推薦,雖然複雜,但是獨立,跟後續的步驟可以串起來。

這個時期,最好不要看Telephony,不要看繪製相關的(SurfaceFlinger)

有編譯環境, 你可以打開源碼中的log開關, 甚至添加一些自己的log, 去摸索 (網上binder的資料多得很)

研究源碼第四部,就可以看到hardware和driver了

比如binder, 在framework中的c++只是一個薄層和一些簡單的邏輯。在hardware,也很薄

這個時候, 你需要clone kernel的代碼了

然後看下binder在驅動中是怎麼工作的。 粗看就行,既然來知乎問這個,裡面的一些很麻煩的點,比如紅黑樹,了解就行。

這一步走完,你就會發現,很多很厲害的、很精華的東西,都在kernel裡面。

前面幾步走過之後, 對於源碼就會有個明了於心的脈絡,後續就可以根據喜好去鑽研某一部分。

前面幾步,說難,就難,很多時候,你需要去補充知識面,才能繼續下去。

前面幾步,說簡單,就簡單,你堅持,肯定能做到


現排名第一 @呂超 的回答比較適合做 Android 系統開發的朋友。

下文我給出的研究源碼的思路,比較適合做 Android App 開發的朋友。

1. 導入 Google Samples,記錄下 Android 所有組件/控制項

這一步一定要自己去讀 Google Samples 的源碼!然後一一記錄下你看到的組件/控制項,比如說 TextView,EditView,Preferences 等。

不要去讀 Google 文檔,不要閱讀書籍,不要閱讀其他人寫的文章。

好處有三:

  • 增加源碼的熟悉感
  • 閱讀到的是最新、最全、最對的東西
  • 溫故而知新,對 Android 老手更是如此

如果你不知道怎麼導入 Google Samples,可以看看這幾篇文章:

  • [Android Studio] 導入 ApiDemos 步驟

  • Android Studio 導入 samples 文件報錯解決方法

2. 畫出繼承關係圖

繼承關係可以自己通過『command + 滑鼠左鍵』點擊 extends class 一點點記錄學習。

也可以通過 Google 文檔搜索,直接看到繼承關係圖。

我強烈建議通過源碼學習記錄。

我們技術學習小組有幾個人寫了相關文章,可以看看:

  • [Android] View 的繼承關係

  • [Android] Google Design View的繼承關係

  • [Android]動畫的繼承關係

3. 先閱讀父類源碼,再閱讀子類的源碼

閱讀時需尋找及思考以下幾點:

  • 父類與子類共用的方法是什麼
  • 子類比父類多的方法是什麼
  • 子類重載了父類哪些方法
  • 為什麼子類要繼承這個父類

4. 了解設計模式

Android 源碼里充滿了設計模式,如果不了解設計模式就去讀源碼,會很吃力。

設計模式與源碼的學習是相輔相成的

5. 每一次的源碼閱讀都要寫篇通俗易懂的文章

請注意,要寫成通俗易懂的文章。

這樣做的目的是為了消化源碼,光看源碼是不能把源碼的知識點吃到肚子里。

只有把學的東西寫出來,並且寫的通俗易懂,才是真正的消化。

如果想寫技術文章,歡迎加入我們的技術學習小組,

技術學習小組會督促每個人每周寫一篇以上的技術文章,寫完文章後會有大神審核並告知改進之處。小組加入流程見個人簽名鏈接。


如果只看Java層的代碼,還是很簡單的,但是涉及到各種通訊以及系統調用,就需要熟悉unix編程,以及操作系統基礎知識了。再到驅動和boot的過程中就更是os的知識了,和安卓關係其實不大。當然安卓本身也是借鑒了*nix太多東西,如果是系統程序員,學習起來基本不費力氣。

如果是純做應用的開發,不建議太過深入,因為沒有基本的系統編程基礎,看了也是白搭。

另外安卓源碼也要區分著學習,其實也有很多坑,畢竟開發人員也是參差不齊。


首先你要先下載源代碼,比如我現在正在做的事情。


跟著 老羅的Android之旅博客 看


來,聽我說,《Android開發藝術探索》,《Android源碼設計模式解析與實戰》,去買,然後配合Everything+notepad++,然後把這倆本書所講解的每一個地方,去翻出源碼尋根問底,真不懂就google。弄好後也就差不多了,如果還想再深入(比如面試的時候強行裝一波逼,但其實以上的書已經完全夠了),那麼《深入理解Android內核設計思想》適合你,不過如果不去做framework層開發的話也沒必要看這麼深,有這個時間不如去學學各種開源框架,看它們的源碼比看內核的源碼有用多了(僅限應用層開發)


買一本書《深入理解android》這本書講的是關於android源碼相關學習方法


去mtk或者展訊上班


一般人是不具備研究全部代碼的能力的,如果要研究android的源代碼,不如先研究一下android開發,從開發中了解sdk,然後再看sdk的代碼,一般來說不需要靠linux kernel


如果不會科學上網,可以從這幾個方法看在線代碼:http://androidxref.com 或者 http://androidos.codingsky.com


推薦閱讀:

安卓培訓公司黑馬程序員怎麼樣?有必要參加安卓培訓嗎?可以自學嗎?
為什麼 Android 系統那麼多 ROM,這是必然的嗎,有必要嗎?
有哪些比較好的Android異常(crash、ANR、內存泄漏等等)處理機制?
請問如何調用谷歌翻譯API?
Android WebView 在開發過程中有哪些坑?

TAG:Android開發 |