android是什么就不用說了,android自從開源以來,就受到很多人的追捧。當(dāng)然,一部人追捧它是因為它是Google開發(fā)的。對一個程序員來說,一個系統(tǒng)值不值得追捧得要拿代碼來說話。我這里并不打算分析android的代碼,而是android的makefile,我想通過分析andorid的makefile來告訴大家如何寫makefile。
對于一個程序新手而言,好的IDE是他們追捧的對象。但當(dāng)他接觸的代碼多了之后,就會逐漸發(fā)現(xiàn)IDE不夠用了,因為有好多東西用IDE是不好做的,例如自動編譯,測試,版本控制,編譯定制等。這跟政治課上的一句話有點像:資本主義開始的時候是促進生產(chǎn)力發(fā)展的,但到了后來又成了阻礙生產(chǎn)力發(fā)展的因素了。如果一個程序不能擺脫IDE的限制(不是不用,而是要有選擇的用),那么他就很難提高。要知道,IDE和makefile代表了兩種不同的思想:IDE強調(diào)的是簡化計算機與用戶的交互;而makefile體現(xiàn)的是自動化。
對于一個一開始就接觸linux的人來說,makefile可能是比較容易學(xué)的(熟能生巧),對于一個一開始就接觸Windows的人來說,makefile就不太好學(xué),這主要是應(yīng)該很多時候會不自覺地去用Visual Studio(Visual Studio是個好東西,特別是它的調(diào)試)。不知道大叫有沒有這個的感覺:一個人如果先接觸c,再接觸java會比較容易點;如果一個人先接觸java,再接觸c,就會比較反感c。
這個先引用一下百度百科對makefile的一些描述:
一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復(fù)雜的功能操作,因為 makefile就像一個Shell腳本一樣,其中也可以執(zhí)行操作系統(tǒng)的命令。
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發(fā)的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數(shù)的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make??梢?,makefile都成為了一種在工程方面的編譯方法。
Make工具最主要也是最基本的功能就是通過makefile文件來描述源程序之間的相互關(guān)系并自動維護編譯工作。而makefile 文件需要按照某種語法進行編寫,文件中需要說明如何編譯各個源文件并連接生成可執(zhí)行文件,并要求定義源文件之間的依賴關(guān)系。makefile 文件是許多編譯器--包括 Windows NT 下的編譯器--維護編譯信息的常用方法,只是在集成開發(fā)環(huán)境中,用戶通過友好的界面修改 makefile 文件而已。 |
對于android而言,android使用的是GNU的make,因此它的makefile格式也是GNU的makefile格式。現(xiàn)在網(wǎng)絡(luò)上關(guān)于makefile最好的文檔就是陳皓的《跟我一起寫makefile》,這份文檔對makefile進行了詳細的介紹,因此推薦大家先看這份文檔(電子版可以到http://pipi.googlecode.com/files/How%20to%20Write%20makefile.pdf下載,陳皓的blog在http://blog.csdn.net/haoel)。
android最頂層的目錄結(jié)構(gòu)如下:
.
|-- Makefile (全局的Makefile)
|-- bionic (Bionic含義為仿生,這里面是一些基礎(chǔ)的庫的源代碼)
|-- bootloader (引導(dǎo)加載器)
|-- build (build目錄中的內(nèi)容不是目標所用的代碼,而是編譯和配置所需要的腳本和工具)
|-- dalvik (JAVA虛擬機)
|-- development (程序開發(fā)所需要的模板和工具)
|-- external (目標機器使用的一些庫)
|-- frameworks (應(yīng)用程序的框架層)
|-- hardware (與硬件相關(guān)的庫)
|-- kernel (Linux2.6的源代碼)
|-- packages (Android的各種應(yīng)用程序)
|-- prebuilt (Android在各種平臺下編譯的預(yù)置腳本)
|-- recovery (與目標的恢復(fù)功能相關(guān))
`-- system (Android的底層的一些庫)
本文將要分析的是build目錄下的makefile和shell文件,android的代碼是1.5的版本。
主要的目錄結(jié)構(gòu)如下:
1.makefile入門
1.1 makefile helloworld
1.2 用makefile構(gòu)建交叉編譯環(huán)境
1.3 makefile里面的一些技巧
2.android makefile分析
2.1 android shell分析
2.2 android build下的各個makefile分析
3. android其他目錄的android.mk分析
由于最近研究生要畢業(yè)了,得找工作了,所以可能分析有時候會間斷一兩天,望大家能夠諒解。
作為序的最后,大家先通過網(wǎng)絡(luò)的一些文章來了解一下andoroid的makefile。
1.Android build system
2.Android Building System 分析
3.Android Build System(介紹使用)
4. http://source.android.com/porting/build_cookbook.html