style="display:inline-block;width:300px;height:250px"
data-ad-client="ca-pub-5935214489160196"
data-ad-slot="8007533899">

About Android源代碼

Git和Repo掃盲——如何取得Android源代碼

http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/

by William Hua

Git 是 Linux Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的分散式版本控制軟體,它不同於Subversion、CVS這樣的集中式版本控制系統。在集中式版本控制系統中只有一個倉庫(repository),許多個工作目錄(working copy),而像Git這樣的分散式版本控制系統中(其他主要的分散式版本控制系統還有BitKeeperMercurialGNU ArchBazaarDarcsSVKMonotone等),每一個工作目錄都包含一個完整倉庫,它們可以支援離線工作,本地提交可以稍後提交到伺服器上。分散式系統理論上也比集中式的單伺服器系統更健壯,單伺服器系統一旦伺服器出現問題整個系統就不能運行了,分散式系統通常不會因為一兩個節點而受到影響

因為Android是由kernel、Dalvik、Bionic、prebuilt、build等多個Git項目組成,所以Android項目編寫了一個名為Repo的Python的腳本來統一管理這些專案的倉庫,使得Git的使用更加簡單。

這幾天William為了拿Android最新的sourcecode,學習了一下git和repo的一些基本操作,整理了一個如何取得Android代碼的How-To,今天把他貼上來。
1Git的安裝
在Ubuntu 8.04上安裝git只要設定了正確的更新源,然後使用apt-get就可以了,有什麼依賴問題,就讓它自己解決吧。其中cURL是一個利用URL語法在命令行下工作的檔傳輸工具,會在後面安裝Repo的時候用到。
sudo apt-get install git-core curl

2、安裝Repo
首先確保在當前用戶的主目錄下創建一個/bin目錄(如果沒有的話),然後把它(~/bin)加到PATH環境變數中
接下來通過cURL來下載Repo腳本,保存到~/bin/repo檔中
curl http://android.git.kernel.org/repo >~/bin/repo

別忘了給repo可執行許可權
chmod a+x ~/bin/repo

3、初始化版本庫
如果是想把Android當前主線上最新版本的所有的sourcecode拿下來,我們需要repo的幫助。
先建立一個目錄,比如~/android,進去以後用repo init命令即可。
repo init -u git://android.git.kernel.org/platform/manifest.git
這個過程會持續很長的時間(至少可以好好睡一覺),具體要多少時間就取決於網路條件了
最後會看到 repo initialized in /android這樣的提示,就說明本地的版本庫已經初始化完畢,並且包含了當前最新的sourcecode。

如果想拿某個branch而不是主線上的代碼,我們需要用-b參數制定branch名字,比如:
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake

另一種情況是,我們只需要某一個project的代碼,比如kernel/common,就不需要repo了,直接用Git即可。
git clone git://android.git.kernel.org/kernel/common.git
這也需要不少的時間,因為它會把整個Linux Kernel的代碼複製下來。

如果需要某個branch的代碼,用git checkout即可。比如我們剛剛拿了kernel/common.get的代碼,那就先進入到common目錄,然後用下面的命令:
git checkout origin/android-goldfish-2.6.27 -b goldfish
這樣我們就在本地建立了一個名為goldfish的android-goldfish-2.6.27分支,代碼則已經與android-goldgish-2.6.27同步。我們可以通過git branch來列出本地的所有分支。

4、同步版本庫
使用epo sync命令,我們把整個Android代碼樹做同步到本地,同樣,我們可以用類似
repo sync project1 project2 …
這樣的命令來同步某幾個項目

如果是同步Android中的單個專案,只要在專案目錄下執行簡單的
git pull
即可。

5、通過GitWeb下載代碼
另外,如果只是需要主線上某個專案的代碼,也可以通過GitWeb下載,在shortlog利用關鍵字來搜索特定的版本,或者找幾個比較新的tag來下載還是很容易的。

Git最初是為Linux內核開發而設計,所以對其他平臺的支持並不好,尤其是Windows平臺,必須要有Cygwin才可以。現在,得益於msysgit專案,我們已經可以不需要Cygwin而使用Git了。另外,Git Extensions是一個非常好用的Windows Shell擴展,它能與資源管理器緊密集成,甚至提供了Visual Studio插件。它的官方網站上有一分不錯的說明文檔,感興趣的朋友可以看一看。

至於Git的參考文檔,我推薦Git Magic,這裏還有一個Git Magic的中文版

如何構建Android 1.5 Linux內核映射

http://www.williamhua.com/2009/04/30/how-to-build-android-15-kernel-image/

by William Hua

和一般的Linux系統開發流程一樣,Android平臺開發的一個很重要的基礎工作就是對其內核的編譯和移植。本文的目的就在於構建出可以在Android自帶的ARM QEMU模擬器上運行的內核映射,希望對於大家做內核的移植和系統構建有幫助。

請先參考我的另一篇文章如何取得Android源代碼,確保正確地拿到了Androidkernel/common項目的Goldfish分支(該分支用於構建運行在emulator上的系統內核,而主線則是用於構建運行在實際設備上的內核代碼)上的內核代碼。另外,需要提醒一下大家的是Android的sourcecode目前只能在Linux或者Mac OS下做交叉編譯編譯,Windows並沒有被支持,以下將以Ubuntu 8.04為Host OS來說明。
Android對Linux Kernel做了不少的改進,比如添加對yaffs2檔系統的支援,改進藍牙的支援,改進電源管理機制,以及為模擬器版本添加的Goldfish平臺等等,不過內核的編譯方式和標準的kernel並沒有區別。
這裏唯一需要注意的是,Android 1.0_r2以後,整個專案的sourcecode就全部轉移到git了,Google Code上不會再有更新,請確保從Git上拿到了android-goldfish-2.6.27分支上的內核代碼。

1、在Host OS上準備編譯環境
儘管很多人安裝完Ubuntu後第一件事情就是裝上build-essential,不過我在這裏還是要提醒一下大家,另外做menuconfig的時候ncurses-devel庫也是必須的。運行以下命令,一次搞定:
sudo apt-get install build-essential ncurses-dev

2、準備交叉編譯工具鏈
Android代碼樹中有一個prebuilt項目,包含了我們編譯內核所需的交叉編譯工具,如果你拿了完整的Android 1.5代碼樹,它就會在prebuilt目錄下。如果沒有拿完整的代碼樹也沒有關係,只要用Git clone一個或者到從GitWeb下載一個prebuilt項目,如果是從GitWeb下載的話記得解壓縮就行。

3、設定環境變數
把剛才下載的prebuilt中的arm-eabi編譯器加入$PATH
$export PATH=$PATH:/home/william/android-source/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin

設定目標arch為arm
$export ARCH=arm

4、設定交叉編譯參數
打開kernel目錄下的Makefile檔,把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器
CROSS_COMPILE ?= arm-eabi-


LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)–build-id,))

這一行注釋掉,並且添加一個空的LDFLAGS_BUILD_ID定義,如下:
LDFLAGS_BUILD_ID =
下面的這段解釋來自陳罡的blog

把它注釋掉的原因是目前android的內核還不支援這個選項。–build-id選項,主要是用於在生成的elf可執行檔中加入一個內置的id,這樣在core dump,或者debuginfo的時候就可以很快定位這個模組是哪次build的時候弄出來的。這樣就可以避免,每次都把整個檔做一遍效驗,然後才能得到該檔的是由哪次build產生的。對於內核開發者來說,這是很不錯的想法,可以節約定位模組版本和其影響的時間。目前,該功能還出於early stage的狀態,未來的android或許會支持,但至少目前的版本是不支持的。
對這個–build-id選項感興趣的朋友,可以訪問下面的網址,它的作者已經解釋得非常明白了:
http://fedoraproject.org/wiki/Releases/FeatureBuildId

5、從1.5_r1捆綁的SDK中獲得內核配置檔
大家都知道,內核編譯中有一步make menuconfig,用於配置kernel,這裏我們可以先獲取官方的配置,如果必要的話再作改動。先啟動模擬器,然後通過adb pull命令(該命令用於從設備上複製檔到本地)即可完成。
$adb pull /proc/config.gz ~/
現在我們用gunzip把config.gz解開,把得到的config檔移動到kernel source所在的目錄,然後重命名為.config即可。
$ gunzip config.gz
$ mv config ~/sources/goldfish-kernel/.config

6、開始編譯
因為我們之前已經吧1.5_r1中的.config複製到了kernel目錄下,如果需要修改配置,可以使用
make menuconfig
修改並保存配置,如果沒有特殊需要的話就可以直接用
make
命令來編譯內核了

7、測試生成的zImage
編譯內核的過程應該很順利,因為默認的配置對內核作了大幅的精簡,大約5~6分鐘就可以編譯完成了,會在最終會在arch/arm/boot目錄下面生成一個zImage,這個就是我們所要的運行在模擬器上的內核映射了。
下面我們就在模擬器中測試一下我們所生成的zImage。
emulator @1.5_L2 -kernel ./zImage
其中1.5_L2是我之前創建的AVD,如果想輸出kernel log,請加上-show-kernel參數。

一切順利的話,我們應該可以看到Android順利啟動了。

通過adb shell,我們可以查看version資訊,如下圖:

關於為實際設備編譯kernel
如果要為一個實際的設備比如說G1重新編譯內核映射,步驟和上述為一個運行在模擬器上的內核映射步驟基本一致,只是所需要的源代碼應當來自主線而不是goldfish分支。另外,編譯完成以後載入映射的方式也不同,需要通過USB將映射燒入nand flash。

如何構建Android 1.5系統映射

http://www.williamhua.com/2009/04/30/how-to-build-android-15-system-image/

by William Hua

上一篇文章講到如何構建Android的kernel映射,我們都知道,系統要運行起來光有kernel映射是不夠的,今天我就來說一說如何構建Android的系統映射。

請先參考如何取得Android源代碼一文,通過repo來取得當前最新的android主線代碼(或者拿名為android-SDK-1.5_r1的tag也無妨)。
1Host OS編譯環境準備
在取得android源代碼和編譯內核的過程中,我們已經至少安裝了cURL、 git-core、ncurses-dev、 build-essential等套裝軟體(Python2.5已經捆綁在Ubuntu8.04中),不過這還不夠,要完成Android代碼樹的編譯,我們還需要flex、bison、gperf、valgrind(可選)、libsdl-dev、libesd0-dev、libwxgtk2.6-dev、zlib1g-dev等套裝軟體,好在apt-get可以幫我們一次搞定。
sudo apt-get install flex bison gperf valgrind libsdl-dev libesd0-dev libwxgtk2.6-dev zlib1g-dev

另外,編譯過程中還需要用到JDK 5.0(注意JDK6.0不被支持),請到Sun的官方網站下載後安裝。

2、工具鏈和環境變數
把JDK5.0加進$PATH,如:
$export PATH=$PATH:/home/william/jdk5.0/bin
然後可以用java -version來確認java的版本

除此之外,編譯內核所作的環境變數和工具鏈的設置在編譯系統映射時並不需要,這都由android的編譯腳本搞定了。

3、關於編譯選項
在build/core目錄下的envsetup.mk定義了target的體系結構和OS,默認為arm和linux,我們暫時不涉及移植,所以不需要修改。

4、開始編譯
做完上面的準備,在代碼樹的根目錄下敲make就可以了,編譯的過程大約需要持續1~2個小時,總計需要大約3.5G的可用空間。

5、測試生成的image
編譯完成以後如果想在模擬器中運行,除了kernel的映射檔以外,所需的其他3個映射文件分別是:(位於out/target/product/generic/目錄)
ramdisk.img: 包含了在模擬器中啟動Android所需的檔系統
system.img: 初始的Android系統映射,包含了程式和庫檔
userdata.img: 初始的用戶資料映射檔
模擬器會首先到指定的AVD所在的目錄查找是否有userdata映射存在,如果沒有的話就會基於初始的userdata.img來創建一個,載入這3個映射檔後,它會把system.img和userdata.img分別掛載載到ramdisk檔系統中的system和userdata目錄下。所有的用戶資料都會被保存在AVD目錄下的userdata-qemu.img中,初始的用戶資料映射檔並不會被修改。

通過命令行參數啟動模擬器,載入我們編譯的系統映射的方法:
(Update:實驗證明這一步是沒有必要的),然後運行
emulator @1.5_L2 -system system.img -ramdisk ramdisk.img
或者我們加上-kernel參數,用自己編出來的kernel來啟動

系統成功啟動的截圖:

編譯Android系統映射雖然花費了不少的時間,不過總體來說還是比較簡單的,Android的build system幫助我們搞定了大部分的設置。

Android Scripting Environment動手玩

http://www.williamhua.com/2009/06/13/try-out-android-scripting-environment/

by William Hua

在Android社群裏,這幾天討論得最火熱的主題不外乎是iPhone 3GS、Palm Pre和Magic、Dream的對比美版Magic到底何時發佈以及剛剛和大家見面的Android Scripting Environment了。William手上沒有iPhone 3GS和Palm Pre,美版的Magic雖然看起來不錯(比較可靠的消息是他會有5百萬圖元攝像頭,記憶體288MB,CPU是更省電、視頻錄製更強大的MSM7200A,似乎比歐洲已經開賣的Vodafone定製版Magic好出不少),不過手機硬體本身已經超出我的研究範圍了,還是花點時間來看看動手玩一玩Android Scripting Environment吧。
ASE為Android系統帶來了腳本語言的支援,通過它我們可以編輯和執行腳本,甚至和腳本解釋器做出交互。腳本可以訪問多數的Android API,有了這個大大簡化了的介面,我們可以很方便的實現以下功能:

  • 操作Intents
  • 啟動Activities
  • 撥打電話
  • 發送短信
  • 掃描條碼
  • 獲取地理位置和感測器資料
  • 使用text-to-speech(TTS)
  • 參考官方文檔瞭解更多

腳本可以在終端中來交互地執行,或者作為後臺Service啟動,也可以通過Locale來啟動。當前支援的腳本語言包括Python、Lua和BeanShell,Ruby和JavaScript的支持已經在計畫之中。你可能會問,為什麼使用腳本而不是開發真正的Android應用呢?誠然,Android的開發環境非常易於使用,但是你必須在電腦前完成所有工作。而ASE則使您在任何您需要的情況下,快速的在設備上使用高級腳本語言嘗試您的想法。

下面我們就在模擬器中動手玩一玩ASE吧

1因為ASE目前還沒有被上傳到Market,所以首先我們到Google Code上下載它的安裝包。

2在命令行執行adb install ~/download/AndroidScriptingEnvironment-0.7-alpha.apk (假設下載來的ASE安裝檔放在~/download目錄)命令安裝ASE。

3點擊 圖示啟動它,第一次啟動的時候需要安裝腳本解釋器,大家會看到“Installing Python”, “Installing Lua”等提示,初始化完成以後,運行介面如下圖所示:

4按照Google介紹的ASE用法,這時我們可以單擊腳本檔來執行它,或者長按列表中的腳本檔對它進行修改、刪除、添加到桌面快捷方式等操作或者作為後臺服務啟動;另外也可以通過“Menu”功能表來新建腳本或者打開終端。

出現問題

在我嘗試的過程中卻發現單擊列表中的腳本檔無法正常執行,一直顯示黑屏。

於是我打開通過adb shell打開一個終端,並用logcat來觀察ASE執行時的系統log,發現ASE啟動時有報如下的錯誤:
……
V/InterpreterInstaller( 687): Installing bsh
V/InterpreterInstaller( 687): Extracting entry “res/raw/bsh.zip”.
E/InterpreterInstaller( 687): Reading entry res/raw/bsh.zip failed.
E/InterpreterInstaller( 687): Failed to extract entry.
E/InterpreterInstaller( 687): java.io.FileNotFoundException: /data/data/com.google.ase/bsh.zip
E/InterpreterInstaller( 687): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.j
ava:231)
……

提示讀取res/raw/bsh.zip檔失敗,我看了apk包的res/raw目錄,還真沒有bsh.zip文件(後來就覺得這不是根本的問題

接下來,當我嘗試單擊saytime.py運行它的時候,系統大約有1分鐘左右沒有任何反應,當我嘗試Back鍵等操作的時候,就會出現”Sorry! Activity ASE(in applicaton ASE) is not responding”的錯誤,同時從logcat中可以看到ANR(application not responding)的記錄被寫入了/data/anr/traces.txt。

Force close以後,ASE被重新載入。

尋求解決辦法

剛遇到這個問題的時候,我還是真有點懷疑是Google沒有好好的測試ASE,漏掉了bsh.zip檔,但是想想ASE現在已經是0.7Alpha,Google Code上都已經有了3個版本的下載,這樣的問題沒有理由存在,於是我開始在ASE項目的Issues裏面來尋求解決辦法。
果然,Issue39 和 Issue45都提到了和我一樣的問題,矛頭直指getSystemService(Context.SENSOR_SERVICE); Hangs in Android 1.5這個Android Emulator中的bug。當用戶調用getSystemService(Context.SENSOR_SERVICE)時,系統會黑屏,而如果用戶嘗試對手機進行操作(比如按下“Menu”鍵),系統則將返回Application Not Responding錯誤。(這個問題事實上是1.5 SDK的已知問題,見Releasenotes中的Known Issues)

所以問題是看起來就是ASE中使用了會導致模擬器掛起的Sensor API,那麼我們只要在ASE中禁用掉它理論上就可以使ASE能夠在模擬器上正常運行,當然和Sensor相關的重力感應和羅盤功能肯定是不能工作的了(除了Ctrl+F12可以類比重力感應相關的螢幕翻轉,羅盤還真是很難在emulator中來模擬)。

動手解決

這裏,請確保正確安裝和配置Android 1.5 SDK和ADT了,並且在PC上安裝有Python的解釋器(Windows或者Linux平臺均可)。

從SVN checkout最新的ASE代碼,導入到Eclipse中,隨後把lib目錄下的TTS庫加入專案的build path,會發現有android.os.Exec相關的幾個類無法找到,這時ASE Wiki的CompilingASE中提到的fix_android_sdk.py腳本就派上用場了。該腳本可以幫助我們從Android源代碼中編譯出android.os.Exec的class文件,並添加到SDK的jar文件中,以解決ASE的編譯問題。

這裏需要注意的是,Wiki中提到需Android的源代碼,事實上我們只需要有其中的frameworks/base就可以了,如果手上沒有完整的代碼的話,從Android Git版本庫中下載一個frameworks/baseandroid-1.5r2這個tagsnapshot就行,大約35MB左右。下載完了以後把解出來的整個base目錄放在android_source/frameworks/目錄,然後根據wiki中的方法執行fix_android_sdk.py腳本成功以後,ASE專案的編譯就OK了。

最後,注釋掉AndroidFacade.java中和getSystemService(Context.SENSOR_SERVICE)、mSensorManager相關的代碼,編譯完成以後ASE就可以在模擬器中正常運行了。

編譯Windows版Android Emulator(Cupcake)

http://www.williamhua.com/2009/07/22/build-android-emulator-for-windows/

by William Hua

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下載EmulatorPrebuilt的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。