前一陣子在熊貓板上Android 4.0完成後,還是覺得程式在開發階段時還是在模擬器上執行比較有效率,所以又把程式改在模擬器上執行,因此我寫這篇文章來紀錄如何編譯與替換模擬器的系統和核心映像檔
有鑑於網路上較少統合性的文章在討論編譯模擬器的映像檔,就特別寫了這篇文章啦~
1. 環境設置
1.1 下載Android SDK (其實可以用make sdk來自行製作,但是既然有現成的就直接用吧)
http://developer.android.com/sdk/index.html
記得下載r15以後的版本,這樣才有支援4.0喔
1.2 下載平台檔案與建立虛擬裝置
r15以後的SDK貼心的把把版本控制與虛擬裝置分開來,在SDK的根目錄下有兩個可執行檔: SDK Manager 與 AVD Manger,這邊就簡略的用兩張圖帶過囉:
SDK Manager: 請下載 API 14
AVD Manager: 創建4.0的虛擬裝置,螢幕建議設置為HVGA,也就是手機用的螢幕大小,否則開機要好久阿~
1.3 執行模擬器,記得指定你建立虛擬裝置時所設定的名稱
$ cd $SDK/tools/ $ ./emulator -avd $YOUR_AVD
以上都還沒進入正題,接下來我們終於可以開始編譯與燒錄自己的程式囉...
2. Android system image編譯與燒錄
2.1 下載Android 4.0原始碼: 老樣子,就去官網抓吧,下載來的源碼存放於android_ICS資料夾中
http://source.android.com/source/index.html
2.2編譯Android 4.0的映像檔
$ cd android_ICS $ . build/envsetup.sh $ lunch full-eng $ make -j4
編譯完成後,模擬器所需要的映像檔會存放在out/target/product/generic/system.img
2.3 用新映像檔開機
$ cd $SDK/tools/ $ export IMAGE_PATH=~/android_ICS/out/target/product/generic/ $ ./emulator -system $IMAGE_PATH/system.img -avd $YOUR_AVD
OK!第一部分大功告成,我們已經成功使用自己的system.img來開機了
3. Linux kernel編譯與燒錄
大家都知道Android基底為linux核心,且採用2.6.29的版本,不過之前在Pandaboard上燒錄時,是採用最新的kernel 3.0,但是模擬器依然使用舊的核心版本
3.1 kernel source 下載
由於Android git不在釋出網頁版本,因此我也是找了許久才知道模擬器的核心被移出common的群組中了,所以我們另外去下載模擬器專用核心(goldfish)
$ cd kernel_ICS $ git clone git://android.git.kernel.org/kernel/goldfish.git $ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
3.2 kernel 編譯
如同Pandaboard一般,先設定交叉編譯的環境,以及設定goldfish default kernel config即可,然而天與願違,根據我的實測,透過goldfish_defconfig編譯出來的映像檔,根本無法在模擬器上開機
因此我們必須從模擬器的中 dump出有效的kernel config,其關鍵在於/proc/config.gz
$ cd $SDK/platform-tools/ $ ./adb pull /proc/config.gz $ gunzip config.gz $ cp config .config
利用這裡產生的.config來進行 goldfish kernel的編譯
$ cp .config ~/kernel_ICS/goldfish/ $ export CROSS_COMPILE=~/android_ICS/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi- $ make ARCH=arm -j4
編譯完成後,用來boot的映像檔就在arch/arm/boot/zImage啦~
(p.s. 若是你打算在模擬器上開發kernel module,請記得打開menuconfig把下列設定啟動再進行編譯喔,預設是關閉的)
3.3 用新核心開機
$ cd $SDK/tools/ $ export KERNEL_IMAGE=~/a=kernel_ICS/goldfish/arch/arm/boot/ $ ./emulator -kernel $KERNEL_IMAGE/zImage -avd $YOUR_AVD
大功告成!! 我們已經成功的用自己編譯的zImage來替換掉emulator所預設的image囉,附上一張示意圖: