主题 : Android Linux kernel 编译环境 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 31666
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2010-11-03
最后登录: 2011-09-25
楼主  发表于: 2011-01-31 22:53

 Android Linux kernel 编译环境

编译Linux内核映像
准备交叉编译工具
android 代码树中有一个prebuilt 项目,包含了我们编译内核所需的交叉编译工具。
注意:虽然Prebuilt 下包含了交叉编译工具,但是编译时有可能会出现“/bin/sh: arm-eabi-
gcc: not found” 这样的错误,因此最好从CodeSourcery 上面载用于交叉编译的工具链:
http://www.codesourcery.com/gnu_toolchains/arm/download.html
选择   EABI

解压缩交叉编译工具链:$ cd /usr/local/
$ sudo cp ~/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-
gnu.tar.bz2 arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-
gnu.tar.bz2
$ sudo tar jxvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-
gnu.tar.bz2

此时会解压出来一个叫做arm-2010q1 的一个目录,这里面就是工具链了。
设置一下环境变量:
gedit ~/.bashrc
export PATH=$PATH:/usr/local/ arm-2010q1/bin
export ARCH=arm
保存后,同步变化:
$ source ~/.bashrc
这样就不用重启了。
获得合适的内核源代码
$ cd ~/mydroid
$ git clone git://android.git.kernel.org/kernel/common.git   kernel
$ cd kernel
$ git branch
显示* android-2.6.27
说明你现在在android- 2.6.27 这个分支上,也是kernel/common.git 的默认主分支。
显示所有head 分支:
$ git branch -a
显示* android-2.6.27
remotes/origin/HEAD -> origin/android-2.6.27
remotes/origin/android-2.6.25
remotes/origin/android-2.6.27
remotes/origin/android-2.6.29
remotes/origin/android-goldfish-2.6.27
remotes/origin/android-goldfish-2.6.29
我们选取最新的android-goldfish-2.6.29,其中goldfish  是android 的模拟器模拟的CPU。
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ git branch
显示android-2.6.27
* android-goldfish-2.6.29
我们已经工作在android-goldfish-2.6.29 分支上了。
d)设定交叉编译参数
打开kernel 目录下的Makefile 文件,
1. ARCH        ?= $(SUBARCH)  改为:ARCH        ?= arm
2. CROSS_COMPILE ?= arm-none- eabi-
这个就是刚刚的下载和解压的工具链的前缀了,旨在告诉make,在编译的时候要使用我们的工具链。
. 把LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)–build-id,))
这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID 定义,如下:
LDFLAGS_BUILD_ID =
把它注释掉的原因是目前android 的内核还不支持这个选项。--build-id 选项,主要是用于在生成的
elf
可执行文件中加入一个内置的id,这样在core dump,或者debuginfo 的时候就可以很快定位这
个模块是
哪次build 的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的
是由
哪次build 产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。
目前,该功能还出于early stage 的状态,未来的android 或许会支持,但至少目前的版本是不支持
的。
所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译
的时候用了,
也只是一个空格而已。
e)编译内核映像
$ cd ~/android/kernel
$ make goldfish_defconfig
$ make
f)测试生成的内核映像
$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImag

用下面命令可以启动模拟器,使用新内核
./out/host/linux-x86/bin/emulator -system out/target/product/generic/system.img -sysdir out/target/product/generic -kernel ~/mydroid/kernel/arch/arm/boot/zImage -data out/target/product/generic/userdata.img
级别: 新手上路
UID: 31666
精华: 0
发帖: 9
金钱: 45 两
威望: 9 点
贡献值: 0 点
综合积分: 18 分
注册时间: 2010-11-03
最后登录: 2011-09-25
1楼  发表于: 2011-01-31 22:55
编译出来大概需要8G左右,最好不要在虚拟机的环境下测试,那样会很慢,要用很长时间,我是用硬盘装的UBUNTU系统里编译的用的时间就少些