android开发环境搭建,内核编译

搞了三天,终于把这个环境搞出来,一个人摸索,在网上查资料,终于搞定了。但是模拟器跑起来真是慢。

PS:

http://developer.android.com/sdk/installing.html

https://sourcery.mentor.com/GNUToolchain/home

本机环境:

[root@bruce test013]# uname -a
Linux bruce 2.6.32-71.el6.i686 #1 SMP Wed Sep 1 01:26:34 EDT 2010 i686 i686 i386 GNU/Linux

一、jdk的安装

    官网下载安装文件,解压,然后配置环境变量:

# gedit /etc/profile,会弹出一个窗口,为profile文件的编辑窗口,在该文件的最后添加:

#set java environment
export JAVA_HOME=/home/bruce/tools/jdk1.7.0_01
export JRE_HOME=/home/bruce/tools/jdk1.7.0_01/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

上面的路径,请根据自己的机器进行修改

# source /proc/profile

测试:

[root@bruce test013]# java -version
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Server VM (build 21.1-b02, mixed mode)

安装完成。

二,交叉编译器(如果不需要编译内核的,可以不要安装)

https://sourcery.mentor.com/GNUToolchain/subscription?@template=request_eval&customer=24203

申请个免费的账号,可以下载,其中第一项选择ARM EABI或ARM GNU/Linux,第二项选择IA32 GNU/Linux即可。

我下载的是arm-2008q3,解压后, 得到 arm-2008q3

然后安装环境变量:

# gedit /proc/profile

#set arm-2008q3

 export PATH=$PATH:/usr/local/arm-2008q3/bin

这样就安装好了。

# source /proc/profile

二、eclipse安装

官网下载地址:http://www.eclipse.org/downloads/packages/eclipse-rcp-and-rap-developers/heliossr2

下载,解压,

准备启动脚本:#sudo gedit /usr/bin/eclipse

在文件中加入以下内容:如果已经有了, 则不要增加

#!/bin/sh

export MOZILLA_FIVE_HOME=/usr/lib/mozilla/

export ECLIPSE_HOME=/home/bruce/tools/eclipse

 $ECLIPSE_HOME/eclipse $*

上面的路径,请根据自己的机器进行修改。

修改该脚本的权限:# sudo chmod +x /usr/bin/eclipse

终端输入:# eclipse

可以启动了,完成,打开。


首先要按照如下方式添加updat site:

http://code.google.com/eclipse/docs/faq.html#wstinstallerror到install new softwall

对eclipse进行更新,这个会自动完成很多操作,比如依赖包的升级。下载SDK

三、安装ADT

可以通过eclipse-help-install new softwall 加载,也可以自己先下 载,由于网络原因,我是先下载安装包。下载地址:http://dl.google.com/android/ADT-0.9.6.zip,其实可以到官网下载最新的版本。安装好后,可以用android sdk manager 和avd进行操作。不同的版本,ADT的界面不一样,在ADT14后,android sdk managmer 与 avd的功能已经分开,请注意, 网上很多资料讲得都是14版本以前的。

四、对eclipse进行升级操作。这个会帮你完成一些ADT的操作,减少后面的很多错误的发生。

五、下载Android的SDK,解压,设置好环境变量tools,实际上这个SDK下载下来之后,只是一个空壳,没有SDK platform,只是 个引子。只有将其加入到ADT的开发目录中,通过ADT将其升级,下载真正的SDK platform,这个,ADT会自动完成。

1) 安装Android SDK: 将android-sdk_m5-rc14_linux-x86.zip解压缩到适当路径下即可使用。本文将其释放至/home/bruce/android_sdk_linux路径下,并将其tools路径添加到PATH中:

# gedit /proc/profile

#set android sdk

export PATH=$PATH:/usr/local/android_sdk_linux/tools

export PATH=$PATH:/usr/local/android_sdk_linux/platform-tools

 

六、设置好ADT开发目录,通过android sdk manager 升级SDK的 platform-tools,下载SDK platform,在这个过程中,要反复进行升级,其中的platform-tools,我是在add-on sites: 用来下载platform -tools。

七:创建AVD,虚拟设备,创建完成后,可以启动模拟器。

 

下面的内核的编译:

下载一个android的内核源码包,解压,自动生成一个kernel,

获取内核编译配置文件

交叉编译环境搭建好后需要得到android的内核编译参数的配置文件,该文件需要从android sdk 中的模拟器中得到。启动android模拟器,然后通过adb得到模拟器中提供的内核配置文件:

$emulator &
$adb pull /proc/config.gz

这时候adb工具会连接模拟器,并从它里面下载一个叫做config.gz的文件到你的当前目录下。将其移动至kernel目录,解压该文件得到 config,将其重命名为.config,这样就可以跳过make config而直接得到Makefile所需要的内核配置文件。

$ gunzip config.gz
$ mv config .config


此主题相关图片如下:

3.修改Makefile

首先修改第187行,将CROSS_COMPILE值改为arm-none-linux-gnueabi-,这是我们安装的交叉编译工具链的前缀,修改此处意在告诉make在编译的时候要使用该工具链。


此主题相关图片如下:

然后修改第519、520行,将build id 值注释掉,因为目前版本的android内核不支持该选项。


此主题相关图片如下:

4.开始编译

在kernel目录下执行make:

$ make

除个别警告外编译过程一切顺利,最终在/kernel/arch/arm/boot目录下面生成一个zImage,即为编译好的内核镜像了。

如果你使用的是gcc 4.3,那么很有可能会出现创建失败的情况,错误提示如下所示:
    ......
    ......
LD      .tmp_vmlinux1
kernel/built-in.o: In function `getnstimeofday':
(.text+0x1b2b1): undefined reference to `__umoddi3'
kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b36c): undefined reference to `__udivdi3'
kernel/built-in.o: In function `do_gettimeofday':
(.text+0x1b38f): undefined reference to `__umoddi3'
kernel/built-in.o: In function `timekeeping_resume':
timekeeping.c:(.text+0x1b520): undefined reference to `__udivdi3'
timekeeping.c:(.text+0x1b543): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bb9d): undefined reference to `__udivdi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bbc0): undefined reference to `__umoddi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc57): undefined reference to `__udivdi3'
kernel/built-in.o: In function `update_wall_time':
(.text+0x1bc81): undefined reference to `__umoddi3'
make: *** [.tmp_vmlinux1] Error 1

这个错误的原因是因为gcc 4.3在处理64位整数运算的时候出现的问题,解决的办法据我所知有两种,这里介绍其中一种.linux2.6.23.2目录下的Makefile文件中给变量CFLAGS_KERNEL赋值为:-fno-tree-scev-cprop,
改变值之后重新编译一次就OK.如果出现了undefined reference to `__stack_chk_fail',可以在文件Makefile中的CFLAGS设置值
-fno-stack-protector
,即关闭掉栈的保护。
如果出现其他编译失败的情况,你可以借助于google找到相关的解决方案。


此主题相关图片如下:
按此在新窗口浏览图片


此主题相关图片如下:

5.运行该镜像

$emulator -kernel ~/android/kernel/arch/arm/boot/zImage

最终效果如图所示。


此主题相关图片如下:
按此在新窗口浏览图片

你可能感兴趣的:(android开发环境搭建,内核编译)