折騰了幾天,終于將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,$(findstring 64,$(build_arch))) 改為: ifneq (i686,$(findstring i686,$(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口,鼠標,鍵盤,電源。然后上電啟動!!! 注意,如果你有擴展板的話不要連接擴展板,這里還不支持。 最后,上圖: ![]() |
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |