1. 程式人生 > >大牛們是怎麼閱讀 Android 系統原始碼的?

大牛們是怎麼閱讀 Android 系統原始碼的?

由於工作需要大量修改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自動補全非常給力.
  • 巨人的肩膀
    • 老羅的Android之旅: blog.csdn.net/luoshengy
      • 此老羅非彼老羅. 羅昇陽老師的部落格非常有營養, 基本可以作為指引你開始閱讀AOSP原始碼的教程. 你可以按照部落格的時間順序一篇篇挑需要的看.但這個系列的部落格有些問題:
        • 早期的部落格是基於舊版本的Android;
        • 大量的程式碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統處於什麼樣的位置.
    • Innost的專欄: blog.csdn.net/innost
      • 鄧凡平老師也是為Android大牛, 部落格同樣很有營養. 但是不像羅昇陽老師的那麼系統. 更多的是一些技術點的深入探討.
    • Android Issues: code.google.com/p/andro
      • Android官方Issue列表. 我在開發過程中發現過一些奇怪的bug, 最後發現這裡基本都有記錄. 當然你可以提一些新的, 有沒有人改就是另外一回事了.
    • Google: google.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的工具, 能夠幫你梳理看過的程式碼.
    • 想到了再補充.