第四章 源代码的下载和编译
Android移植主要就是Linux內核的移植,而Linux內核的移植主要是Linux驅動的移植。為了開發和測試Linux驅動,需在Ubuntu Linux下搭建兩套開發環境:Android應用程序開發環境和Linux內核開發環境。需要對源代碼進行下載和編譯,由于Android源代碼包含了很多東西,如內嵌在Android系統中的應用程序的源代碼,Android SDK帶的各種工具的源代碼,Android NDK的源代碼,以及HAL源代碼,所以對Android源代碼的下載、編譯和測試過程比較復雜、繁瑣,在這里就先介紹相對比較簡單的下載和編譯Linux內核源代碼的方法和步驟。
下載的Android源代碼并沒有包含Linux內核源代碼,要想使用Linux內核,必須要單獨下載Linux內核源代碼,必須從Google提供的網址下載Android中使用的Linux內核源代碼。
1.下載Linux內核源代碼:執行命令“# git clone https://android.googlesource.com/kernel/common,git”可以下載最新的Linux內核源代碼,下載會花費較長的時間。下載完成后,在當前目錄下會有一個common目錄,進入該目錄,執行命令“# git branch -a”查看當前有哪些遠程版本庫。根據版本情況從版本庫導出最新的Linux內核,可以使用命令“# git checkout -b android-3.0 remotes/origin/android-3.0”導出Linux 3.0的內核。Google專門為Android模擬器提供了一個Linux內核goldfish,可以使用命令“# git clone http://android.googlesource.com/kernel/goldfish.git”下載該內核。下載完成后,進入goldfish目錄,執行命令“# git checkout -b android-goldfish-2.6.29 remotes/origin/android-goldfish-2.6.29”導出goldfish。
2.Linux內核源代碼的目錄結構,有arch,block,Documentation,drivers,firmware,fs,include等多個目錄。
3.安裝Android內核的編譯環境:在Ubuntu Linux下編譯Linux內核需要安裝交叉編譯器。交叉編譯器就是指在A架構的CPU上編譯可在B架構CPU上運行的程序。主要是因為編譯器無法在目標平臺上安裝或目標平臺性能較低,不得已才在性能較高限制較少的平臺上進行編譯。在編譯Linux內核之前,需配置Linux內核源代碼根目錄下的Makefile文件。打開Makefile,找到ARCH和CROSS_COMPILE,并將這兩個變量設置成如下值“ARCH ?= arm
CROSS_COMPILE?= arm-none-linux-gnueabi-”,其中ARCH變量表示將Linux源代碼編譯成可在ARM架構上運行的Linux內核。CROSS_COMPILE變量表示交叉編譯器的前綴。打開交叉編譯者的bin目錄,可以看到很多以arm-none-linux-gnueabi-開頭的命令,如arm-none-linux-gnueabi-gcc、arm-none-linux-gnueabi-gdb等。由于編譯Linux內核可能會使用很多這樣的命令,為了方便,Linux內核允許值只設置這些命令的前綴,就可找到相應的編譯命令。安裝交叉編譯器步驟如下:
? ①準備工作:將arm-linux-gcc-4.3.2.tgz文件和arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2文件復制到工作目錄
? ②解壓編譯器:使用命令
? ? “# tar zxvf arm-linux-gcc-4.3.2.tgz -C /
? ? ?# tar jxvf arm-none-linux-gnueabi-arm-2008q3-72-for-linux.tar.bz2 -C /”
? ? ?解壓兩個壓縮文件
? ③驗證交叉編譯器是否安裝成功,使用命令“# ls /usr/local/arm -l”④安裝libncurses5,為了配置內核make menuconfig,libncurses5可以為字符界面的Linux終端提供一個美觀的界面,使用命令“# apt-get install libncurses5-dev”
4.配置和編譯Linux內核:如果內核源代碼目錄是“/root/linux_kernel”,使用命令
“# export PATH=/root/compilers/arm-none-linux-gnueabi/bin:$PATH
# cd ~/linux_kernel
# make clean
# make”
編譯Linux內核,make clean命令用于清除大多讀由編譯生成的.o、.ko等文件,但保留配置文件。一般新下載的Linux源代碼根目錄都沒有.config文件,而這個文件決定了編譯生成的Linux內核由哪些功能和模塊組成。第一次拿到Linux內核時應先使用4個命令中的一個配置Linux內核,在Linux內核源代碼根目錄產生一個.config文件。在配置Linux內核前一般需確定自己的需求,需要什么樣的驅動模塊、是否支持調試、支持的CPU類型等。4個配置命令必須在Linux源代碼根目錄執行。
①make config:該命令以文本形式配置Linux內核。配置項后面中括號中的值是該配置項當前的值,如果中括號中有多個值,第一個是默認值,如果不設置,直接按回車就會保留默認值。
②make menuconfig:以字符界面風格的菜單形式配置Linux內核。配置界面后面帶“-->”的菜單項說明還有子菜單。按回車鍵就可進入子菜單。很多菜單項前面有中括號,里面可以是“M”或“*”,也可以為空。有的菜單項前的中括號里只能設置“*”或空。中括號里的值表明當前菜單項對應的Linux內核組件嵌入Linux內核的方式。[M]表示以模塊形式.ko文件動態安裝在Linux內核中。[Y]表示Linux內核組件會嵌入Linux內核。當Linux內核成功啟動后,這些組件會自動裝載。如果為空表明該Linux內核組件不會包含到當前的Linux內核中。通過按“M”鍵可以將中括號中的值設置成“M”,按“Y”可將中括號中的值設為“Y”。按空格鍵可以在[M]、[Y]和空格之間進行切換。最后通過Exit退出設置界面后,如果修改了設置項,會詢問是否保持剛才的設置。如果選Yes,則會根據剛才的設置重新生成.config文件。
③make oldconfig:與make config類似,也是以字符界面逐項要求用戶配置。但它顯示的要求用戶參與的配置項要比make config少。大多數配置項都會給出默認值,并不需要用戶進行配置。只有后面帶NEW的配置項才需要用戶配置,這些配置項都是當前Linux內核版本新加入的功能。
④make xconfig:以圖形界面形式配置Linux內核,使用了QT的共享庫,要執行此命令,必須安裝QT,可使用命令“# apt-get install libqt4-dev”。安裝完QT后,執行make xconfig。在界面中可以通過上面的保存安裝保存設置,也可以使用打開按鈕打開其它配置文件。在配置中有一項很重要,就是交叉編譯器的簽名。使用make menuconfig命令。成功編譯Linux內核后,會在<Linux內核源代碼根目錄>/arch/arm/boot目錄生成一個zImage文件。該文件就是Linux內核的二進制版本。可以直接使用zImage安裝到開發板上,也可以使用命令“# emulator -avd myavd -kernel /root/kernel/goldfish/arch/arm/boot/zImage”在Android模擬器中測試Linux內核,需要使用由goldfish編譯而成的zImage文件,myavd是一個AVD名稱。
轉載于:https://www.cnblogs.com/Horatia/p/5425556.html
總結
以上是生活随笔為你收集整理的第四章 源代码的下载和编译的全部內容,希望文章能夠幫你解決所遇到的問題。