搞了三天,终于把这个环境搞出来,一个人摸索,在网上查资料,终于搞定了。但是模拟器跑起来真是慢。
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 environmentexport 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进行升级操作。这个会帮你完成一些ADT的操作,减少后面的很多错误的发生。
export PATH=$PATH:/usr/local/android_sdk_linux/tools
export PATH=$PATH:/usr/local/android_sdk_linux/platform-tools
下载一个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
最终效果如图所示。