Android移植主要就是Linux內核的移植,而Linux內核的移植主要是Linux驅動的移植。爲了開發和測試Linux驅動,需在Ubuntu Linux下搭建兩套開發環境:Android應用程序開發環境和Linux內核開發環境。須要對源代碼進行下載和編譯,因爲Android源代碼包含了不少東西,如內嵌在Android系統中的應用程序的源代碼,Android SDK帶的各類工具的源代碼,Android NDK的源代碼,以及HAL源代碼,因此對Android源代碼的下載、編譯和測試過程比較複雜、繁瑣,在這裏就先介紹相對比較簡單的下載和編譯Linux內核源代碼的方法和步驟。linux
下載的Android源代碼並無包含Linux內核源代碼,要想使用Linux內核,必需要單獨下載Linux內核源代碼,必須從Google提供的網址下載Android中使用的Linux內核源代碼。android
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。git
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文件複製到工做目錄測試
②解壓編譯器:使用命令google
「# tar zxvf arm-linux-gcc-4.3.2.tgz -C /es5
# 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名稱。