Android SDK提供了一個基於Qemu的模擬器來類比Android系統的智能手機,得益於Qemu的跨平台特性,不論是Linux、Mac OS還是Windows的使用者都可以通過模擬器大大提高開發效率。不過歸根結底,Qemu還是在類Unix平台上發展起來的項目,所以在Windows平台上的編譯還是值得一看。Google在git上描述如何編譯Android Eclipse外掛程式ADT的時候順帶提到了如何構建Windows版的Android SDK,國內也有朋友寫了構建Windows版的Android SDK(此為轉帖,原作者blog已無法訪問)的文章,但是對於如何單獨構建Windows版的Android模擬器目前並沒有任何官方的文檔提及,William只是在網路上找到一些零碎的討論,今天就結合自己的實踐整理出來和大家共用。
在Windows下編譯Android模擬器的兩種方法
Android給出的構建Windows版SDK的make_windows_sdk.sh指令碼中,包含有make -j 4 emulator,即編譯模擬器的命令,所以看起來模擬器能在Cygwin環境下構建出來的。另外,由於Android模擬器是基於Qemu,Android只是在其基礎上添加了新的虛擬設備,定義了自己的skin機制等,所以只要是標準Qemu能夠正常編譯的環境,Android模擬器也就沒有問題。The QEMU forum有一篇很詳盡的關於在Windows環境編譯Qemu的文章,Step-by-step QEMU compilation under Windows ,是在MinGW/MSYS下完成的,因而在MinGW/MSYS環境下構建看來也可行。
既然使用make_windows_sdk.sh依賴的Cygwin看起來更像是官方製作SDK發布的環境,那麼它應當是幾乎100% working,下面還是先來嘗試一下非官方的做法吧。
MinGW/MSYS環境的準備
MinGW和MSYS的環境不算複雜,官方網站也有詳細的協助文檔,下面就說說我的安裝過程。
需要下載的安裝包包括:
1、MinGW-5.1.4.exe, 這是MinGW的自動安裝工具(Automated MinGW Installer)
2、MSYS-1.0.11.exe
3、msysDTK-1.0.1,MSYS Developer Tool Kit,包括autoconf、automake、libtool、cvs等工具
4、pthreads-w32-2-8-0-release.exe,emulator所需要的pthread庫。
zlib、libpng、SDL以及它依賴的directx-devel庫就不需要下載了,zlib和libpng已經包含在Android Emulator源碼包中,SDL我們也可以用Android Prebuilt中提供的binary,稍後會給出連結。
安裝MinGW時,除非有特別的需要,我們安裝常用的gcc core、g++編譯器就行。如果網路條件實在不好,可以開啟mingw.ini找出檔案名稱,然後通過下載工具到MinGW網站下載。另外值得一提的是,MinGW為了更好的管理軟體包的發布,使用了current、previous和candidate來區分不同版本軟體包的組合,這裡我選擇的是current,gcc版本為3.4.5。安裝路徑隨意,這裡假設是c:\mingw。
安裝MSYS時會詢問是否有安裝MinGW,選擇Y的話會要求輸入MinGW的安裝路徑,輸入之後很快就可以完成MSYS安裝。這裡我們假設MSYS的安裝路徑是c:\msys。接下來安裝好msysDTK-1.0.1,我們就可以通過案頭上的捷徑來進入MSYS了。這裡我們要通過“ls /mingw”命令確認一下MinGW是否被正確掛載到MSYS的/mingw目錄,如果可以看到bin、doc、include等目錄就說明掛載成功,否則請檢查MSYS安裝目錄中etc下的fstab檔案,格式請參考fstab.sample。掛載成功以後,試試“gcc -v”,能夠正常返回gcc version 3.4.5等字樣,我們就可以進入到下一步了。
取得Android Emulator原始碼和Prebuilt中的SDL庫
請參考我之前的文章Git和Repo掃盲——如何取得Android原始碼來取得Android Emulator原始碼和Prebuilt中的SDL庫,或者你也可以簡單的從GitWeb下載Emulator和Prebuilt的snapshot版本。
下載完成以後,把Emulator解壓縮到c:\msys\home\< 當前登陸的使用者名稱 >目錄下,Prebuilt我們只需要其中Windows目錄下的sdl目錄就可以了,同樣放到c:\msys\home\< 當前登陸的使用者名稱 >目錄。
這裡有必要提一下Android Emulator的build system,在Google發布的源碼包android-emulator-1.0_r2.tar.bz2中,我們可以很方便的使用build-emulator.sh指令碼來編譯(中間可能會遇到些問題),在這個指令碼中我們可以看到,構建Emulator的指令碼是android-rebuild.sh,而它則會調用同一目錄下的android-configure.sh來完成configure。回到Cupcake中的External/qemu目錄,我們可以看到android-rebuild.sh和android-configure.sh這兩個指令碼同樣存在(一開始我確實是以為只有以源碼包形式發布的Emulator中才包含了這幾個指令碼),所以我們可以在編譯整個Android Cupcake代碼樹時編譯Emulator,同樣也利用這個平行的build system來單獨的構建Emulator。從這個角度來說,單獨的構建Emulator,無論是Cygwin還是MinGW/MSYS,方法就不會有什麼差別了。
編譯Android Emulator的過程
做好前面的幾步之後,開啟MSYS,進入到Emulator(qemu)目錄,執行./android-rebuild.sh –sdl-config=/home/< 當前登陸的使用者名稱 >/sdl/bin/sdl-config 命令即可,它會自動調用android-configure.sh指令碼進行configure,隨後開始編譯,–sdl-config則指定了sdl庫的路徑。
這裡我們可能遇到的問題是缺少libpthread,如果遇到的話解開pthreads-w32-2-8-0-release.exe,把Pre-built.2中的libpthreadGC2.a改名為libpthread.a複製到c:\mingw\lib目錄,pthread.h複製到c:\mingw\include目錄即可解決。
除此之外,編譯Cupcake中的Android Emulator相當的順利,之前編譯android-emulator-1.0_r2.tar.bz2時遇到過的“unsupported cpu”, “bad ELF header”等錯誤都沒有遇到。
測試產生的Android Emulator
測試產生的emulator.exe能否正常工作,最簡單的辦法就是把它複製到當前安裝好的Android SDK的tools目錄下,連-kernel,-ramdisk,-system這些參數都省的加了。建立一個avd,比如“test_avd”,然後在控制台運行“emualtor.exe @test_avd” 即可,如果有什麼不正常,加上-debug-all和-show-kernel參數可以有助debug。
好了,有圖有真相!標題列中的“Build with MSYS/MINGW”是我自己加的。
歡迎留言提問!