參考文檔:http://linux.chinaunix.net/techdoc/beginner/2009/02/06/1060906.shtml
運行環境:Ubuntu8.10
1、構建交叉編譯環境
Android的預設硬體處理器是ARM的,因此我們需要在自己的host機器上構建交叉編譯環境。來到CodeSourcery,(http://www.codesourcery.com/gnu_toolchains/arm/download.html),點擊GNU/Linux對應的連結,再點擊IA32 GNU/Linux Installer連結直接下載。
把arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2解壓到一目錄下,如~/programes/。並加入PATH環境變數:
vim ~/.bashrc
添加:
ARM_TOOLCHIAN=~/programes/arm-2008q3/bin/
export PATH=${PATH}:${ARM_TOOLCHIAN};
儲存,並source ~/.bashrc
2、擷取核心源碼
http://code.google.com/p/android/downloads/list
注意該核心版本要與你選用的模擬器版本盡量一致。
下載後,解壓後得到kernel.git檔案夾:
tar -xvf ~/download/linux-2.6.25-android-1.0_r1.tar.gz
3、擷取核心編譯配置資訊檔
編譯核心時需要configure,而一般configure的選項很多,我們往往不知道需要那些選項。Android模擬器運行時,有一檔案/proc/config.gz, config.gz是當前核心的配置資訊檔,我們把config.gz擷取出來,解壓放到kernel.git/之下(改名為.config):
cd kernel.git/
emulator &
adb pull /proc/config.gz
gunzip config.gz
mv config .config
4、修改Makefile
修改195行:
CROSS_COMPILE = arm-none-linux-gnueabi-
將CROSS_COMPILE值改為arm-none-linux-gnueabi-,這是我們安裝的交叉編譯工具鏈的首碼,修改此處意在告訴make在編譯的時候要使用該工具鏈。
注釋562,563行:
#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
# $(call ld-option, -Wl$(comma)--build-id,))
將build id 值注釋掉,因為目前版本的android核心不支援該選項。
5、編譯
make
很快就編譯好,並產生zImage:
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
產生zImage大小為1.23M,android-sdk-linux_x86-1.0_r2/tools/lib/images/kernel-qemu是1.24M
6、用模擬器載入核心測試
cd android/out/cupcake/out/target/product/generic
emulator -image system.img -data userdata.img -ramdisk ramdisk.img -kernel ~/project/android/kernel.git/arch/arm/boot/zImage &
模擬器載入成功就OK了