当前位置:首页 >> 信息与通信 >>

android内核编译方法


android 内核编译方法
北京理工大学 20981 陈罡 google 的 android 很多人都希望在 gphone 没有出来之前,把它移植到相关的硬件平台上去。网上看了不少文章,总的感觉是:在这一步走 得最远的就是 openmoko 的一个大师级别的黑客 Ben “Benno” Leslie,他曾经试图把目前 google 发布的 android 移植到 op

enmoko 的平 台上去, 并且做了 10000 多行代码的尝试。 最终虽然由于 open moko 采用比较老的 arm 920t 的内核, android 采用较新的 arm926-ej-s 而 内核,而且使用了新的内核的一些新特性,导致移植失败,但是 anyway,他已经做了足够多的前期工作了,尔后的宣布成功移植 android 到 real target 板子上的人,大多是在他提供的 patch 的基础上继续走下去做出来的。 下面是一些有用的参考,希望有助于对此感兴趣的开发人员: (1)Ben “Benno” Leslie 的关于 andorid 移植到 openmoko 的个人博客地址: http://benno.id.au/blog/ (2)早期宣布成功移植 android 到 zauraus-sl-c760 的详细方法描述的链接: http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760/ (3)后续的根据上述先行者们的工作,成功移植 android 到 zauraus-c3000 的方法: http://androidzaurus.seesaa.net/article/74237419.html (4)本文是参考下面的 wiki,接合个人的实践写出来的,对原文的作者表示一下感谢: http://wiki.droiddocs.net/Compilation_of_Android_kernel 很羡慕这些人阿! 不过很可惜,偶的开发板是 s3c2410 的,恰好是 arm920t 的核心的。。。估计移植上去戏不是很大,需要重写很多代码,毕竟偶跟 benno 相差得太远太远了,同样是开发人员,差距咋就那么大呢?! (毕竟 google 仅仅开放了 kernel 的源代码而已,他们需要开放的东西还很多。) 在这里把关于 android 内核编译方法简单写一下,或许对希望移植内核的朋友能有些帮助: (看了 Benno 的移植过程以后,觉得即使你能够编译 google 开放出来的内核,意义也不是特别大,因为这个内核中加入了为了支持 qemu 的很多东西,而这些代码似乎对希望移植到真机上的朋友来说,没有任何意义,反而是一种阻碍)。 1)从 CodeSourcery 上面载用于交叉编译的工具链: http://www.codesourcery.com/gnu_toolchains/arm/download.html 我在这里选择的是->ARM GNU/Linux,以及 IA32-GNU/Linux。有文章说应该选择 ARM EABI,我不知道了,没有测试过,反正我选择的 这个编译的内核也是可以跑起来的:P 2)下载 google 的 android linux 的内核源代码: http://code.google.com/p/android/downloads/list 主要是这个文件:linux-2.6.23-android-m3-rc20.tar.gz

3)把下载到的内核和交叉编译工具解压缩,并最好把工具链的路径放到 PATH 里面去

解压缩内核: $ mkdir -p android $ cd android $ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz 会解压出来一个叫做 kernel 的目录,google 的 android 的 linux 内核就在里面了。 解压缩交叉编译工具链: $ cd /usr/local/ $ sudo cp ~/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 . $ sudo tar zxvf arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 此时会解压出来一个叫做 arm2007q3 的一个目录,这里面就是工具链了。 设置一下环境变量: $ export PATH=$PATH:/usr/local/arm2007q3/bin 好了,到此,基本的内核编译环境就搞好了。 4)现在是要得到 android 的内核编译参数的配置文件的时候了, 该文件需要从已经安装好的 android 的 模拟器 中得到才行。 所以安装 android 的 sdk 也是必须的, 这一步不太明白的朋友可以参考我以前发的 android 命令行体验的文章。 首先启动 android 模拟器,然后通过 adb 得到模拟器中提供的内核配置文件: $emulator & $adb pull /proc/config.gz . 这时候 adb 工具会连接模拟器,并从它里面下载一个叫做 config.gz 的文件到你的当前目录下。 把它拷贝到你的 kernel 目录: $cd ~/android/kernel $cp ~/config.gz . 解压缩该文件,并重命名为.config,这一步做了就可以跳过 make menuconfig 之类的内核参数设置 动作了。 $gunzip config.gz $mv config .config 5)修改 kernel 目录中的 Makefile 文件,用 emacs 或 vi 打开该 Makefile

修改 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)%,%,\ # $(call ld-option, -Wl$(comma)--build-id,)) 把它注释掉的原因是目前 android 的内核还不支持这个选项。--build-id 选项,主要是用于在生成的 elf 可执行文件中加入一个内置的 id,这样在 core dump,或者 debuginfo 的时候就可以很快定位这个模 块是 哪次 build 的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是 由 哪次 build 产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。 目前,该功能还出于 early stage 的状态,未来的 android 或许会支持,但至少目前的版本是不支持 的。 所以,用#注释掉即可,或者害怕不保险的话,就加入 LDFLAGS_BUILD_ID=空,这样即使编译的时候用 了, 也只是一个空格而已。 对这个--build-id 选项感兴趣的朋友,可以访问下面的网址,它的作者已经解释得非常明白了: http://fedoraproject.org/wiki/Releases/FeatureBuildId 6)终于可以开始 make 了。 $ make 不出意外的话,应该整个过程都会非常顺利,最终会在~/android/kernel/arch/arm/boot 目录下面 生成一个 zImage,这个就是我们要的内核映像了。

7)激动人心的时刻终于到来了,我们可以测试一下刚刚编译出来的内核可以不可以用了。 $emulator -kernel ~/android/kernel/arch/arm/boot/zImage 当看到 red eye 在晃来晃去,最终显示出来 android 的界面的时候,一颗悬着的心总算放下了。

android 的 proc 里面的 version 如下: # cat version Linux version 2.6.23 (wayne@wayne) (gcc version 4.2.1 (CodeSourcery Sourcery G++ Lite 2007q3-51)) #1 Sat Jan 19 18:11:44 HKT 2008 从这里就可以看出,这是自己编译的 kernel,而不是人家 sdk 里面自带的 kernel-qemu 了。 android 自带的 sdk 里面的 kernel 映像的 version 应该是: # cat version Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007 hoho, 这里不会把这个开发者的 email 暴露出来了吧。。。 android 的 cpuinfo 如下: Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 313.75 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 Serial

: 0000 : 0000000000000000

不过挺奇怪的,google sdk 自带的内核映像的 BogoMIPS 是 3.18 的,偶编译出来的是 3.13 的。
为了方便没有安装 sdk 的朋友也可以编译内核,我把 config.gz 贴上来: 文件: config.gz 大小: 5KB 下载: 下载 发表于: 2008-01-19,修改于: 2008-01-19 20:19,已浏览 6571 次,有评论 1 条 推荐 投诉

网友: joely.wu

时间:2009-02-06 20:33:34 IP 地址:202.111.5.★

你好,我按照斑竹的方法得到了 zImage,可是模拟器加载的时候只得 到一个黑屏就不动了,没有将 kernel 加载起来,是什么原因,谢谢。 stonlywu@163.com


相关文章:
Android系统内核编译开发图文教程中文版
Google Android 操作系统内核编译图文教程 和标准的 Linux 开发流程一样,Android 平台开发的一个很重要的基础工作就是对其内核的编译和移 植。本文结合 Android 的...
android内核编译教程_三星I9100内核编译教程
android内核编译教程_三星I9100内核编译教程_计算机软件及应用_IT/计算机_专业资料。android内核编译教程,以三星I9100为例 android 内核编译教程,以三星 I9100为例,...
编译Android内核源码
编译Android内核源码_计算机软件及应用_IT/计算机_专业资料。编译Android内核源码编译...解决办法就很简单,去掉多余的空格即可 我这里的错误是应为单词拼写错了 Android...
Android 内核编译
Android 内核编译_IT/计算机_专业资料。android移植教程Android 内核编译文章分类: 文章分类:移动开发 Android 作为 Google 公司推出的一款手机开发平台,其本身是基于 ...
Android(安卓)内核编译
Android 内核编译 1、从 CodeSourcery 上载用于交叉编译工具链: http://www.codesourcery.com/gnu_toolchains/arm/download .html 我在这里选择的是 ->ARM GNU/...
android 内核代码的获取,编译和使用
android 内核代码的获取,编译和使用_理学_高等教育_教育专区。嵌入式 1. 获取源代码 在 cd ~/myandroid/kernel 中执行以下命令 git clone git://android.git....
Android内核移植过程
在 kernel 目录下执行 make: $ make 除个别警告外编译过程一切顺利,最终在/...Android内核分析 4页 免费 Android 移植方法介绍 95页 1下载券 Android系统移植...
Android源码与Linux内核源码的获取与编译(2013-7-23 BY YC)
Android源码与Linux内核源码的获取与编译(2013-7-23 BY YC)_计算机硬件及网络_IT/计算机_专业资料。Ubuntu12.4与win7双系统安装,Android源码与Linux内核源码的获取...
Android linux内核介绍
base.c Android内核配置 Android 是基于 Linux 的 ,对于一个新的设备, 我们 首先要 编译一个支持 Android 的 Kernel ,那么如何 使 你的 Kernel Android 化呢?...
Android驱动开发示例及系统编译
//zhu.im/Android/ 更正式的源码编译方法,请参考官网:http://source.android.com/source/initializing.html 在 Ubuntu 上下载、编译和安装 Android 最新内核源代码...
更多相关标签:
android 内核编译 | android内核编译教程 | android6.0 内核 编译 | android 编译内核模块 | android内核源码编译 | android内核编译环境 | android 5.1 内核编译 | android 编译内核命令 |