Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android Makefile and build system 分析

Android Makefile and build system 分析

編輯:Android開發實例

前言:預計未來一致兩年內移動互聯網將會有很大的發展,必將孕育很多的機會,而Google 推出的Android 手機操作系統無疑將是移動互聯網中的明星。由於其是開源系統,很有必要對此進行深入研究。          工欲善其事,必先利其器。Makefile無疑是打開系統架構的一扇窗戶。但因Android的Makefile (build system)文件眾多,架構復雜,分析起來較為困難。本文梳理了build system的大致脈絡,希望對build system感興趣的同學們有所幫助。   1.   Android Makefile & build system 概述          Makefile文件用來告訴make命令需要怎麼樣的去編譯和鏈接程序。在編譯時,需要根據編譯環境和編譯目標選擇編譯工具,編譯參數,以及選擇編譯安裝哪些模塊。同時Makefile 指定了構建目標所需的依賴性以及生成規則。在Android中,主要的Makefile文件存在於build/core/目錄下,它的表現形式為多個後綴為mk的文件組成,也稱為build system。Android build system 主要有兩大部分構成:配置部分,目標構建部分。Build system的主流程文件為build/core/main.mk文件。         Android build system在設計中考慮了如下方面,具有良好的擴展性。 a)      增添子模塊編譯 b)      多CPU架構 – ARM/PPC(maybe)/X86(maybe) c)      多語言編譯 – C/C++/Java d)      多目標 – static lib/share lib/execute/Java/Java library e)      多發布版本        本文也將就圍繞這些特性做進一步分析。   2.     Build system 配置部分         配置部分主要完成以下幾個工作: a)      基於Android 產品的配置(product config):選擇構建安裝的運行程序 (user package) b)      設置target 等相關變量TARGET_ARCH, TARGET_OS, TARGET_BUILD_TYPE, TARGET_PREBUILT_TAG c)      根據編譯環境設置host等相關變量 HOST_OS, HOST_ARCH, HOST_BUILD_TYPE, HOST_PREBUILT_TAG d)      編譯target上運行程序所需的工具鏈及編譯參數設置,如linux-arm-cc,cflag,include目錄等。 e)      編譯host上運行程序所需的工具鏈及編譯參數設置。             下圖簡要介紹了Android build system的配置部分的主要構成及相互關系。     多發布版本的支持           Android 會被不同的廠商所采用,他們內置的packages(應用程序)相應也會有差別。AndroidProducts.mk文件即為Android build system提供給廠商的接口文件。通過此文件即可定義所需編譯和安裝的packages(也即應用程序)。缺省選項是generic。為了更容易的擴展,Android定義了基本package(core.mk)和通用package(generic.mk),通用package包含基本package。同時Android還實現了一個繼承函數(inherit-product)。通過繼承通用package,可以很容易的配置所需編譯和安裝的package。   多CPU架構的擴展         Config.mk文件中會設置combo_target為不同的變量,然後include select.mk文件。在select.mk文件中,會根據OS和CPU架構選擇相應的mk文件,在這些相應的mk文件中,又定義了編譯目標程序所需的工具鏈及編譯參數。目前從combo目錄下看,target上不支持PPC架構。但如果要想支持PPC架構的話,只需在combo目錄下創建PPC的mk文件,在其中定義工具鏈和參數即可。       3.    build system 目標構建部分           目標構建部分的主要工作就是選擇所需構建的目標,確定它們所需依賴的目標,然後根據規則來構建最終的目標。說起來簡單,可是在實際中就需要考慮很多問題了。 a) 作為一個設計優秀的Framework,如何方便的添加子模塊? b) 在Android系統中,有多種編程語言的存在,它們的編譯工具各不相同。即使同一種語言,如C語言,也存在host 和target的差別,編譯器也不同。如何選擇不同的工具進行模塊的構建? c) 在Android系統中,存在不同種類的構建目標:有可執行文件,static library, dynamic library,java library,java。如何構建這些不同的目標?           下圖簡要介紹了Android build system的構建部分的主要構成及相互關系                     在main.mk中,非常關鍵的一個步驟就是找到TOP目錄下所有Android.mk文件,並include 它們。在Include的過程中,就會確定子模塊的構建目標,類型,和規則。         Android.mk就是build system提供給子模塊的借口文件。Android.mk有下面幾個關鍵詞: LOCAL_SRC_FILES – 指定模塊的源文件 LOCAL_MODULE – 指定所需構建的目標名 include 構建類型對應的文件 – 例如想構建在target上運行的可執行文件,那就執行語句include $(BUILD_EXECUTABLE)。通過此語句可有如下結果:a) 指定構建目標的類型 b)確定構建此類型所需的工具及參數。         通過定義自己的Android.mk文件,再修改上述等變量,即可輕松的把自身模塊放入至build system中。           Main.mk 文件471行: include $(subdir_makefiles)         subdir_makefiles為TOP目錄下所有Android.mk文件的集合。語句雖短,可確是整個build system中最為重要的一條語句。無論有多少子模塊,無論構建模塊的目標類型,無論它是什麼語言所寫,就這一條語句,完成了這些紛繁復雜的工作。           是否似曾相識?Android.mk 就類似於build system提供的基類,LOCAL_MODULE,LOCAL_SRC_FILES,include構建類型文件等類似於基類提供的虛函數。通過繼承基類(Android.mk),重寫虛函數(重新定義LOCAL_等變量),遍歷子類集合調用虛函數(include $(subdir_makefiles)),完美的解決了本節開頭的問題。為Android build system提供了良好的可擴展性。   後記:         設計模式,架構並不僅存於OO的語言中(Java/C++)。即便如Makefile的類腳本語言,也可寫出如此之架構。設計的思想在於人,而不取決於他所用的工具。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved