27 January 2013

Android Development with AndroVM

iOS 的開發一直都有 iOS Simulator 可用,速度快功能也全,讓開發的步調變快許多。Android 也有一個 Android Emulator,功能更多,但是開啟慢,執行更慢到爆,所以一直沒什麼人在用,大家都是拿實機來開發。後來 Android Emulator 出了 Intel x86 版 (現在出到 4.1),這玩意我實際裝過後發現的確比原有的快很多,但是裡面沒有 Google Api,我們公司的 App 跑不起來 (Cubie Messenger 有用到 Google Map)。所以 x86 emulator 跟我們無緣了。

今天要介紹的是另一個 Open Source Android VM,叫 AndroVM,我們公司拿它來開發了 Android 版 Cubie 一個月左右,我可以說 Android 的開發節奏總算能跟上 iOS 了。AndroVM 官網有一個詳細的安裝教學,建議有空的人自己去按它的步驟安裝即可。不過,AndroVM 有一個特別的 AndroVM Player,要用它才能真正達到順暢的開發。官網對它的說明不大夠,所以很多人不會用它的 Player。下面是一步一步安裝和設定教學:

AndroVM 是跑在 Virtualbox VM 裡,再透過內部網路跟本機 OS 溝通,所以要先安裝 VirtualBox,到官網下載直接裝就好,沒什麼難度。

再來是設定 VirtualBox 本機的 DHCP。開啟 VirtualBox 後,到 Preference -> Network

新增本機網路後,應該會出現一個 'vboxnet0' 的網路,double click 開啟它,切到 DHCP Server -> 勾選 Enable Server,再填入以下的值:

如果你知道 DHCP 是什麼原理你可以自己修改上面的值符合你的需求。不然先用上面的值吧。

接下來下載 AndroVM image,先到 AndroiVM 官網有幾個 .OVA 可供下載,一般來說你是開發手機 App應該是下載 "vbox86p version with gapps & houdini" 這個版本。不過你可以根據開發的需求選擇不同版本,下面是代號說明:

  • vbox86p : 手機版, 預設解析度 480×800
  • vbox86t : Tablet 版,預設解析度 1024×600
  • vbox86tp : Tablet 版,但有電話的功能,預設解析度 1024×600
  • gapps : 代表包含 Google 相關服務 (有 Google Play)
  • houdini: 代表包含 Arm emulation (AndroidVM 是跑在 x86 上,所以反過來需要去模擬 Arm)

接下來就是匯入 AndroVM .OVA 檔到 VirtualBox 裡。double click 剛下載的 .ova 檔,就會出現匯入畫面:

原來的名字太長了,你可以自己改。改完成功匯入後,接下來要幫 AndroVM 設定兩張網卡,選擇剛才匯入的 VM,再選 Settings -> Network -> Adaptor1 -> Attatch to: [Host-Only Adaptor]

第一張一定要是 Host-Only,這是給 AndroVM 跟本機 OS 溝通用的,第二張則是 Android 本身要用的 (在 Android 裡會以 WIFI 呈現):

第二張的設定就要看本機用什麼網路了。如果你的本機是用 WIFI,那就要如上圖選 Bridged Adapter,名稱那邊再選 WIFI,如果本機是直接接網路線的,那 Attached To: 應該可以設為 NAT。

好了,到這一步終於設好了,可以開啟 AndroVM 了,選擇 AndroidVM 再按 Start 開機:

沒兩下就進 Android 的歡迎畫面了,開機超快啊!!

接下來你要檢查你的 Android 網路有沒有通,如果右上角出現藍色的 WIFI 圖示,表示你剛才設定的第二張網卡是對的,如果是灰色或黑色的圖示表示網卡設錯,Android 不能上網了,請回到設定第二張網卡那改變設定,再重開一次。

當你點擊到 AndroVM 時,你的滑鼠會被 VirtualBox 抓住,變成只能在 VM 裡移動,出不來。這時只要看右下角顯示的 Host 鍵,然後在鍵盤上按一下就可以出來了。(Host 鍵每個 OS 不同。圖例顯示的是 Mac 的左蝴蝶鍵)

好,把 welcome 步驟跑完後,進入 Android Home Screen,你可以大概玩一下體驗流暢的感覺。Android 的控制鍵對應到主機鍵盤是:

  Android Back Key  -> Esc
  Android Menu Key  -> F1
  Android Power Key -> F4
  解鎖              -> 按 Esc 或 F1

目前 AndroidVM 跑的模式是軟體的 OpenGL ES,但已經很快了。接下來我們要設定硬體加速和 AndroidVM Player。Home screen 上有個設定用的 App 叫 androVM Configuration:

androVM Configuration 裡可以看到第一張網卡的 IP,這個 IP 會用在 AndroVM Player 和 adb 的連線上。另外也提供改變實體鍵盤的行為,以及軟體 OpenGL 模式下的解析度。預設的鍵盤設定是不會開虛擬鍵盤的,這樣和實際手機上的環境差太多,不利開發測試,下面將它改成虛擬鍵盤:

設定好,Save 完 AndroVM 要重開。

到此階段其實就可以拿來開發了,但是滑鼠會被 AndroVM 搶走很難用,軟體 OpenGL 也不夠快。接下來要設定 AndroVM Player 來解決這個問題。先到官網下載 AndroVM Player,依照你的OS版本挑選,本文下載 MacOS 64bit: AndroVMplayer-mac64-20121119.tgz。下載後解開壓縮檔,放在你自己的工具目錄,接下來的範例會用 ~/develop/AndroVMplayer-mac64 這個目錄來說明。

AndroidVM Player 通常是直接下 command line 來開啟,要跑 run.sh 這個 script:

   $ cd ~/develop/AndroVMplayer-mac64
   $ ./run.sh 480 800 240

執行後,你會看到類似下面的輸出,這樣代表成功了。

   Window ID: 0x7fac98c47360
   [OpenGL init OK]
   creating vinput server on TCP port 22469 returns 6
   [Input Server init OK]
   You shall know start the AndroVM Virtual Machine configured for OpenGL Hardware support - waiting for connection from VM ...

不過開啟的 Player 視窗本身是一片空白,因為它在等待 VirtualBox 裡的 AndroVM 連接上。AndroVM 只有在硬體 OpenGL 模式下,才會和 Player 連線。我們先放Player 到一邊,回到 AndroVM Configuration 裡。勾選 Hardware OpenGL,Save 後,重開 AndroVM。

AndroVM 重開後,你會發現它不會直接進入 Android 了,它會開始搜尋 Player,它們之間是透過第一張網卡連線的,所以第一張要正確設定為 Host-Only 才能正確連接。成功連上後,AndroVM 會出現類似的訊息:

然後,AndroVM 會將畫面 "投射" 到 Player 上。你就可以在 Player 上操作 AndroVM 了,速度快而且滑鼠不會被搶走:

AndroVM Player 可以正常運作後,接下來就是讓 eclipse 開發環境可以連上它。我們要使用 Android SDK 提供的 adb 工具來連上 AndroVM:

   $ cd ~/develop/android-sdk-mac_x86  # 這是你的 android sdk 目錄位置 
   $ cd platform-tools
   $ ./adb connect 192.168.56.101      # 192.168.56.101 這個 IP 要代入你的 AndroVM 的第一張網卡的 IP。

請注意 adb connect 後面接的 IP Address 就是 AndroVM 第一張網卡的 IP,你可以在 androVM 的 virtualbox 畫面上看到。也可以到 Android 裡的 AndroVM Configuration 這個 App 裡查到。 正確連上後,可以用下列指令查一下:

   $ ./adb devices 
   List of devices attached 
   192.168.56.101:5555	device

應該要看到一台用該 IP 顯示的裝置才是。這樣在 Eclipse 的 DDMS 就可以看到了,當然也可以直接佈署和 Debug 囉:

到此為止,androVM 開發環境算是設定好了。要注意的是,我們已經開啟 AndroVM 的硬體 OpenGL 模式,現在 AndroVM 開機後,就會開始等待 Player ,而不會直接進入軟體模式的 Android,除非它一分鐘內找不到 Player,它才會退回軟體模式。一旦進入軟體模式後,這時再開啟 Player 就不會互連了,你要重開 AndroVM 才行。

所以每次準備開發環境的執行順序是:

  1. 執行 run.sh
  2. 開啟 virtualbox 的 AndroVM
  3. 執行 adb connect

有興趣的人可以自己寫一個 script 將這三件事自動化。我們公司還沒有去寫這 script 因為我們的開發機從來不關機 :)

最後,AndroVM Player 還有另一個功能 -- 切換 Android 的解析度。剛才我們啟動 Player 時的 run.sh,後面接的三個參數就是解析度的參數,依序是 寬度、高度、DPI。下面列出常用的標準解析度:

  ./run.sh  240  320 120     # ldpi
  ./run.sh  320  480 160     # mdpi
  ./run.sh  480  800 240     # hdpi
  ./run.sh  540  960 256     # hdpi, qhd
  ./run.sh  720 1280 320     # xhdpi
  ./run.sh 1080 1920 440     # Full HD,不過沒人會用這模式開發吧...

當然這三組數字可以任意填啦,但一般開發通常會選 hdpi 的解析度。另外要注意切換 Player 解析度通常還要重開 AndroVM 才行。只重開 Player 通常解析度還是會怪怪的。也許這 bug 之後會修好。

Windows 用戶注意事項

  • Windows 版的 AndroVM Player 沒有 run.sh 這個 script,請用 AndroVMplayer.exe 取代
  • 如果發生無法 Player 和 AndroVM 無法連線,請先檢查 Windows 防火牆的設定。看是要關閉防火牆還是將 AndroVMplayer 加入白名單都可解決問題。
  • AndroVM 已知問題:

    • 有時候 AndroVM 內的無線網路會連不上,即使第二張網卡是設對的。這時候要等一下才會連上線。等不及的就重開試試。
    • AndroVM 裡的 browser 和 WebView 在某些顯示卡下會破圖 (nvidia ?),這可能要到下一版才會修正。
    • 沒有前後 Camera

    結語

    AndroVM 的下一版應該會加入 "軟體模式下滑鼠不會被搶走" 的功能,這樣就可以少掉 Player 的步驟。這個專案目前已經 Open Source 了,未來發展應該會加速,不過現階段已經很好用了。即使有了好用的 VM,用手機實測 App 這一步還是免不了的,但大多數的時間都可以用快速的 VM 開發實在是很爽啊。

    參考資料


    回響

    可以用 Tag <I>、<B>,程式碼請用 <PRE>