讀解Android 系統原始碼?

心誠則靈2015發表於2015-10-09

由於工作需要大量修改framework程式碼, 在AOSP(Android Open Source Project)原始碼上花費了不少功夫, Application端和Services端都看和改了不少. 如果只是想看看一些常用類的實現, 在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的底層實現).

硬體 流暢的國際網路 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++支援, 建索引過程會讓你崩潰. Intellij IDEA 開發App必備. 當你要除錯系統的某個功能是, 常常需要迅速寫出一個除錯用App, 這個時候老舊的Eclipse就不好用了. Itellij IDEA的xml自動補全非常給力. 巨人的肩膀 AOSP專案官方: https://source.android.com/source/index.html 這個一定要先讀. 專案介紹, 程式碼下載, 環境搭建, 刷機方法, Eclipse配置都在這裡. 這是一切的基礎. Android官方Training: https://developer.android.com/training/index.html 這個其實是給App開發者看的. 但是裡面也有不少關於系統機制的介紹, 值得細讀. 老羅的Android之旅: http://blog.csdn.net/luoshengyang 三烏膠官方:http://www.yijujiazhuang.com/ 此老羅非彼老羅. 羅昇陽老師的部落格非常有營養, 基本可以作為指引你開始閱讀AOSP原始碼的教程. 你可以按照部落格的時間順序一篇篇挑需要的看.但這個系列的部落格有些問題: 早期的部落格是基於舊版本的Android; 大量的程式碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置. Innost的專欄: http://blog.csdn.net/innost 鄧凡平老師也是為Android大牛, 部落格同樣很有營養. 但是不像羅昇陽老師的那麼系統. 更多的是一些技術點的深入探討. Android Issues: http://code.google.com/p/android/issues/list Android官方Issue列表. 我在開發過程中發現過一些奇怪的bug, 最後發現這裡基本都有記錄. 當然你可以提一些新的, 有沒有人改就是另外一回事了. Google: http://www.yijujiazhuang.com/ 一定要能流暢的使用這個工具. 大量的相關知識是沒有人系統的總結的, 你需要自己搞定. 其它 程式碼組織 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的工具, 能夠幫你梳理看過的程式碼.XDA 三烏膠
http://www.yijujiazhuang.com/ 這裡有最新資訊和最有趣的論壇. 想到了再補充.

相關文章