Traditional Recursive Make vs. Android Make
一般傳統 Building Environment 與 Android Building Environment 簡介
傳統 recursive make 與 Android 開發環境的比較。
我們在開發過程中深刻感受到 building environment 的重要性,若是有一個完善的 building environment,可以加快開發速度、縮短開發時程,達到事半功倍的目的。一個好的 building environment 能夠幫助開發人員處理環境參數及編譯行為等相關前置作業的設定、提供多人共同開發的環境、讓開發人員專注在研發上而不用顧慮因環境不同所衍生的相關問題,所以 building environment 在開發過程中是不可或缺的一環。
要建構一個好的 building environment 有一定的困難度,因為要考慮到實用性、跨平台、平行化編譯、編譯順序、重複編譯等問題,所以一般 building environment 都是為了特定目的而開發,並具備一定客製化的程度。
一般 building environment 以 Makefile 來控制編譯的行為,而 Android 的開發環境是以 Android.mk 來取代 Makefile 的角色。
若以樹狀圖表示開發環境的目錄結構,則一般傳統開發環境除了最末端以外的每個階層中最少會有一個 Makefile,由根目錄的 Makefile 以遞迴方式呼叫下一
個階層的 Makefile,透過此方式完成整個編譯程序。此架構的缺點是各階層之間的相依性太強,例如某階層的 Makefile 可能參考到上層甚至是根目錄 Makefile 中的參數等等,造成單一 Makefile 可能影響的縱深非常深,衍生 building environment 日後不易維護且通常無法獨立編譯某階層的某個元件等相關問題。
Android 的開發環境為一整合型的開發環境,它希望此環境下的套件能夠被獨立地編譯,如此增加平行化編譯的可行性,於是它改寫其中某些套件的編譯方式,希望它們能夠被獨立地編譯且減少相依性。此環境會將編譯時使用到的變數宣告、路徑位置、函數定義全部收集在 build/core 下,並使用各別的 Android.mk 來控制各套件的編譯行為。Android 開發環境的優點是在了解其規則的情況下,開發人員可以很方便地將自己的程式碼加入 Android 中,並在相對應的目錄下加入 Android.mk,而 Android 的開發環境會透過 Android.mk 來編譯相關的程式碼;但缺點是 Android 的開發環境為了達到這種後期開發的便利性,犧牲了部分編譯時間,犧牲的時間是耗費在尋找相關的 Android.mk。為什麼 Android 的開發環境有辦法聰明地找到開發人員新增的 Android.mk,而編譯新增的程式碼?因為在 Android 的開發環境中使用大量 Linux 的 find 指令,因此會對儲存裝置造成較大的負擔,所以開發Android 要儘可能準備高速或是分散式的儲存裝置,並搭配高階或是多核的 CPU 來加快開發速度。
若是想了解 Android 的 building environment,卻不知道從何著手時,可以參考 GNU Make 專案開發工具第三版,因為此書與我觀察到 Android 的 building environment 有部份雷同的概念。
發表迴響