您的位置:首页 > 移动开发 > Android开发

Android 内核源代码交叉编译

2011-08-02 13:46 429 查看
原文地址:/article/4761175.html

本文是在Ubuntu10.10系统上进行实践的。

1 因为我们需要Android的模拟器,所以需要安装Android的SDK,并创建AVD,

可以一次命名为AVD15,AVD22,AVD23,...

AVD15对应1.5,AVD22对应2.2,AVD23对应2.3,...

获取.config文件:

在启动模拟器AVD15:

$emulator -avd AVD15

$pull /proc/config.gz . //将/proc/config.gz这个文件复制到本地的目录,对应Linux上运行该命令的当前工作的目录,下同

然后,将其解压并保存为.config,留待后面使用

2 arm编译器

网站下载arm工具链

注意选择较早的版本,很有可能是google那班人在编译的时候 选择的是当时的最新的版本,但是后来就一直用那个版本
http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite
要之前的版本:点击 All versions 即可看到所有的发行版本,2008q3-41这个版本是经过很多人测试可以用的。

解压后,设置环境变量,将/usr/local/arm-2008q3/bin 添加到$PATH中

其中 /usr/local/为保存解压后的arm-tools-chain的根目录

3 下载Android的Linux内核

记住是Android的Linux内核(
git clone git://android.git.kernel.org/
kernel/common.git),而不是通用的Linuxe内核源码(
git clone git://android.git.kernel.org/kernel/linux-2.6.git
)

$ git clone git://android.git.kernel.org/kernel/common.git kernel-common

//其中 kernel-common为存放从代码库下来的代码的目录,下同

这一步是个漫长的等待...

$ cd ~/kernel-common

$ git branch

$ android-2.6.36

//这个随着版本的变化而变化

4 下载完Android的Linux内核源码,你会发现在/arch/arm/configs/下没有goldfish_defconfig这个文件,恩我们需要check_out gold_fish版本(模拟器的硬件配置就是Gold_Fish的)

$ cd ~/kernel_common

$ git branch -a

$ *android-2.6.36

remotes/origin/HEAD -> origin/android-2.6.36

remotes/origin/android-2.6.35

remotes/origin/android-2.6.36

remotes/origin/archive/android-2.6.25

remotes/origin/archive/android-2.6.27

remotes/origin/archive/android-2.6.29

remotes/origin/archive/android-2.6.32

remotes/origin/archive/android-gldfish-2.6.29

remotes/origin/archive/android-goldfish-2.6.27

//以上显示是目前看到的,将来的某个时候可以就有点不同了,甚至老版本的Branch 名字也会被修改

//故要特别注意

$ git checkout remotes/origin/archive/android-gldfish-2.6.29

//这个过程就快多了,等待下载完数据

//git 这个东西确实不怎么好用,还是想念Windows上TortoiseSVN

当下载完,你就能在kernel-common/arch/arm/configs/下看到goldfish_defconfig这个文件

5 编译

1)将1中的.config文件拷贝到 ~/kernel_common目录下

2)修改 ~/kernel_common目录下的Makefile文件(修改两处) -- 修改之掐最好备份下这个文件,因为如果你修改了这个文件 用git获取新版本的时候

会提示Makefile文件被修改

ARCH ?= arm //制定CPU的架构为ARM

CROSS_COMPILE ?= arm-none-linux-gnueabi- //arm编译工具前缀

3)

$ make goldfish_defconfig

$ make -j2 //现在的机器都是双核的,这样代码编译就快多了

编译最后两行信息:

OBJCOPY arch/arm/boot/zImage

Kernel: arch/arm/boot/zImage is ready

6 用我们刚刚编译成功内核启动模拟器(这样不会对原有的模拟器产生任何的影响)

$ emulator -avd AVD15 -kernel ~/kernel_common/arch/arm/boot/zImage

如果模拟器能起来,那说明成功了。

打开另外一个终端,这样就能解决上面的终端被占用的情况下,也能使用终端

$ adb shell

#cd /proc

# cat version

Linux version 2.6.29-00262-gb0d93fb-dirty (dream@dream-VGN-FW351J) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-41) ) #1 Fri Dec 24 12:31:28 CST 2010

# cat cupinfo

cupinfo: No such file or directory

# cat cpuinfo

Processor : ARM926EJ-S rev 5 (v5l)

BogoMIPS : 272.79

Features : swp half thumb fastmult vfp edsp java

CPU implementer : 0x41

CPU architecture: 5TEJ

CPU variant : 0x0

CPU part : 0x926

CPU revision : 5

Hardware : Goldfish

Revision : 0000

Serial : 0000000000000000

注: dream@dream-VGN-FW351J,其中的 dream为当前登录Ubuntu的用户名,而dream-VGN-FW351J是机器名

Sourcery G++ Lite 2008q3-41 这个就是arm tools chain的版本了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: