参考文章:

http://blog.csdn.net/flydream0/article/details/7070392


开发环境:

Mac OS X 10.6.8


关于如何下载Android4.0源码,请查看我的博客内另一篇文章(同样是图文教程):

http://blog.csdn.net/flydream0/article/details/7036156

如何编译Android4.0源码请看:

http://blog.csdn.net/flydream0/article/details/7046612


下面进入正题:

第一步:下载goldfish源码

假设Andorid源码目录为${WORK_DIRECTORY}=/Volumes/AndroidDisk/android_2.3.7_r1

在Android源码根目录下新建kernel文件夹

[html] view plain copy
  1. $mkdirkernel
  2. $cdkernel
下载源码:

[html] view plain copy
  1. $gitclonehttp://android.googlesource.com/kernel/goldfish.git

下载完毕如下图:

此时在kernel目录下会生成一个goldfish文件夹。进入此目录:

[html] view plain copy
  1. $cdgoldfish

此目录下有一个隐藏的目录.git,通过

[html] view plain copy
  1. $ls-al

可看到此目录:


查看所有分支:

[html] view plain copy
  1. gitbranch-a
如下图:


check out:

[html] view plain copy
  1. $gitcheckoutremotes/origin/android-goldfish-2.6.29


此时你会看到goldfish目录下会出现很多文件:

[html] view plain copy
  1. $ls

这个时候goldfish源码就已经下下来了,接下来的事情就是编译了.


第二步:编译goldfish

导出交叉编译工具目录到$PATH环境变量中去.

[html] view plain copy
  1. exportPATH=$PATH:${WORK_DIRECTORY}/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin
  2. // Mac OS X下环境目录设置不同,请注意改为darwin-x86
  3. exportPATH=$PATH:${WORK_DIRECTORY}/prebuilt/darwin-x86/toolchain/arm-eabi-4.4.3/bin

我们将使用上述这个目录下的交叉编译器 arm-eabi- gcc

然后在glodfish目录下用gedit打开Makefile文件,找到这两行文字:

 # ARCH ?= (SUBARCH) # CROSS_COMPILE?=

修改为:
ARCH ?= armCROSS_COMPILE     ?= arm-eabi-


[html] view plain copy
  1. $geditMakefile

注意:ARTH ?=arm,的arm后边不要有空格,不然就会出现如下类似错误:
Make:...../kernel/goldfish/arch/arm: Is a directory. Stop.
害我白白浪费了几个小时.

为了确保环境参数正确,接下来执行下面两条指令,否则有可能不能正常启动模拟器.
[cpp] view plain copy
  1. $sourcebuild/envsetup.sh//缺少这条指令,可能会导致无法编译通过
  2. $lunchfull-eng//缺少这条指令,可能会导致无法启动模块器,系统报无法找到AVD,并要求你创建AVD。

关闭gedit,接下来就开始make了,执行如下指令:
[html] view plain copy
  1. $makegoldfish_armv7_defconfig
  2. $makegoldfish_defconfig // goldfish_armv7_defconfig文件估计有问题,在make后无法启动模拟器,改成goldfish_defconfig就OK
  3. $make
注:用 $make goldfish_defconfig 这样配置也可以编译通过,模拟器也可以启动,但是Android的开机画机就显示不了,$adb shell也死活连不上,原因就是这个goldfish_defconfig这个配置文件问题.

提示:
$make goldfish_armv7_defconfig指令的意思是将目录WORKING_DIRECTORY/kernel/goldfish/arch/arm/configs/下的goldfish_armv7_defconfig文件内的Kconfig配置内容复制到WORKING_DIRECTORY/kernel/goldfish/目录下的.config文件中,.config文件是一个隐藏目录,保存着各个目录下Kconfig文件的配置.
Mac OS X上编译内核会在make过程中报错:缺少elf.h
scripts/mod/mk_elfconfig.c:4:17: error: elf.h: No such file or directoryscripts/mod/mk_elfconfig.c: In function ‘main’:scripts/mod/mk_elfconfig.c:9: error: ‘EI_NIDENT’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:9: error: (Each undeclared identifier is reported only oncescripts/mod/mk_elfconfig.c:9: error: for each function it appears in.)scripts/mod/mk_elfconfig.c:19: error: ‘ELFMAG’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:19: error: ‘SELFMAG’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:23: error: ‘EI_CLASS’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:24: error: ‘ELFCLASS32’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:27: error: ‘ELFCLASS64’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:33: error: ‘EI_DATA’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:34: error: ‘ELFDATA2LSB’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:37: error: ‘ELFDATA2MSB’ undeclared (first use in this function)scripts/mod/mk_elfconfig.c:9: warning: unused variable ‘ei’make[2]: *** [scripts/mod/mk_elfconfig] Error 1make[1]: *** [scripts/mod] Error 2make: *** [scripts] Error 2
解决方案: 这是因为 Mac 的 include 文件少了一个 elf.h
从网上(例如:http://www.rockbox.org/tracker/9006?getfile=16683)下载一个放到 scripts/mod 目录,并且修改 mod 目录里面引用了 elf.h 的两个文件(mk_elfconfig.c、modpost.h)就可以了。
最终结果如下图所示:


这样就表示编译成功了.

[html] view plain copy
  1. $lsarch/arm/boot/
可以看到zImage文件.


第三步:在模拟器中启动编译好的内核
  1. $exportPATH=$PATH:${WORK_DIRECTORY}/out/host/linux-x86/bin
  2. $exportANDROID_PRODUCT_OUT=${WORK_DIRECTORY}/out/target/product/generic
  3. $emulator-kernel${WORK_DIRECTORY}/kernel/goldfish/arch/arm/boot/zImage -debug-all

模拟器启动界面:



进入模拟器从设置里看版本信息:

从上图可以看出当前Android版本是4.0.1,内核版本是2.6.29,说明成功了.

同样也可以通过adb shell来查看内核版本信息,如下图:

[html] view plain copy
  1. $adbshell
  2. #cdproc
  3. #catversion



更多相关文章

  1. java中采用Pull解析器对XML文件进行解析
  2. Android系统文件目录结构
  3. 解决报错:The versions of the Android(安卓)Gradle plugin and G
  4. android addr2line使用
  5. android 使用ssh2协议登陆服务器客户端
  6. 更改Android(安卓)AppCompatRadioButton控件的样式和颜色
  7. 在ubuntu 14.04 编译android 2.3.1 错误解决办法
  8. Android(安卓)Studio中JNI使用的一些出现的错误及方法
  9. 【Android】安卓环境变量配置

随机推荐

  1. Android Container原理分析
  2. Android应用程序的默认最大内存值
  3. ionic cordova build android 打包巨慢,
  4. Android(安卓)把图片进行压缩
  5. Android(安卓)FFmpeg开发(三)JNI访问Java变
  6. Android(安卓)获取IMEI号码
  7. Android 设置默认桌面,默认应用,辅助功能
  8. Android源码学习之五-Android的IPC机制
  9. Android 动态加载APK--代码安装、获取资
  10. android利用websocket协议与服务器通信