1. 程式人生 > >Android核心原始碼下載與編譯

Android核心原始碼下載與編譯

構建Android Linux核心映像

git clone http://android.googlesource.com/kernel/goldfish.git

git bransh -a

git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

從原始碼樹下載下來的最新Android原始碼,是不包括核心程式碼的,也就是Android原始碼工程預設不包含Linux Kernel程式碼,而是使用預先編譯好的核心,也就是prebuilt/android-arm/kernel/kernel-qemu檔案

和一般的Linux系統開發流程一樣,Android平臺開發的一個很重要的基礎工作就是對其核心的編譯和移植。本文的目的就在於構建出可以在Android自帶的ARM QEMU模擬器上執行的核心映像,希望對於大家做核心的移植和系統構建有幫助。
如何取得Android原始碼,確保正確地拿到了Android kernel/common專案的Goldfish分支(該分支用於構建執行在emulator上的系統核心,而主線則是用於構建執行在實際裝置上的核心程式碼)上的核心程式碼。另外,需要提醒一下大家的是Android的sourcecode目前只能在Linux或者MacOS下做交叉編譯編譯,Windows並沒有被支援。Android對Linux Kernel做了不少的改進,比如新增對yaffs2檔案系統的支援,改進藍芽的支援,改進電源管理機制,以及為模擬器版本新增的Goldfish平臺等等,不過核心的編譯方式和標準的kernel並沒有區別。

1、準備編譯環境
儘管很多人安裝完Ubuntu後第一件事情就是裝上build-essential,不過我在這裡還是要提醒一下大家,另外做menuconfig的時候ncurses-devel庫也是必須的。執行以下命令,一次搞定:
sudo apt-get install build-essential ncurses-dev
2、準備交叉編譯工具鏈
Android程式碼樹中有一個prebuilt專案,包含了我們編譯核心所需的交叉編譯工具,如果你拿了完整的Android 1.5程式碼樹,它就會在prebuilt目錄下。如果沒有拿完整的程式碼樹也沒有關係,只要用Git clone一個或者到從GitWeb下載一個prebuilt專案,如果是從GitWeb下載的話記得解壓縮就行。
3、設定環境變數
把剛才下載的prebuilt中的arm-eabi編譯器加入$PATH
$export PATH=$PATH:/home/william/android-source/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin
設定目標arch為arm
$export ARCH=arm 
4、設定交叉編譯引數
開啟kernel目錄下的Makefile檔案,把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器
CROSS_COMPILE ?= arm-eabi-
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)–build-id,)) 註釋掉,並且新增一個空的LDFLAGS_BUILD_ID定義,如下:
LDFLAGS_BUILD_ID = 
下面的這段解釋來自
陳罡的blog
把它註釋掉的原因是目前android的核心還不支援這個選項。–build-id選項,主要是用於在生成的elf可執行檔案中加入一個內建的id,這樣在core dump,或者debuginfo的時候就可以很快定位這個模組是哪次build的時候弄出來的。這樣就可以避免,每次都把整個檔案做一遍效驗,然後才能得到該檔案的是由哪次build產生的。對於核心開發者來說,這是很不錯的想法,可以節約定位模組版本和其影響的時間。目前,該功能還出於early stage的狀態,未來的android或許會支援,但至少目前的版本是不支援的。
對這個–build-id選項感興趣的朋友,可以訪問下面的網址,它的作者已經解釋得非常明白了:
http://fedoraproject.org/wiki/Releases/FeatureBuildId
5、捆綁的SDK中獲得核心配置檔案
大家都知道,核心編譯中有一步make menuconfig,用於配置kernel,這裡我們可以先獲取官方的配置,如果必要的話再作改動。先啟動模擬器,然後通過adb pull命令(該命令用於從裝置上覆制檔案到本地)即可完成。
$adb pull /proc/config.gz  ~/
現在我們用gunzip把config.gz解開,把得到的config檔案移動到kernel source所在的目錄,然後重新命名為.config即可。
$ gunzip config.gz
$ mv config ~/sources/goldfish-kernel/.config
6、開始編譯
因為我們之前已經吧1.5_r1中的.config複製到了kernel目錄下,如果需要修改配置,可以使用
make menuconfig
修改並儲存配置,如果沒有特殊需要的話就可以直接用
make
命令來編譯核心了
7、測試生成的zImage
編譯核心的過程應該很順利,因為預設的配置對核心作了大幅的精簡,大約5~6分鐘就可以編譯完成了,會在最終會在arch/arm/boot目錄下面生成一個zImage,這個就是我們所要的執行在模擬器上的核心映像了。
下面我們就在模擬器中測試一下我們所生成的zImage。
emulator -avd avdName -kernel ./zImage
其中avdName可以是自己建立的AVD
,如果想輸出kernel log,請加上-show-kernel引數。一切順利的話,我們應該可以看到Android順利啟動了。通過adb shell,進去後 cat proc/version,可以看到版本資訊
關於為實際裝置編譯kernel
如果要為一個實際的裝置比如說G1重新編譯核心映像,步驟和上述為一個執行在模擬器上的核心映像步驟基本一致,只是所需要的原始碼應當來自主線而不是goldfish分支。另外,編譯完成以後載入映像的方式也不同,需要通過USB將映像燒入nand flash。