搞了三天,终于把这个环境搞出来,一个人摸索,在网上查资料,终于搞定了。但是模拟器跑起来真是慢。
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上面的路径,请根据自己的机器进行修改
# 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
最终效果如图所示。