分类: 嵌入式
2010-12-22 22:19:50
和标准的Linux开发流程一样,Android平台开发的一个很重要的基础工作就是对其内核的编译和移植。本文结合Android的开发文档以及本人的实践经验,简单介绍了Android内核的编译过程,希望有助于对内核移植感兴趣的开发人员。
Android作为Google公司推出的一款手机开发平台,其本身是基于linux内核的。Google提供的内核源代码中除了linux部分外,有很大一部分是与虚拟处理器Qemu和模拟硬件平台Goldfish相关的。所以如果想将Android移植到实际的硬件平台上需要将这部分代码剥离出来。当然这不是这篇文章的重点,我们现在的目的是要编译出一个可以在模拟器上运行的系统内核,那么,现在就开始我们的工作吧。[1]
系统环境:Ubuntu 8.04.4 LTS
交叉编译器:GNU Toolchain for ARM Processors
下载地址:
其中第一项选择ARM EABI或ARM GNU/Linux,第二项选择IA32 GNU/Linux TAR(直接解压的)即可。
Android内核源代码:linux-2.6.23-android-m5-rc14.tar.gz
下载地址:
1. 搭建交叉编译环境
1) 安装Android SDK:在这里主要的用途是从模拟器中提取配置文件.config,这个和编译标准Linux内核相同,以及运行编译好的Linux内核。我用的是自己的Android源代码下的模拟器,所以这一步省去。
2) 安装交叉编译器:将arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 解压,并把它目录下的bin目录放到PATH参数中。可以用export命令,我用的是直接修改.bashrc文件,在文件中添加
export PATH=$PATH:/media/disk/arm-2010q1/bin
ps:我的解压目录是/media/disk/
3) 解压缩内核源代码:将linux-2.6.25-android-1.0_r1.tar.gz解压。
2. 获取内核编译配置文件
交叉编译环境搭建好后需要得到android的内核编译参数的配置文件,该文件需要从android的模拟器中得到。启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件:adb pull /proc/config.gz
这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。将其移动至kernel目录,解压该文件得到config,将其重命名为.config,这样就可以跳过make config而直接得到Makefile所需要的内核配置文件。
gunzip config.gz
mv config .config
3 修改Makefile
Makefile文件在kernel.git文件目录下。
首先修改195行(可能由于版本的不同,行数会不同),将CROSS_COMPILE值改为arm-none-linux-gnueabi-,这是我们安装的交叉编译工具链的前缀,修改此处意在告诉make在编译的时候要使用该工具链。
然后修改第562-563行,将BUILD_ID值注释掉,因为据说目前版本的android内核不支持该选项。
4. 开始编译
在kernel.git目录下执行make
make完以后在arch/arm/boot会产生一个zImage
的镜像文件。
5. 运行该镜像
用命令emulator -kernel /media/disk/kernel.git/arch/arm/boot/zImage指定模拟器的内核。
运行了刚刚编译的Linux内核镜像,不过从感觉不出有什么差别,如何才能清楚地知道运行的是自己编译的镜像呢。
刚刚网上搜了下,原来有方法的:
http://blog.chinaunix.net/u/26691/showart_468007.html
而且感觉这篇日志是鼻祖,后来的貌似都是借鉴/实践他的。
启动模拟器后,用adb shell,然后cd 到proc目录,用命令cat version可以打印除kernel的信息。
|
然后再开一个原先用的模拟器,打印出它的内核信息:
|
发现它们的cpu信息也不同了。
cat cpuinfo
|
|