找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3413|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

從頭開(kāi)始為BeagleBoard編譯Android系統(tǒng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:85681 發(fā)表于 2015-7-15 01:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
折騰了幾天,終于將Android系統(tǒng)編譯好,成功運(yùn)行在BeagleBoard上。為了讓大家可以更快上手,將整個(gè)編譯過(guò)程詳細(xì)記錄下來(lái),供大家參考,其中有幾個(gè)容易出問(wèn)題的地方列出了解決方法,可以少繞彎子。

最開(kāi)始為BeagleBoard編譯Android系統(tǒng)時(shí),準(zhǔn)備按標(biāo)準(zhǔn)的做法從android.git.kernel.org下載repo,然后通過(guò)repo從kernel.org下載Android源碼。但是后來(lái)發(fā)現(xiàn)kernel.org被黑了,下載不了源碼,只能想其他辦法。有關(guān)kernel.org被黑的相關(guān)信息,請(qǐng)參見(jiàn)我上一篇博文《有關(guān)kernel.org被黑導(dǎo)致無(wú)法下載android源代碼的問(wèn)題》。

因?yàn)闊o(wú)法從kernel.org下載源碼,所以找了德州儀器的網(wǎng)站下載為BeagleBoard打包的Android源碼,先找到的是FroYo DevKit2.2版本,下載頁(yè)面鏈接如下:
http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/02_02_00/index_FDS.html

不過(guò)下載后編譯的uImage無(wú)法啟動(dòng),找了幾種解決方法都不行,所以再找了一個(gè)更新的版本,是GingerBread 2.3.4版,下載頁(yè)面鏈接如下:
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
最終編譯運(yùn)行成功,下面是具體步驟。

1.   下載GingerBread 2.3.4版Devkit。
下載GingerBread 2.3.4 Devkit的原因有幾個(gè),一個(gè)是Devkit包里有編譯好的Android系統(tǒng),可以用于測(cè)試,特別是問(wèn)題隔離的測(cè)試,一個(gè)是因?yàn)镈evkit包里有一些工具在下面的步驟中需要用到,還有一個(gè)是因?yàn)镈evkit包里的Documents目錄有一個(gè)文檔名為《TI-Android-GingerBread-2.3.4-DevKit-2.1_DeveloperGuide.pdf》,里面有整個(gè)編譯的步驟,我也主要是根據(jù)這個(gè)文檔中的步驟進(jìn)行編譯的。
GingerBread 2.3.4 Devkit包有500多兆,可以在GingerBread 2.3.4 下載頁(yè)面找到,如上所述,該下載頁(yè)面地址是:
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

懶得找的話直接通過(guò)以下鏈接下載也可以:
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上直接通過(guò)解壓工具可以解開(kāi),打開(kāi)里面的《《TI-Android-GingerBread-2.3.4-DevKit-2.1_DeveloperGuide.pdf》供參考。

2.   下載GingerBread 2.3.4版源碼
GingerBread 2.3.4的源碼理論上可以通過(guò)repo 從gitorious.org上下載下來(lái),不過(guò)整個(gè)包太大,不建議直接下載。建議從德儀的網(wǎng)站上直接下載一個(gè)打包好的文件。
GingerBread 2.3.4 同樣可以在GingerBread 2.3.4下載頁(yè)面找到,為了方便大家,直接將下載地址列出:
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系統(tǒng)通過(guò)瀏覽器下載就可以,整個(gè)包大概有4G,所以需要一段時(shí)間下載。

3.   準(zhǔn)備Ubuntu 10.0.4
GingerBread 2.3.4需要Ubuntu 10.0.4作為交叉編譯環(huán)境,所以需要安裝一個(gè)Ununtu 10.0.4。我是直接在VMWare上安裝Ubuntu 10.0.4,具體的安裝過(guò)程就不記錄了,參考其它有關(guān)Ubuntu的文章。提前提醒大家給Ubuntu準(zhǔn)備一個(gè)很大的硬盤,比如40G,編譯過(guò)程需要很大的硬盤空間,我剛開(kāi)始設(shè)了個(gè)20G的虛擬硬盤,后面還是發(fā)現(xiàn)不夠用。
安裝了Ubuntu之后需要按要求升級(jí)Ubuntu,具體升級(jí)命令如下,需要注意兩點(diǎn),
第一:《DeveloperGuide》一文中的語(yǔ)句有問(wèn)題,第一行少了一個(gè)ubuntu,執(zhí)行到第二句是會(huì)出錯(cuò),請(qǐng)按照下面的語(yǔ)句來(lái)。
第二:這里安裝的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
首先需要在用戶目錄新建一個(gè)bin目錄,并設(shè)置到路徑中,命令如下:
$ mkdir ~/bin
$ PATH=~/bin:$PATH

然后下載repo,因?yàn)閗ernel.org不能用,需要找其他地方下載,我用的是國(guó)外網(wǎng)友共享的,命令如下:

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

注意下載后需要修改repo執(zhí)行的權(quán)限
(補(bǔ)充,如Bruce發(fā)現(xiàn)的,這一步下載的repo其實(shí)在后面的步驟中沒(méi)有使用到,所以這一步可以省略。2011.11.16)


5.   解壓Android源碼
在Ubuntu上新建一個(gè)目錄,叫rowboat-android,(這個(gè)目錄名其實(shí)可以隨便起)然后將下載的TI_Android_GingerBread_2_3_4Sources.tar.gz拷貝到Ubuntu的rowboat-android目錄上。

然后解壓該文件,命令如下:
$ tar -xvzf TI_Android_GingerBread_2_3_4Sources.tar.gz

解壓后進(jìn)入該文件夾,解壓出來(lái)一個(gè)Readme文件和一個(gè).repo文件夾,當(dāng)然,.repo文件夾你看不見(jiàn)。
$ cd TI_Android_GingerBread_2_3_4Sources

然后執(zhí)行repo命令從本地同步源碼,使用--local-only選項(xiàng),命令如下:

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

執(zhí)行成功后可以在TI_Android_GingerBread_2_3_4Sources目錄看見(jiàn)同步出來(lái)的源文件。如果執(zhí)行失敗,著重看一看你的repo命令是否下載成功,路徑是否設(shè)置正確。

6.   設(shè)置toolchain
解壓出來(lái)的源碼包括了一套toolchain,需要做的就是將toolchain的路徑加入到PATH中,命令如下:
$ export PATH=<rowboat-android>/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

注意<rowboat-android>是你建立的rowboat-android目錄的路徑,《DeveloperGuide》原文這里有問(wèn)題。

7.   開(kāi)始編譯x-loader
進(jìn)入TI_Android_GingerBread_2_3_4Sources下的x-loader目錄,執(zhí)行以下命令編譯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的開(kāi)發(fā)文檔,所以樣例中沒(méi)有使用BeagleBoard的config文件。

另外,對(duì)于32位的系統(tǒng),執(zhí)行前需要將
./build/core/main.mk 中的
ifneq (64,$(findstring 64,$(build_arch)))
改為:
ifneq (i686,$(findstring i686,$(build_arch)))
否則會(huì)報(bào)只支持64位系統(tǒng)的錯(cuò)誤。

執(zhí)行成功的話在x-loader目錄會(huì)找到新生成的x-load.bin文件


8.   生成MLO
編譯x-loader以后需要將x-load.bin文件轉(zhuǎn)換成MLO文件,使用的工具是signGP。
signGP這個(gè)工具可以在第一步下載的Devkit包里找到,在Tools/signGP目錄中。將這個(gè)文件拷貝到Ubuntu的x-loader目錄上,執(zhí)行以下命令生成MLO文件
$ ./signGP ./x-load.bin
$ mv x-load.bin.ift MLO

9.   編譯u-boot.bin:
進(jìn)入TI_Android_GingerBread_2_3_4Sources下的u-boot目錄
$ cd u-boot
注意,《DeveloperGuide》原文是$ cd u-boot-omap3,目錄名不對(duì)

通過(guò)以下命令編譯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
編譯成功會(huì)在該目錄找到u-boot.bin文件


10.  編譯Linux 核心
進(jìn)入TI_Android_GingerBread_2_3_4Sources下的kernel目錄,通過(guò)以下命令編譯uImage,執(zhí)行前注意測(cè)試一下mkimage命令是否可以正常執(zhí)行,該命令在生成uImage文件時(shí)要使用到。

$ 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文件系統(tǒng)
進(jìn)入TI_Android_GingerBread_2_3_4Sources目錄,執(zhí)行一下命令開(kāi)始編譯生成Android文件系統(tǒng):
$ make TARGET_PRODUCT=beagleboard OMAPES=5.x -j8

注意你的BeagleBoard版本,如果是Beagleboard Rev Cx的話,要使用OMAPES=3.x選項(xiàng),如果是Beagleboard XM A/B/C 則使用OMAPES=5.x。我的是beagleBoard XM C,所以使用OMAPES=5.x。
-j8選項(xiàng)是指定使用多少個(gè)CPU進(jìn)行編譯,如果你的Ubuntu只有一個(gè)CPU就不用這個(gè)參數(shù)了。

編譯需要很長(zhǎng)時(shí)間,請(qǐng)耐心等待。

如果編譯過(guò)程中出現(xiàn)ld terminated with signal 7,ld terminated with signal 11的錯(cuò)誤,特別是編譯libwebcore.so 時(shí)出錯(cuò),注意調(diào)整你的Ubuntu的硬盤空間和內(nèi)存。我使用40G硬盤,2G內(nèi)存編譯通過(guò)。

編譯成功后可以在out/target/product/beagleboard目錄找到生成的文件系統(tǒng)。

12. 打包Android文件系統(tǒng)
編譯完成后進(jìn)入out/target/product/beagleboard目錄,新建一個(gè)目錄(本例是android_rootfs)將需要的文件拷貝進(jìn)去,然后通過(guò)mktarball.sh命令將文件系統(tǒng)打包,命令如下:
$ 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.  制作啟動(dòng)SD卡
文件編譯好了就開(kāi)始制作啟動(dòng)SD卡,準(zhǔn)備一張4G的SD卡,通過(guò)讀卡器連接到Ubuntu上,留意一下該卡mount到那個(gè)目錄,找到設(shè)備名,如/dev/sdb。

然后新建一個(gè)目錄將需要的文件都拷貝進(jìn)去,包括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文件可以通過(guò)mkbootscr生成,為了簡(jiǎn)化過(guò)程,這里建議從Devkit包的“Prebuilt_Images\ beagleboard-xm”中拷貝一個(gè),注意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命令拷貝到新建的目錄里來(lái):
$ cp Tools/mk-mmc/mkmmc-android.sh image_folder

最后執(zhí)行命令mkmmc-android,格式如下:
$ ./mkmmc-android <SD卡設(shè)備名,如/dev/sdb>
MLO u-boot.bin uImage boot.scr rootfs.tar.bz2 Media_Clips

執(zhí)行成功的話你的SD卡會(huì)被格式化,重新分區(qū),同時(shí)拷貝進(jìn)了相關(guān)的文件。
有關(guān)SD卡的制作也可以參考我之前的博文,這里是使用mkmmc-android一次性完成,其實(shí)可以手工一步一步做的。

14. 啟動(dòng)BeagleBoard
最后激動(dòng)人心的時(shí)刻,將SD卡插入BeagleBoard,連接BeagleBoard的HDMI口,鼠標(biāo),鍵盤,電源。然后上電啟動(dòng)!。
注意,如果你有擴(kuò)展板的話不要連接擴(kuò)展板,這里還不支持。


最后,上圖:

Android
1.gif (62.45 KB, 下載次數(shù): 3)





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表