1)系统环境:Ubuntu12.04
2)交叉编译器:arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar
(http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/)
3)Android内核源代码:linux-2.6.25-android-1.0_r1.tar.gz
(https://code.google.com/p/android/downloads/list?can=1&q=)
4)AndroidSDK:android-sdk_r11-linux_x86.tgz
(http://developer.android.com/sdk/index.html)
SDK 中带有AndroidEmulator仿真器等工具
在用户目录下建立一个anroid_kernel_compile的文件夹,把下载的Android kernel,交叉编译器和Android SDK 都放在此目录下。
将arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar解压缩到此目录,得到一个arm-2012.09的文件夹
将android-sdk_r11-linux_x86.tgz解压缩到此目录,得到一个android-sdk-linux_x86的文件夹
将linux-2.6.25-android-1.0_r1.tar.gz解压缩到此文件夹下,得到一个kernel.git的文件夹
$export PATH=$PATH:/home/xxx/android_kernel_compile/arm-2012.09/bin/ $export PATH=$PATH:/home/xxx/android_kernel_compile/android-sdk-linux_x86/tools/ $export PATH=$PATH:/home/xxx/android_kernel_compile/android-sdk-linux_x86/platform-tools/
xxx为你的用户名。
这个.config文件可以从SDK 中得到。
打开AndroidSDK and AVD Manager建立一个Android虚拟机:
$android
点击new,在name里填入adrd2.1WVGA800,下面参数target选择Android2.1-update1-APILevel7,Built-in选择Default(WVGA800),点击Create AVD
启动android模拟器,然后用adb 从模拟器中提出内核配置文件:
$emulator -avd adrd2.1WVGA800 & $adb pull /proc/config.gz ./
关闭模拟器,解压缩config.gz得到config,重命名为.config,并移动到kernel.git/下:
$gunzip config.gz $mv config kernel.git/.config
修改CROSS_COMPILE变量为:
CROSS_COMPILE=arm-none-linux-gnueabi-
这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。
在Makefile中注释掉LDFLAGS_BUILD_ID这个变量:
例如将如下定义:
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/ $(call ld-option,-Wl$(comma)--build-id,))
修改为:
LDFLAGS_BUILD_ID= #LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/ # $(callld-option, -Wl$(comma)--build-id,))
把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf可执行文件中加入一个内置的id,这样在coredump,或者debuginfo的时候就可以很快定位这个模块是哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。
目前,该功能还出于earlystage的状态,未来的android或许会支持,但至少目前的版本是不支持的。
所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,也只是一个空格而已。
对这个--build-id选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了:http://fedoraproject.org/wiki/Releases/FeatureBuildId
$make
在编译过程中,会提示你需不需要安装一些新的特性,这里算是可以裁剪的地方(仅限于新加的功能),按照自己的意愿选就可以了,全选n也没关系。
编译完成后在kernel.git/arch/arm/boot/路径下生成了一个zImage镜像文件,新功能全都没有加则编译后的大小为1.3m,我选择了一些功能,编译后大小为1.4m。
$ls kernel.git/arch/arm/boot/zImage -l -h -rwxrwxr-x 1 junluoyu junluoyu 1.4M 3月 6 21:30kernel.git/arch/arm/boot/zImage
运行该镜像
$emulator -kernelkernel.git/arch/arch/arm/boot/zImage -avd adrd2.1WVGA800 &
查看/proc下的version信息:
$adb shell #cat /proc/version Linux version 2.6.25 (junluoyu@juntu) (gcc version4.7.2 (Sourcery CodeBench Lite 2012.09-64) ) #2 Thu Mar 7 20:30:22 CST 2013
上面junluoyu@juntu是 用户名@主机名,这个是我的用户名和我的主机。
查看/proc下的cpu信息
# cat /proc/cpuinfo Processor :ARM926EJ-S rev 5 (v5l) BogoMIPS :419.43 Features :swp half thumb fastmult vfp edsp java CPU implementer :0x41 CPU architecture: 5TEJ CPU variant :0x0 CPU part :0x926 CPU revision :5 Cache type :write-through Cache clean :not required Cache lockdown :not supported Cache format :Harvard I size :4096 I assoc :4 I line length :32 I sets :32 D size :65536 D assoc :4 D line length :32 D sets :512 Hardware :Goldfish Revision :0000 Serial :0000000000000000
在虚拟机里查看版本信息:
[Settings]->[About phone]里可以看到:
裁剪主要是对.config文件进行修改,从而裁剪一些模块。
未裁剪前,包的大小为1.4M,裁剪后包的大小为1.2M:
$make menuconfig
以下是裁剪掉的模块:
1.General setup --->
(1)Promptfor development and/or incomplete code/drivers
这个是允许使用不完整的开发中的驱动,可以裁剪掉,去掉此勾选即可
(2)ControlGroup support
控制组管理支持,去掉此勾选
2.Userspacebinary formats --->
(1)Kernelsupport for MISC binaries
内核支持MISC格式的二进制文件,可以裁剪掉,去掉此勾选
3.PowerManagement options --->
(1)PowerManagement support
电源管理支持,去掉此勾选
4.Networking--->Networking options--->
(1)802.1d Ethernet Bridging.
(2)802.1Q VLAN Support
无线网,去掉此模块
5.DeviceDrivers --->
(1)Input device support--->
1)Providelegacy /dev/psaux device
去掉此勾选
2)Keyboards
键盘支持,去掉此勾选
3)Miscellaneous devices
去掉此勾选
(2)Network device support--->
1)Ethernet (1000Mbit)
2)Ethernet (10000Mbit)
千兆以太网和万兆以太网,去掉这两项的勾选
(3)USBsupport
USB支持,去掉此勾选
(4)MMC/SD card support
SD卡支持,去掉此勾选
(5)Android--->
1)Android log driver
安卓日志驱动,去掉此勾选
6.Filesystems--->
(1)Network File Systems
网络文件系统,去掉此勾选
7.Kernelhacking--->
(1)Kernel debugging
内核调试,去掉此勾选