google的android很多人都希望在gphone没有出来之前,把它移植到相关的硬件平台上去。网上看了不少文章,总的感觉是:在这一步走得最远的就是openmoko的一个大师级别的黑客Ben “Benno” Leslie,他曾经试图把目前google发布的android移植到openmoko的平台上去,并且做了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 : 0000 Serial : 0000000000000000
|
相关推荐
Android内核编译方法.pdfAndroid内核编译方法.pdfAndroid内核编译方法.pdfAndroid内核编译方法.pdfAndroid内核编译方法.pdf
### Android内核编译方法详解 #### 一、引言 随着移动互联网的快速发展,Android系统作为主流的移动操作系统之一,其开源性吸引了大量的开发者进行深入研究与定制开发。其中,Android内核编译是定制Android系统的...
### Android内核编译方法详解 #### 一、引言 随着移动互联网的发展,Android操作系统逐渐成为智能手机领域的主导系统之一。对于开发者而言,了解并掌握Android内核的编译方法至关重要,这不仅能帮助他们更好地理解...
Android 内核编译方法 Android 内核编译是 Android 软件开发中的一个重要步骤。本文将详细介绍 Android 内核编译的方法,并提供有用的参考资源。 首先,需要了解 Android 内核编译的背景。Google 的 Android 项目...
【Android内核编译】 Android内核编译是开发者为了定制或优化内核,实现特定功能,如在本文中提到的一加5手机的DC调光功能,所进行的一项技术操作。这项工作涉及到对源代码的处理,以及使用交叉编译工具链在不同的...
### 图解Google Android内核编译教程 #### 一、Android内核编译的重要性与背景 Android是由Google公司推出的移动操作系统平台,它基于Linux内核,具有高度的可定制性和扩展性。Android的成功很大程度上得益于其...
《Android内核编译手册》是一本专注于指导用户如何编译Android操作系统的内核的详尽指南。在Android系统中,内核起着至关重要的作用,它是连接硬件和上层软件的桥梁,负责管理和调度系统资源。对于开发者来说,理解...
【Android内核编译】是Android开发中一项高级任务,主要涉及操作系统的核心部分,用于定制和优化设备的性能。本文将详细介绍如何在Linux环境下编译Android内核,并在模拟器中运行。 首先,你需要一个合适的**工作...
如果你的公司专注于定制Android系统,并且在X86平台上运行,那么理解和掌握Android-x86内核编译的过程至关重要。这个过程包括多个步骤,涉及到源码获取、配置、编译以及生成最终的ISO镜像。 首先,你需要从Android...
本文将深入探讨“android内核交叉编译工具”的使用,以及如何配置和管理这些工具。 首先,交叉编译是针对不同架构的处理器进行编译的一种方法,因为Android操作系统可以运行在多种处理器架构上,如ARM、x86、AArch...
需要注意的是,一些手机内核编译还需要llvm-Snapdragon_LLVM_for_Android_6.0。 三、准备编译工作 在编译内核之前,我们需要安装一些必要的库和工具。这些库和工具包括git、ccache、automake、flex、lzop、bison、...
### Google Android操作系统内核编译教程 #### 一、前言 随着移动互联网技术的快速发展,Android系统作为全球最流行的移动操作系统之一,在智能手机和平板电脑市场占据着主导地位。对于开发者来说,掌握如何编译...
### Android内核编译知识点详解 #### 一、Android内核概述 Android作为一个开源的操作系统,其核心基于Linux内核。Google所提供的内核源代码不仅仅包括标准Linux内核的部分,还包括了与虚拟处理器QEMU和模拟硬件...
这篇教程旨在简化Android内核编译过程,帮助开发者理解内核编译的基本步骤,从而更好地进行系统级别的定制和优化。通过实践这些步骤,开发者能够更好地掌握Android系统的工作原理,为自己的项目打下坚实的基础。