大牛們是怎麼閱讀 Android 系統原始碼的?
阿新 • • 發佈:2019-02-13
由於工作需要大量修改framework程式碼, 在AOSP(Android Open Source Project)原始碼上花費了不少功夫, Application端和Services端都看和改了不少.
如果只是想看看一些常用類的實現, 在Android包管理器裡把原始碼下載下來, 隨便一個IDE配好Source Code的path看就行.
但如果想深入的瞭解Android系統, 那麼可以看下我的一些簡單的總結.
如果只是想看看一些常用類的實現, 在Android包管理器裡把原始碼下載下來, 隨便一個IDE配好Source Code的path看就行.
但如果想深入的瞭解Android系統, 那麼可以看下我的一些簡單的總結.
- 知識
- Java
- Java是AOSP的主要語言之一. 沒得說, 必需熟練掌握.
- 熟練的Android App開發
- Linux
- Android基於Linux的, 並且AOSP的推薦編譯環境是Ubuntu 12.04. 所以熟練的使用並瞭解Linux這個系統是必不可少的. 如果你想了解偏底層的程式碼, 那麼必需瞭解基本的Linux環境下的程式開發. 如果再深入到驅動層, 那麼Kernel相關的知識也要具備.
- Make
- AOSP使用Make系統進行編譯. 瞭解基本的Makefile編寫會讓你更清晰瞭解AOSP這個龐大的專案是如何構建起來的.
- Git
- AOSP使用git+repo進行原始碼管理. 這應該是程式設計師必備技能吧.
- C++
- Android系統的一些效能敏感模組及第三方庫是用C++實現的, 比如: Input系統, Chromium專案(WebView的底層實現).
- Java
- 硬體
- 流暢的國際網路
- AOSP程式碼下載需要你擁有一個流暢的國際網路. 如果在下載程式碼這一步就失去耐心的話, 那你肯定沒有耐心去看那亂糟糟的AOSP程式碼. 另外, 好程式設計師應該都會需要一個流暢的Google.
- 一臺執行Ubuntu 12.04的PC.
- 如果只是閱讀原始碼而不做太多修改的話, 其實不需要太高的配置.
- 一臺Nexus裝置
- AOSP專案預設只支援Nexus系列裝置. 沒有也沒關係, 你依然可以讀程式碼. 但如果你想在大牛之路走的更遠, 還是改改程式碼, 然後刷機除錯看看吧.
- 高品質USB線
- 要刷機時線壞了, 沒有更窩心的事兒了.
- 流暢的國際網路
- 軟體
- Ubuntu 12.04
- 官方推薦, 沒得選.
- Oracle Java 1.6
- 注意不要用OpenJDK. 這是個坑, 官方文件雖然有寫, 但還是單獨提一下.
- 安裝:
sudo apt-get install python-software-properties sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java6-installer sudo apt-get install oracle-java6-set-default
- Eclipse
- 估計會有不少人吐槽, 為什麼要用這個老古董. 其實原因很簡單, 合適. 剛開始搞AOSP時, 為了找到效率最優的工具, 我嘗試過Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最終結果還是Eclipse. 主要優點有:
- 有語法分析 (快速準確的類, 方法跳轉).
- 支援C++ (IntelliJ的C++支援做的太慢了).
- 嵌入了DDMS, View Hierarchy等除錯工具.
- 為了提高效率, 花5分鐘背下常用快捷鍵非常非常值得.
- 調整好你的classpath, 不要匯入無用的程式碼. 因為AOSP專案程式碼實在是太多了. 當你還不需要看C++程式碼時, 不要為專案新增C++支援, 建索引過程會讓你崩潰.
- 估計會有不少人吐槽, 為什麼要用這個老古董. 其實原因很簡單, 合適. 剛開始搞AOSP時, 為了找到效率最優的工具, 我嘗試過Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最終結果還是Eclipse. 主要優點有:
- Intellij IDEA
- 開發App必備. 當你要除錯系統的某個功能是, 常常需要迅速寫出一個除錯用App, 這個時候老舊的Eclipse就不好用了. Itellij IDEA的xml自動補全非常給力.
- Ubuntu 12.04
- 巨人的肩膀
- 老羅的Android之旅:
http://blog.csdn.net/luoshengyang
- 此老羅非彼老羅. 羅昇陽老師的部落格非常有營養, 基本可以作為指引你開始閱讀AOSP原始碼的教程. 你可以按照部落格的時間順序一篇篇挑需要的看.但這個系列的部落格有些問題:
- 早期的部落格是基於舊版本的Android;
- 大量的程式碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置.
- 此老羅非彼老羅. 羅昇陽老師的部落格非常有營養, 基本可以作為指引你開始閱讀AOSP原始碼的教程. 你可以按照部落格的時間順序一篇篇挑需要的看.但這個系列的部落格有些問題:
- Innost的專欄:
http://blog.csdn.net/innost
- 鄧凡平老師也是為Android大牛, 部落格同樣很有營養. 但是不像羅昇陽老師的那麼系統. 更多的是一些技術點的深入探討.
- Android Issues:
http://code.google.com/p/android/issues/list
- Android官方Issue列表. 我在開發過程中發現過一些奇怪的bug, 最後發現這裡基本都有記錄. 當然你可以提一些新的, 有沒有人改就是另外一回事了.
- Google:
https://www.google.com
- 一定要能流暢的使用這個工具. 大量的相關知識是沒有人系統的總結的, 你需要自己搞定.
- 老羅的Android之旅:
http://blog.csdn.net/luoshengyang
- 其它
- 程式碼組織
- AOSP的編譯單元不是和git專案一一對應的, 而是和Android.mk檔案一一對應的. 善用mmm命令進行模組編譯將節省你大量的時間.
- Binder
- 這是Android最基礎的程序間通訊. 在Application和System services之間大量使用. 你不僅要知道AIDL如何使用, 也要知道如何手寫Binder介面. 這對你理解Android的Application和System services如何互動有非常重要的作用. Binder如何實現的倒不必著急看.
- HAL
- 除非你對硬體特別感興趣或者想去方案公司上班, 否則別花太多時間在這一層.
- CyanogenMod
- 這是一個基於AOSP的第三方Rom. 從這個專案的wiki裡你能學到很多AOSP官方沒有告訴你的東西. 比如如何支援Nexus以外的裝置.
- DIA
- 這是一個Linux下畫UML的工具, 能夠幫你梳理看過的程式碼.
- 想到了再補充.
- 程式碼組織