`
阿尔萨斯
  • 浏览: 4168314 次
社区版块
存档分类
最新评论

从头开始为BeagleBoard编译Android系统

 
阅读更多

折腾了几天,终于将Android系统编译好,成功运行在BeagleBoard上。为了让大家可以更快上手,将整个编译过程详细记录下来,供大家参考,其中有几个容易出问题的地方列出了解决方法,可以少绕弯子。

最开始为BeagleBoard编译Android系统时,准备按标准的做法从android.git.kernel.org下载repo,然后通过repo从kernel.org下载Android源码。但是后来发现kernel.org被黑了,下载不了源码,只能想其他办法。有关kernel.org被黑的相关信息,请参见我上一篇博文《有关kernel.org被黑导致无法下载android源代码的问题》。

因为无法从kernel.org下载源码,所以找了德州仪器的网站下载为BeagleBoard打包的Android源码,先找到的是FroYo DevKit2.2版本,下载页面链接如下:

http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/02_02_00/index_FDS.html

不过下载后编译的uImage无法启动,找了几种解决方法都不行,所以再找了一个更新的版本,是GingerBread 2.3.4版,下载页面链接如下:

http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/index_FDS.html

最终编译运行成功,下面是具体步骤。

1. 下载GingerBread 2.3.4版Devkit。

下载GingerBread 2.3.4 Devkit的原因有几个,一个是Devkit包里有编译好的Android系统,可以用于测试,特别是问题隔离的测试,一个是因为Devkit包里有一些工具在下面的步骤中需要用到,还有一个是因为Devkit包里的Documents目录有一个文档名为《TI-Android-GingerBread-2.3.4-DevKit-2.1_DeveloperGuide.pdf》,里面有整个编译的步骤,我也主要是根据这个文档中的步骤进行编译的。

GingerBread 2.3.4 Devkit包有500多兆,可以在GingerBread 2.3.4 下载页面找到,如上所述,该下载页面地址是:

http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/index_FDS.html

懒得找的话直接通过以下链接下载也可以:

http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/exports/TI_Android_GingerBread_2_3_4_DevKit_2_1.tar.gz

下载完成之后在Windows上直接通过解压工具可以解开,打开里面的《《TI-Android-GingerBread-2.3.4-DevKit-2.1_DeveloperGuide.pdf》供参考。

2. 下载GingerBread 2.3.4版源码

GingerBread 2.3.4的源码理论上可以通过repo 从gitorious.org上下载下来,不过整个包太大,不建议直接下载。建议从德仪的网站上直接下载一个打包好的文件。

GingerBread 2.3.4 同样可以在GingerBread 2.3.4下载页面找到,为了方便大家,直接将下载地址列出:

http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_GingerBread_2_3_4_DevKit_2_1/exports/TI_Android_GingerBread_2_3_4Sources.tar.gz

直接从Windows系统通过浏览器下载就可以,整个包大概有4G,所以需要一段时间下载。

3. 准备Ubuntu 10.0.4

GingerBread 2.3.4需要Ubuntu 10.0.4作为交叉编译环境,所以需要安装一个Ununtu 10.0.4。我是直接在VMWare上安装Ubuntu 10.0.4,具体的安装过程就不记录了,参考其它有关Ubuntu的文章。提前提醒大家给Ubuntu准备一个很大的硬盘,比如40G,编译过程需要很大的硬盘空间,我刚开始设了个20G的虚拟硬盘,后面还是发现不够用。

安装了Ubuntu之后需要按要求升级Ubuntu,具体升级命令如下,需要注意两点,

第一:《DeveloperGuide》一文中的语句有问题,第一行少了一个ubuntu,执行到第二句是会出错,请按照下面的语句来。

第二:这里安装的java是6.0版本的,和之前要求必须是5.0版本不同。

$ sudo add-apt-repository "deb http://archive.canonical.com/ubuntu lucid partner"

$ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"

$ sudo apt-get update

$ sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf

libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl

libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage expect

$ sudo update-java-alternatives -s java-6-sun

4. 下载repo

首先需要在用户目录新建一个bin目录,并设置到路径中,命令如下:

$ mkdir ~/bin

$ PATH=~/bin:$PATH

然后下载repo,因为kernel.org不能用,需要找其他地方下载,我用的是国外网友共享的,命令如下:

curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo" > ~/bin/repo

chmod a+x ~/bin/repo

注意下载后需要修改repo执行的权限

(补充,如Bruce发现的,这一步下载的repo其实在后面的步骤中没有使用到,所以这一步可以省略。2011.11.16)

5. 解压Android源码

在Ubuntu上新建一个目录,叫rowboat-android,(这个目录名其实可以随便起)然后将下载的TI_Android_GingerBread_2_3_4Sources.tar.gz拷贝到Ubuntu的rowboat-android目录上。

然后解压该文件,命令如下:

$ tar -xvzf TI_Android_GingerBread_2_3_4Sources.tar.gz

解压后进入该文件夹,解压出来一个Readme文件和一个.repo文件夹,当然,.repo文件夹你看不见。

$ cd TI_Android_GingerBread_2_3_4Sources

然后执行repo命令从本地同步源码,使用--local-only选项,命令如下:

$ ./.repo/repo/repo sync --local-only

执行成功后可以在TI_Android_GingerBread_2_3_4Sources目录看见同步出来的源文件。如果执行失败,着重看一看你的repo命令是否下载成功,路径是否设置正确。

6. 设置toolchain

解压出来的源码包括了一套toolchain,需要做的就是将toolchain的路径加入到PATH中,命令如下:

$ export PATH=<rowboat-android>/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

注意<rowboat-android>是你建立的rowboat-android目录的路径,《DeveloperGuide》原文这里有问题。

7. 开始编译x-loader

进入TI_Android_GingerBread_2_3_4Sources下的x-loader目录,执行以下命令编译x-loader

$ make CROSS_COMPILE=arm-eabi- distclean

$ make CROSS_COMPILE=arm-eabi- omap3beagle_config

$ make CROSS_COMPILE=arm-eabi-

注意!!

Config文件使用的是omap3beagle_config,《DeveloperGuide》不是特指BeagleBoard的开发文档,所以样例中没有使用BeagleBoard的config文件。

另外,对于32位的系统,执行前需要将

./build/core/main.mk 中的

ifneq(64,$(findstring64,$(build_arch)))

改为:

ifneq(i686,$(findstringi686,$(build_arch)))

否则会报只支持64位系统的错误。

执行成功的话在x-loader目录会找到新生成的x-load.bin文件

8. 生成MLO

编译x-loader以后需要将x-load.bin文件转换成MLO文件,使用的工具是signGP。

signGP这个工具可以在第一步下载的Devkit包里找到,在Tools/signGP目录中。将这个文件拷贝到Ubuntu的x-loader目录上,执行以下命令生成MLO文件

$ ./signGP ./x-load.bin

$ mv x-load.bin.ift MLO

9. 编译u-boot.bin:

进入TI_Android_GingerBread_2_3_4Sources下的u-boot目录

$ cd u-boot

注意,《DeveloperGuide》原文是$ cd u-boot-omap3,目录名不对

通过以下命令编译u-boot.bin

$ make CROSS_COMPILE=arm-eabi- distclean

$ make CROSS_COMPILE=arm-eabi- omap3_beagle_config

$ make CROSS_COMPILE=arm-eabi-

注意,使用的config是omap3_beagle_config

编译成功会在该目录找到u-boot.bin文件

10. 编译Linux 核心

进入TI_Android_GingerBread_2_3_4Sources下的kernel目录,通过以下命令编译uImage,执行前注意测试一下mkimage命令是否可以正常执行,该命令在生成uImage文件时要使用到。

$ make ARCH=arm CROSS_COMPILE=arm-eabi- distclean

$ make ARCH=arm CROSS_COMPILE=arm-eabi- omap3_beagle_android_defconfig

$ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage

注意! 使用的config是omap3_beagle_android_defconfig

编译成功的话可以在kernel/arch/arm/boot目录找到uImage文件

11.生成Android文件系统

进入TI_Android_GingerBread_2_3_4Sources目录,执行一下命令开始编译生成Android文件系统:

$ make TARGET_PRODUCT=beagleboard OMAPES=5.x -j8

注意你的BeagleBoard版本,如果是Beagleboard Rev Cx的话,要使用OMAPES=3.x选项,如果是Beagleboard XM A/B/C 则使用OMAPES=5.x。我的是beagleBoard XM C,所以使用OMAPES=5.x。

-j8选项是指定使用多少个CPU进行编译,如果你的Ubuntu只有一个CPU就不用这个参数了。

编译需要很长时间,请耐心等待。

如果编译过程中出现ld terminated with signal 7,ld terminated with signal 11的错误,特别是编译libwebcore.so 时出错,注意调整你的Ubuntu的硬盘空间和内存。我使用40G硬盘,2G内存编译通过。

编译成功后可以在out/target/product/beagleboard目录找到生成的文件系统。

12.打包Android文件系统

编译完成后进入out/target/product/beagleboard目录,新建一个目录(本例是android_rootfs)将需要的文件拷贝进去,然后通过mktarball.sh命令将文件系统打包,命令如下:

$ cd out/target/product/beagleboard

$ mkdir android_rootfs

$ cp -r root/* android_rootfs

$ cp -r system android_rootfs

$ sudo ../../../../build/tools/mktarball.sh

../../../host/linux-x86/bin/fs_get_stats android_rootfs . rootfs rootfs.tar.bz2

所生成的是rootfs.tar.bz2文件。

13. 制作启动SD卡

文件编译好了就开始制作启动SD卡,准备一张4G的SD卡,通过读卡器连接到Ubuntu上,留意一下该卡mount到那个目录,找到设备名,如/dev/sdb。

然后新建一个目录将需要的文件都拷贝进去,包括MLO, u-boot.bin,boot.scr,uImage,root.tar.bz2和Media_Clips目录。

其中MLO, u-boot.bin,uImage,root.tar.bz2都是以上步骤生成的,少了boot.scr文件和Media_Clips目录。

boot.scr文件可以通过mkbootscr生成,为了简化过程,这里建议从Devkit包的“Prebuilt_Images\ beagleboard-xm”中拷贝一个,注意BeagleBoard的版本,如果是 Rev CX的话就找“Prebuilt_Images\ beagleboard-rev-c4”目录中的boot.scr

Media_Clips目录同样可以在Devkit包里找到。

新建文件夹和拷贝文件的命令如下,供参考:

$ mkdir image_folder

$ cp kernel/arch/arm/boot/uImage image_folder

$ cp u-boot/u-boot.bin image_folder

$ cp x-loader/MLO image_folder

$ cp Tools/mk-bootscr/boot.scr image_folder

$ cp out/target/product/omap3evm/rootfs.tar.bz2 image_folder

$ cp Media_Clips image_folder

另外将Devkit中的mkmmc-android.sh命令拷贝到新建的目录里来:

$ cp Tools/mk-mmc/mkmmc-android.sh image_folder

最后执行命令mkmmc-android,格式如下:

$ ./mkmmc-android <SD卡设备名,如/dev/sdb>

MLO u-boot.bin uImage boot.scr rootfs.tar.bz2 Media_Clips

执行成功的话你的SD卡会被格式化,重新分区,同时拷贝进了相关的文件。

有关SD卡的制作也可以参考我之前的博文,这里是使用mkmmc-android一次性完成,其实可以手工一步一步做的。

14.启动BeagleBoard

最后激动人心的时刻,将SD卡插入BeagleBoard,连接BeagleBoard的HDMI口,鼠标,键盘,电源。然后上电启动!!!

注意,如果你有扩展板的话不要连接扩展板,这里还不支持。

最后,上图:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics