前提:

按照上一篇博文介绍的配置好android编译环境《ubuntu 下载编译运行android source code--gingerbread》。

以免编译工具缺失造成编译失败。

下载配置编译工具:

可以使用android自带的编译环境,使用方法可以google一下。

本人使用的是第三方编译工具 Code Sourcery ARM EABI Toolchain

https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription3053

IA32 GNU/Linux InstallerIA32 GNU/Linux TAR
二选一即可,我使用的是 2011.03-42 版本,其他版本没有试过。

安装:

安装到 ~即可。

配置:

sudo gedit /etc/environment
增加路径到PATH
PATH=/home/yuchengliu/CodeSourcery/Sourcery_G++_Lite/bin:/home/yuchengliu/bin:
更新环境变量

source /etc/environment 


下载kernel源代码:

$ git clone https://android.googlesource.com/kernel/goldfish.git
下载完成功后发现代码目录中没有code,很是奇怪。

执行:

git branch

显示(没有记错的话是这么显示的,博文是编译成功之后写的,可能会记错):

* master

查看下所有的branch

git branch -a
显示:

* master  remotes/origin/HEAD -> origin/master  remotes/origin/android-goldfish-2.6.29  remotes/origin/master
下面切换到 goldfish这个branch

git checkout remotes/origin/archive/android-gldfish-2.6.29
一会之后,去代码目录中看看,果然代码都出来了,真是让人纳闷,非得这么搞才出来。

已经非常明确要拿goldfish的代码,非得多操作一步才行。

编译kernel代码:

修改kernel目录中的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

获取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

编译:

make

测试内核:

emulator -avd 2.3  -kernel android/kernel/google/goldfish/arch/arm/boot/zImage 
其中 2.3 为你创建的 avd的名称。

上图为证:

碰到的问题以及解决方法:

黑屏:

查看环境变量,确认是否有 ANDROID_PRODUCT_OUT="/home/yuchengliu/android/google/gingerbread/out/target/product/generic" 

这样的路径在你的环境变量中

env | grep "generic"
如果存在,删除掉,更新环境变量。如果还是不行就logout一次再login(为就是这么办的)。

再测试内核

emulator -avd 2.3  -kernel android/kernel/google/goldfish/arch/arm/boot/zImage 

更多相关文章

  1. Ogre3D 1.8.1 Android移植
  2. Android编译环境——ubuntu12.04上android2.3.4编译错误以及解决
  3. Android(安卓)SDK Manager 的介绍
  4. android 系统属性 build.prop
  5. android .apk 反编译
  6. Android(安卓)Studio编译失败:Error: Invoke-customs are only su
  7. 【Android基础】Android开发学习笔记
  8. ant编译android工程用批处理打包
  9. Android(安卓)运行 Linux 可执行程序

随机推荐

  1. android:padding和android:layout_margin
  2. Android开发方便快捷的8个好工具
  3. android:sharedUserId
  4. Android开发的重要方面之Makefile分析
  5. 关于Android的一些设计
  6. 第一部分:开发前的准备-第三章 Applicatio
  7. Android(安卓)TextView关于android:ellip
  8. Android之自定义式Style与Theme
  9. 如何使用Android(安卓)SDK开发Android应
  10. Android支持HTML标签