把玩"魔術師" -- 編譯 AOSP 2.1 (Eclair) 原始碼
This document is provided as is. You are welcomed to use it for non-commercial purpose.Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
請勿轉貼
看其他教材
為了達到第一個目標 -- 自己編譯 AOSP(Android Open Source Project),便開始收集 資料,目前進度極緩慢,所以先把一些有用的資料集結在此,做個筆記,有機會再讓它 成為一篇完整的文章。在慢慢達成目標的過程,分成幾個階段,分別描述如下: 第一階段主要是參考 [HOW-TO] Compile AOSP Froyo + [ROM] Latest AOSP Froyo for Sapphire 這一串討論文。在編譯過程充滿了一些完全不知道要如何處理的困難(看起來基本功 不紮實),就算勉強解決了,可惜編譯出來的 image 檔無法在 Magic 上執行,也找不到 答案。這個階段有幾次想放棄,想想看:都這麼老了還玩?有沒有搞錯? 雖然這一階段的挫折最大,但是以下的文件也有不少是來自這一串討論文。
第二階段主要是參考 編譯 android 2.1 (eclair) 源碼 For HTC G1,這個文章是編譯給 HTC Dream 的,基本上這篇文章是參考一篇日文的文章 EclaironADP1andADP2,雖然看不懂日文,但是從指令可以看出想要編譯給 ADP2 (根據 Android FAQ,ADP2 是 Magic 32B),應該也可行。看文章跟著做的過程中,有不懂得就順便 Google 一下找答案,有 答案的,我會順便把它筆記下來。這一次的編譯,過程輕鬆多了,從頭到尾只 碰到如下的錯誤訊息
target StaticLib: libwebcore (out/target/product/sapphire-open/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a)
make: execvp: /bin/bash: Argument list too long (中文的錯誤訊息是"引數列項目過長")
make: *** [out/target/product/sapphire-open/obj/STATIC_LIBRARIES/libwebcore_intermediates/libwebcore.a]
根據網路搜尋的結果,這應該是環境變數的空間太小的關係。根據 Build error on Ubuntu 9.04 (Eclair branch) 二樓的說明,解決方式為執行以下指令:
(cd external/webkit ; git cherry-pick 18342a41ab72e2c21931afaaab6f1b9bdbedb9fa)
emulator -avd Magic -system system.img -data userdata.img -ramdisk ramdisk.img
fastboot erase system -w fastboot erase boot fastboot flash boot boot.img fastboot flash system system.img fastboot flash userdata userdata.img
一旦 image 檔和 patch 刷完了之後,就可以成功開機了,提供兩個畫面以供參考。 開機後測試了一下,發現 除了之前說的 Calendar 會 FC 之後,Music 和簡訊也會,電話可以撥出去,但是 打不進來,無線上網功能正常,相機雖然可以啟動,但是畫面充滿了白與黑的方格子。
既然能編譯出一個堪用的 HTC Magic 32A ROM,自然要把過程寫一下給有興趣的人試試看。 不過,這絕對不是一份任何人都一定看得懂的(我有些部分也還在摸索);因為 是給自己當筆記,我只能先假設你懂一些 Linux 的基本概念。我把編譯的過程 分成幾個步驟來說:(以下的步驟絕大部分都是在 Ubuntu/Linux 上執行)
- 你需要幫自己安裝一部執行 Linux 的電腦,AOSP 的文件建議使用 Ubuntu,而我安裝的是 Ubuntu 10.04 x86 32 bit 版。為了不影響平常的 使用,我是將 Ubuntu 安裝在一個名為 VirtualBox 的虛擬機器上;VirtualBox 是一套 Windows 的免費軟體,當在 VirtualBox 內執行 Ubuntu 的時候,電腦 基本上就同時執行 Windows 和 Ubuntu。當你將 Ubuntu 安裝完後,記得先用 "更新管理員"將所有軟體進行更新。
- 在編譯 AOSP 原始碼之前,我們必須先安裝一些套件。這些步驟主要是參考
dferreira 發表的 [HOW-TO] Compile AOSP Froyo + [ROM] Latest AOSP Froyo for Sapphire。
- 在 /etc/apt/sources.list 檔案的最後加上下列兩行:
deb http://pl.archive.ubuntu.com/ubuntu/ jaunty multiverse deb http://pl.archive.ubuntu.com/ubuntu/ jaunty universe
- 檔案修改完後,請執行下列指令來該新 apt 的資料庫:
sudo apt-get update
- 請執行下列指令(只有一行)來安裝必要的軟體:
sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev valgrind libreadline5-dev gcc-multilib g++-multilib libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline5-dev libz-dev
- 請在自己的家目錄($HOME)底下新增一個 bin 目錄,並將 repo 安裝到 bin 內。安裝後可以登出然後登入,剛安裝的 repo 就可以開始使用。
cd ~ mkdir bin curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo
- 決定 AOSP 原始碼放置的目錄,並建立該目錄。假設目錄的名稱是 eclair,且
位於 $HOME,以下為執行並進入 eclair 目錄:
mkdir ~/eclair cd ~/eclair
- 在 /etc/apt/sources.list 檔案的最後加上下列兩行:
- 軟硬體的環境設定好了之後,我們就開始要從 AOSP 的網站把原始碼抓下來。
- 由於 Android 的版本眾多,你必須定義出究竟是哪一個版本是你要的。
由於我們參考的 文件是編譯 Android 2.1 版的,因此我們的指令如下:
repo init -u git://android.git.kernel.org/platform/manifest.git -b android-2.1_r2
- 新增一個如下的 local_manifest.xml 檔案在 .repo 目錄內。
<?xml version="1.0" encoding="UTF-8"?> <manifest> <project path="kernel" name="kernel/msm" revision="refs/heads/android-msm-2.6.29-donut"/> <project path="vendor/htc/common-open" name="platform/vendor/htc/common-open" revision="master"/> <project path="vendor/htc/dream-open" name="platform/vendor/htc/dream-open" revision="master"/> <project path="vendor/htc/prebuilt-open" name="platform/vendor/htc/prebuilt-open" revision="master"/> <project path="vendor/htc/sapphire-open" name="platform/vendor/htc/sapphire-open" revision="master"/> <project path="vendor/qcom/android-open" name="platform/vendor/qcom/android-open" revision="master"/> <project path="vendor/qcom/proprietary-open" name="platform/vendor/qcom/proprietary-open" revision="master"/> <project path="vendor/pv-open" name="platform/vendor/pv-open" revision="master"/> <project path="vendor/aosp" name="platform/vendor/aosp" revision="master"/> <project path="hardware/htc/dream" name="platform/hardware/htc/dream" revision="master"/> </manifest>
- 執行 repo sync 把定義好的原始碼抓回來,這個可能會等待比較久的 時間。
- 由於 Android 的版本眾多,你必須定義出究竟是哪一個版本是你要的。
由於我們參考的 文件是編譯 Android 2.1 版的,因此我們的指令如下:
- 編譯 kernel 以及無線網路的驅動程式。我們先說明編譯的步驟,再說明我認為這個
步驟其實可以省略的原因以及如何取得"可用"的 binary。
- 先到 ~/eclair/kernel 目錄:cd ~/eclair/kernel。
- 產生設定檔:make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- msm_defconfig。
- (這個步驟可省略)修改設定檔 .config。請將檔案內的 CONFIG_MSM_CPU_FREQ_ONDEMAND_MAX=384000 改成 CONFIG_MSM_CPU_FREQ_ONDEMAND_MAX=528000,這個動作可以幫 CPU 的處理速度加快。
- 編譯 kernel:make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-。
- 到 ~/eclair/system/wlan/ti/sta_dk_4_0_4_32 編譯無線網路的驅動程式,指令為
cd ~/eclair/system/wlan/ti/sta_dk_4_0_4_32 make ARCH=arm CROSS_COMPILE=~/eclair/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- KERNEL_DIR=~/eclair/kernel
- 把新編譯的 kernel 和無線網路的驅動程式複製到適當的位置 -- ~/eclair/vendor/htc/sapphire-open/。指令為
cp ~/eclair/kernel/arch/arm/boot/zImage ~/eclair/vendor/htc/sapphire-open/kernel cp ~/eclair/system/wlan/ti/sta_dk_4_0_4_32/wlan.ko ~/eclair/vendor/htc/sapphire-open/wlan.ko
- 編譯 Android 平台,編譯成功的話,會產生必要的 image 檔。
- 設定編譯的平台,包含以下指令:
source build/envsetup.sh lunch aosp_sapphire_us-eng # 也可以執行 lunch 並選擇平台
- 取得 HTC 的檔案,並解壓縮。HTC 的檔案內含多個重要的程式庫,這些程式庫
必須存在才能順利的編譯 Android,但是由於抓取的(或者說 HTC 提供的)都已經是
舊版的(明確的說是 1.6 版),所以常常造成編譯
出來的 image 檔雖然能夠在手機上執行,但是也造成許多程式(如之前提到的
Calendar 和 Music 等)無法順利執行的原因。抓取並解壓縮檔案的指令為
wget --referer=http://developer.htc.com/google-io-device.html http://member.america.htc.com/download/RomCode/ADP/signed-google_ion-ota-14721.zip? cd ~/eclair/vendor/htc/sapphire-open ./unzip-files.sh
- 加入繁體以及簡體中文,指令如下:
cd ~/eclair
CUSTOM_LOCALES:=zh_TW zh_CN
- 執行 make -j2 編譯 image 檔;這會需要一段時間,完成後在 ~/eclair/out/target/product/sapphire-open 內可以看到 image 檔。
- 設定編譯的平台,包含以下指令:
- 為什麼 AOSP 抓下來的原始碼編譯後,只能在 old radio(也就是 2.22 或者是 3.22)執行呢?台版 HTC 官方的 radio 卻是 new radio(也就是 6.35),難道 AOSP 的原始碼沒有給 new radio 的嗎?
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
沒有留言:
張貼留言