怎樣著手研究 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 (做了一些修改,原文比較老了)
我個人經驗, 你可以小步前進
研究源碼的第一步,肯定是要有源碼開發調試環境。所以你可以先:
- 有一個nexus手機
- 有一個ubuntu14.4環境的電腦,或虛擬機。 (你所遇到的問題最少,如果你有信心能hold住很多問題,你也可以用OS X)
- 選擇一個好的梯子
- 下載源碼https://source.android.com/source/initializing.html
- 編譯源碼https://source.android.com/source/building.html
- 刷機到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]動畫的繼承關係
- 父類與子類共用的方法是什麼
- 子類比父類多的方法是什麼
- 子類重載了父類哪些方法
- 為什麼子類要繼承這個父類
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開發 |