介紹Visual Studio的Android 模擬器
Microsoft 本周發(fā)布了 Visual Studio 2015 預(yù)覽版, 里面包含 Android 開(kāi)發(fā)工具. 安裝的時(shí)候, 如果選 Android 開(kāi)發(fā), Visual Studio 會(huì)把調(diào)試 Android 應(yīng)用程序用的 Visual Studio 模擬器也裝上.
在介紹這個(gè)新模擬器之前, 我們先來(lái)聊一聊, 為什么需要一個(gè)新的 Android 模擬器 – 當(dāng)然, 你也可以直接跳到自己感興趣的部分去閱讀 :-)
Android 模擬器存在的必要性
我們知道, 模擬器在 編程-編譯-調(diào)試 開(kāi)發(fā)周期中, 扮演著很重要的角色(甚至比物理設(shè)備還重要). 所以我們相信, 今天發(fā)布的這個(gè)模擬器, 在開(kāi)發(fā)中是必不可少的.
有了優(yōu)秀的模擬器, 不代表我們就不需要物理設(shè)備了. 反之亦然, 他們之間其實(shí)是互補(bǔ)的關(guān)系.
下列幾種情況, 只能用物理設(shè)備測(cè)試, 模擬器派不上用場(chǎng):
測(cè)試代碼的性能. 雖然模擬器能幫你糾正代碼中的錯(cuò)誤, 但是它無(wú)法正確的給出, 代碼在指定設(shè)備上的性能評(píng)估. 畢竟, 我們都希望測(cè)試的結(jié)果, 盡量接近用戶實(shí)際使用的效果.
測(cè)試某些硬件問(wèn)題. 比如, 你想測(cè)試下游戲的觸摸靈敏度, 外放的音效, 或者調(diào)試 OEM 設(shè)備的 Bug , 這些測(cè)試只能在物理設(shè)備上進(jìn)行.
評(píng)估真實(shí)的用戶體驗(yàn). 譬如, 你設(shè)計(jì)出來(lái)的人機(jī)交互界面, 適不適合用戶邊走路, 邊單拇指操作?
除去上面列舉的場(chǎng)景,大家應(yīng)該都會(huì)很樂(lè)意使用模擬器。因?yàn)檎{(diào)試代碼通常占用了80%的開(kāi)發(fā)時(shí)間,而模擬器為我們大大提高了工作效率。(除非你的模擬器有其他阻塞性問(wèn)題或者使用限制)。下面是使用模擬器的幾個(gè)理由:
大部分的測(cè)試工作都是用來(lái)驗(yàn)證程序的正確性而非性能,并且大部分的代碼都與底層硬件無(wú)關(guān)。所以是用模擬器是極好的。
購(gòu)買一大堆硬件設(shè)備來(lái)測(cè)試是一件很奢侈的事情(特別是持續(xù)不斷的購(gòu)買新機(jī))。大部分的硬件差異可以使用模擬器軟件進(jìn)行配置,比如說(shuō)屏幕分辨率,不同屏幕的DPI,API級(jí)別/平臺(tái)版本號(hào)等等。
使用物理動(dòng)作來(lái)測(cè)試程序?qū)鞲衅鬏斎氲姆磻?yīng)也是很費(fèi)勁的,比如說(shuō)動(dòng)作變化、地理位置變化或是網(wǎng)絡(luò)/電池的變化。在這種場(chǎng)景下,選擇模擬器來(lái)模擬傳感器的輸入就非常便捷高效,比如說(shuō)模擬器可以模擬一段旅程中位置的變化,并測(cè)試應(yīng)用程序?qū)Φ乩砦恢米兓捻憫?yīng)。
使用模擬器還有一項(xiàng)而外的便利。管理多個(gè)物理連接的USB設(shè)備(一大堆連線和接口),是很麻煩的。此時(shí)使用模擬器就簡(jiǎn)單得多,模擬器就是一個(gè)運(yùn)行在電腦上普通的應(yīng)用層序,除去了物理連接的煩惱,非常便于管理。
所以說(shuō)模擬器是軟件的開(kāi)發(fā)的好伴侶,我們希望把VS的模擬器打造成***流的。我們從開(kāi)發(fā)者那里收集到現(xiàn)有模擬器的痛點(diǎn),在我們的版本上予以一一擊破:
速度慢。這是從Android開(kāi)發(fā)者那排名***的抱怨。“這個(gè)模擬器速度慢極了,嚴(yán)重影響了我的生產(chǎn)率,我還不如用真機(jī)測(cè)試。”速度慢是不可接受的。使用模擬器應(yīng)該比使用真機(jī)的運(yùn)行速度更快才是,這樣才能提高測(cè)試效率。記住一點(diǎn),我們并不是在測(cè)試代碼的運(yùn)行性能,對(duì)功能測(cè)試來(lái)說(shuō)就是要讓模擬器盡可能地跑得快。
與Windows的Hyper-V沖突。很多模擬器在運(yùn)行時(shí)要關(guān)閉Hyper-V,或是在使用Hyper-V時(shí),性能反而更糟糕。但使能Hyper-V是大部分開(kāi)發(fā)者的常見(jiàn)配置,頻繁重啟電腦來(lái)開(kāi)關(guān)Hyper-V是不可接受的。
對(duì)那些要使用Windows Phone模擬器(基于Hyper-V)的開(kāi)發(fā)者來(lái)說(shuō)就更為苦惱??偛荒転橐?yàn)橐獪y(cè)試跨平臺(tái)的代碼,不斷的重啟和配置電腦設(shè)置吧。
額外的購(gòu)買和安裝步驟。如果你已經(jīng)在使用Visual Studio,那么恭喜你,你不許要再額外購(gòu)買和安裝一款其他的模擬器軟件。
更多的費(fèi)用開(kāi)銷。購(gòu)買一款卓越的模擬器,也意味著更高的開(kāi)銷,這也是拒絕使用模擬器的一個(gè)主要原因。Visual Studio的Android模擬器是附贈(zèng)的,不需要額外的費(fèi)用。
簡(jiǎn)單來(lái)說(shuō),我們?cè)赩isual Studio的Andriod模擬器解決了以上痛點(diǎn)。廢話不多說(shuō),下面開(kāi)始給大家介紹使用VS的Android模擬器的調(diào)試方法,我們將從如何選擇Android模擬器開(kāi)始講起。
用 Visual Studio 模擬器調(diào)試 Android 程序
無(wú)論你用的是哪一種編程模式: 用 JavaScript (或 TypeScript) 的 Cordova, C++, 或 是用 C# 的 Xamarin, 都可以在 Visual Studio 2015 預(yù)覽版上 編寫(xiě)-編譯-調(diào)試 Android 代碼.
啟動(dòng)調(diào)試模式的時(shí)候, 要選擇調(diào)試目標(biāo)(Debug Target). 調(diào)試目標(biāo)可以是一臺(tái)物理設(shè)備, 或者是某個(gè)在你電腦上運(yùn)行的模擬器. 我們來(lái)看看怎么給 Visual Studio 2015 預(yù)覽版中的 Cordova 和 C++, 以及 Visual Studio 2013 的 Xamarin 選擇一個(gè)調(diào)試目標(biāo).
C++ 項(xiàng)目的調(diào)試目標(biāo)選擇菜單如下圖所示:
Cordova 項(xiàng)目要選擇菜單的***兩項(xiàng), 具體看下面的截圖:
(切記, 不要選 “Android Emulator” 這一項(xiàng). 因?yàn)樗\(yùn)行的速度太慢了)
Xamarin 項(xiàng)目的選項(xiàng)如下圖所示:
***把位于 項(xiàng)目屬性-Android 選項(xiàng) 中的 "Use Fast Deployment" 勾選去掉.
注: 如果你想從別的 Android IDE 臨時(shí)用下 VS 的模擬器應(yīng)急. 首先, 按照上面介紹的方法啟動(dòng)模擬器; 然后, 把項(xiàng)目關(guān)掉, 保留模擬器繼續(xù)運(yùn)行就可以. 其他 IDE 可以通過(guò) ADB 調(diào)用 VS 的模擬器.
選好調(diào)試目標(biāo)后, 按 F5 , 你的應(yīng)用就會(huì)發(fā)布到模擬器中. 就像平時(shí)調(diào)試 VS 的代碼一樣, 程序運(yùn)行到斷點(diǎn)處停下, 然后你可以查看堆棧, 變量等等. 現(xiàn)在, 大家都知道怎么用模擬器調(diào)試了吧? 那我們繼續(xù)將其他功能。
傳感器模擬以及Visual Studio Android模擬器的其他能力
除了使用模擬器做為部署的目標(biāo)板以外,你還可以使用模擬器的傳感器模擬以及其他功能。 下面會(huì)給大家講解其中的一部分,順序不分先后。
縮放
你可以在開(kāi)發(fā)機(jī)上(主機(jī)側(cè))調(diào)整模擬器的顯示大小。模擬器的DPI值是由你的主機(jī)顯示器決定的,與縮放的大小無(wú)關(guān)。所以如果你覺(jué)得模擬器占用了太多的桌面空間,那就縮小它。
使用模擬器右側(cè)的工具欄中的“Zoom”按鈕,就可以調(diào)整大小。
你也可以使用全屏模式,點(diǎn)擊"Zoom"按鈕上方的“Fit to Screen”按鈕即可。
如果你想對(duì)模擬器中運(yùn)行的程序進(jìn)行截屏(比如說(shuō),使用windows自帶的截屏工具),要想取得***的效果,就要把模擬器的縮放比例調(diào)到***(也就是100%)。如果想要更好的效果,就要使用模擬器自帶的截屏工具了,這個(gè)工具我后面也會(huì)提到。
屏幕的朝向/旋轉(zhuǎn)
除非你的應(yīng)用界面是固定不變的, 否則, 就應(yīng)該測(cè)試下, 手機(jī)處在不同方向時(shí), 應(yīng)用界面翻轉(zhuǎn)后的各種效果, 如: 豎屏, 左橫屏, 右橫屏. 垂直工具欄上有兩個(gè)按鈕 "左旋轉(zhuǎn)"(Roate Left) 和 "右旋轉(zhuǎn)" (Rotate Right), 分別可將模擬器向左和向右旋轉(zhuǎn). 旋轉(zhuǎn)后, 模擬器的尺寸不發(fā)生改變.
網(wǎng)絡(luò)信息
由于模擬器使用的是宿主機(jī)器上的網(wǎng)絡(luò)連接, 所以網(wǎng)絡(luò)部分不需要配置.
你可以點(diǎn)擊垂直工具欄上的 "工具"(Tools) 按鈕, 然后在展開(kāi)的"附加工具" (Additional Tools)面板中點(diǎn)擊 "網(wǎng)絡(luò)"(Network) 選項(xiàng)卡查看網(wǎng)絡(luò)配置信息.
定位 (GPS)
如果你的應(yīng)用跟導(dǎo)航, 地理圍欄(geofencing), 行走/騎行/駕駛有關(guān). 那么, "附加工具"(Additional Tools)面板中的 “定位”(Location) 選項(xiàng)卡里頭的定位跟模擬駕駛(driving simulation) 功能就會(huì)變得很有用 .
地圖可以拖動(dòng)過(guò), 放大縮小, 甚至可以查找某個(gè)具體位置. 通過(guò)放置或移除地圖上的大頭針 (pin) 創(chuàng)建地圖上的點(diǎn)(map points). 左下角顯示的是坐標(biāo). 上邊的工具欄的保存按鈕, 可以將地圖上的點(diǎn)存儲(chǔ)為 XML 文件. 有需要時(shí)候, 再重新加載進(jìn)來(lái).
除了 “Live”模式 , 這種由地圖上的點(diǎn), 直接改變模擬器 GPS 位置外. 還有其他模式可以選擇! 比如你想在地圖上設(shè)置幾個(gè)點(diǎn), 并在這些點(diǎn)之間模擬移動(dòng)的效果 . 那就選 “Pin” 模式. 然后點(diǎn)工具欄最右邊的 Play 按鈕,就能模擬出從一點(diǎn)到另外一點(diǎn)的移動(dòng)效果.。甚至, 還可以設(shè)置移動(dòng)的速度(以秒為單位)。
***,還有一個(gè)跟 “Pin” 模式差不多的 “Route” 模式。此模式也是模擬一點(diǎn)到另外一點(diǎn)的移動(dòng)效果。不過(guò)多了點(diǎn)"曲折"。模擬器會(huì)自動(dòng)計(jì)算出兩點(diǎn)之間的實(shí)際路徑,并以 1 秒鐘為時(shí)間間隔,為這條路徑創(chuàng)建隱形的點(diǎn)。而在這些點(diǎn)之間的移動(dòng)速度,則取決于另外一個(gè)設(shè)置。該設(shè)置的選項(xiàng)有:“步行(Walking)” (5 公里/小時(shí)), “騎行(Biking)” (25 公里/小時(shí)), “限速(Speed Limit)” (在地圖上, 不同位置, 速度也不一樣), 和“快速(Fast)”。
加速傳感器
如果你想測(cè)試應(yīng)用對(duì)手機(jī)移動(dòng)的響應(yīng)效果, 那就打開(kāi) “附加工具(Additional Tools)” 面板中的 “加速傳感器(Accelerometer)” 。
在 3D 面板中, 直接按住里面那個(gè)紅點(diǎn), 朝你想模擬的方向拖動(dòng). 如果你的應(yīng)用已經(jīng)寫(xiě)了處理移動(dòng)事件的代碼. 那它就能接收到手機(jī)移動(dòng)的事件.
左下角的 X, Y, Z 值, 可以通過(guò)點(diǎn)擊 “Reset” 按鈕重置. 也可以由: 直立豎屏(Portrait Standing), 直立橫屏(Landscape Standing), 平躺豎屏(Portrait Flat), 和 平躺橫屏(Landscape Flat), 這幾項(xiàng)來(lái)設(shè)置手機(jī)的初始朝向(Orientation)。
***, 你可以點(diǎn)擊右下角的 “Play” 按鈕模擬震動(dòng)效果. 我們能看的到的震動(dòng)效果, 實(shí)際上就是 X,Y,Z 這幾個(gè)值發(fā)生改變而已. 如果這幾個(gè)值不再急劇變化, 說(shuō)明震動(dòng)已經(jīng)停止。
電源/電池模擬 (以及開(kāi)關(guān)機(jī)按鈕)
假如,你的應(yīng)用需要對(duì)電池的電量變化做出響應(yīng)。 那么你就會(huì)喜歡上 “附加工具(Additional Tools)” 面板中的 “電池(Battery)” 選項(xiàng)卡里面提供的功能.
里面有一個(gè)滑動(dòng)條, 用來(lái)設(shè)置電池的剩余電量. 當(dāng)你調(diào)整電量的時(shí)候, 右上角的電池圖標(biāo)也會(huì)跟著改變. 你的應(yīng)用也會(huì)做出相應(yīng)的反應(yīng).
如果你把 “電池充電(Charging)” 勾選去掉, 過(guò)一段時(shí)間后, 模擬器的屏幕就會(huì)變黑(blank). 這個(gè)時(shí)間可以在 系統(tǒng)設(shè)置(Settings)-顯示(Display)-休眠(Sleep) 里面設(shè)置. 點(diǎn)垂直菜單欄的 電源開(kāi)關(guān)按鈕(Power), 可以將模擬器從休眠中喚醒.
截屏
要實(shí)現(xiàn)對(duì)應(yīng)用截屏,打開(kāi)"其他工具",切換到"截屏"標(biāo)簽。然后點(diǎn)擊“捕捉"按鈕,這樣就可以實(shí)現(xiàn)截屏,并讓你預(yù)覽一下即刻所截屏。如果你打算保存這個(gè)截屏,點(diǎn)擊"保存..."按鈕。如果不喜歡你剛才的截屏,忽略或者再次點(diǎn)擊"捕捉"按鈕。
截屏工具總是實(shí)現(xiàn)(按照左下角所顯示的清晰度的)100%進(jìn)行截屏的,不會(huì)理會(huì)縮放設(shè)置如何。同時(shí)總是正面截圖,不管你選擇何種圖像旋轉(zhuǎn)方式。
通過(guò)拖拽安裝 APKs
APK 是 Android 的安裝文件。要在 Visual Studio 模擬器上安裝 APK 文件,直接把 APK 文件拖到模擬器里面就可以。安裝的時(shí)候,模擬器會(huì)提示 “正在復(fù)制文件…”。安裝完畢,會(huì)有一個(gè)消息框提示 “ xxx 文件已經(jīng)成功安裝到 Android 系統(tǒng)中”。要確保你的 APK 文件是用 x86 模式生成的!
當(dāng)然, 你也可以把其他類型的文件(非 APK 文件)拖到模擬器中,這些文件會(huì)保存到 SD 卡上。這也是我們接下來(lái)要講的內(nèi)容
SD 卡
如果你的有向目標(biāo)設(shè)備的SD卡讀寫(xiě)的需求,模擬器可以利用一個(gè)硬盤上的文件夾模擬這個(gè)SD卡.
要注意Android鏡像會(huì)使用一個(gè)獨(dú)立的VHD文件來(lái)支持對(duì)SD卡的模擬. 所以如果你想要在你的開(kāi)發(fā)機(jī)器上和SD卡傳輸文件,你可以把這個(gè)VHD安裝到你的Windows上:關(guān)閉模擬器(以停止VM的運(yùn)行),然后再Windows Explorer上找到VHD的位置,雙擊它就能安裝. VHD默認(rèn)會(huì)位于下面的這兒路徑下面:
C:\Users\%username%\AppData \Local\Microsoft\XDE\Android\vsemu.sdcard.vhd
這樣VHD就被作為另外的一個(gè)驅(qū)動(dòng)器安裝到了你的Windows上,你可以像使用其它的驅(qū)動(dòng)器一樣來(lái)使用它. 在重啟模擬器之前,你必須卸載VHD,你可以通過(guò)在驅(qū)動(dòng)器上右鍵選擇“彈出Eject”來(lái)實(shí)現(xiàn)這個(gè)步驟.
可以再鏡像中實(shí)現(xiàn)對(duì)SD卡的支持讓其它的內(nèi)置Android應(yīng)用和功能可以使用,比如瀏覽器下載和照相機(jī)應(yīng)用——它為我?guī)?lái)了下一項(xiàng)能力.
照相機(jī)
通常你可能會(huì)要使用應(yīng)用里面的照相機(jī)(使用一個(gè)合適的API),而我們支持這個(gè)功能. 你也可以直接使用內(nèi)置的照相機(jī)應(yīng)用. 當(dāng)你在模擬器里面啟動(dòng)照相機(jī)時(shí),你將會(huì)看到一個(gè)固定的圖像,你可以獲取這個(gè)圖像的快照,以模擬拍照.
音頻播放,鍵盤文字輸入…
當(dāng)然模擬器理所當(dāng)然還會(huì)提供其它的一些功能,盡管他們需要來(lái)自產(chǎn)品團(tuán)隊(duì)的“努力” :-)。在這里我不會(huì)把所有的功能都列出來(lái),單其中有兩個(gè)值得注意:
你可以在模擬器中使用你機(jī)器的鍵盤輸入文本
任何來(lái)自模擬器的音頻播放都可以通過(guò)你機(jī)器的音響收聽(tīng)到
配置
在預(yù)覽版中,提供了2組默認(rèn)配置:
典型的Android手機(jī)配置:5吋屏幕,295 DDI,720x1280,1024MB
典型的Android平板配置:7吋屏幕,315DPI,1080x1920,2048MB
你可以在預(yù)覽版中修改內(nèi)存的分配,Hyper-V Manager的配置窗口中提供了配置“Startup RAM”的選項(xiàng)。注意,你也可以修改每個(gè)配置中使用的CPU核心數(shù)(默認(rèn)值是2)。不過(guò),我們還沒(méi)有對(duì)所有的可能配置進(jìn)行測(cè)試。
我們的工作才剛剛開(kāi)始,在后面的版本中我們會(huì)提供更多的功能,同時(shí)也希望大家在下面的這個(gè)調(diào)查問(wèn)卷中反饋意見(jiàn),以便于我們對(duì)需求進(jìn)行排序。
看看內(nèi)部實(shí)現(xiàn)原理
如果你對(duì)Visual Studio Android模擬器的實(shí)現(xiàn)原理感興趣,我可以簡(jiǎn)單地回答這個(gè)問(wèn)題,就是我們重用了其他產(chǎn)品的工作成果。在概念上,一個(gè)模擬器軟件可以分為以下4個(gè)部分:
虛擬機(jī)(表示為一個(gè)vhd),用于模擬你使用的目標(biāo)板,在這這里目標(biāo)機(jī)就是Android。我們先從Android Open Source Project (AOSP)上獲取到代碼,并加以改進(jìn),將其配置為一個(gè)x86的虛擬鏡像,這樣就可以使用Visual Studio來(lái)進(jìn)行快速的調(diào)試。
Shell/Chrome,提供了用戶交互界面,可以用它來(lái)裝載虛擬鏡像并將其進(jìn)行渲染顯示出來(lái)。可以把這個(gè)過(guò)程和遠(yuǎn)程桌面做一下類比:其實(shí)你就是遠(yuǎn)程連接到一個(gè)本地鏡像上。我們的工作就是從這里開(kāi)始,直接借鑒了Windows Phone模擬器(我們內(nèi)部稱其為XDE)的shell/chrome。 然后根據(jù)Android的特殊需求,做了一些必要的修改。
虛擬化技術(shù),XDE使用先虛擬化技術(shù)來(lái)裝載鏡像,這樣才能進(jìn)行遠(yuǎn)程連接和控制。Windows有深厚的虛擬化技術(shù)功底,我們正是使用了虛擬化技術(shù)Hyper-V來(lái)完成這項(xiàng)工作。
連接管道,VS和XDE需要通過(guò)連接管道來(lái)通信,同樣的調(diào)試引擎和虛擬鏡像也需要。這里我們重用了XDE與Visual Studio之間現(xiàn)有的連接機(jī)制,同時(shí)也使用了Android Debug Bridge (ADB) 。
現(xiàn)在,再來(lái)看看目前這個(gè)應(yīng)用的使用限制,我再次希望大家給我們反饋改進(jìn)意見(jiàn),我們會(huì)優(yōu)先解決大家反饋的問(wèn)題。
當(dāng)前的使用限制
今天給大家分享的是早期的預(yù)覽版,這個(gè)版本中還有不少問(wèn)題和Bug,我希望大家能把更多的問(wèn)題反饋為我們。 同時(shí)這個(gè)版本還有不少已知的使用限制--大家趕緊把你們最想要的功能反饋給我們,我們會(huì)優(yōu)先處理:
直接或間接使用OpenGL 2以及以上版本的應(yīng)用程序,模擬器目前無(wú)法渲染顯示。這項(xiàng)功能不久就會(huì)支持,我們已經(jīng)在內(nèi)部版本中實(shí)現(xiàn),用來(lái)會(huì)感覺(jué)非常流暢!
市面上有太多不同的Android版本。我們目前只支持 KitKat API 19(android-4.4.4_r1)。后續(xù)會(huì)支持更多版本...
如果你的APP使用了 Google Play Services 層,那么這些應(yīng)用不能在模擬器上直接運(yùn)行。這是因?yàn)槲覀儤?gòu)建的Android鏡像沒(méi)有包含GMS包(我們目前還沒(méi)有獲取到相關(guān)的許可證)。
你需要在x86下重新編譯你的代碼。如果你的代碼只能在ARM下運(yùn)行,或者使用了不能在x86下運(yùn)行的第三方庫(kù),那么目前你的代碼是無(wú)法在我們的模擬器上運(yùn)行的。
你只能在支持Hyper-V的操作系統(tǒng)上安裝我們的模擬器。不支持Hyper-V的操作系統(tǒng)有Windows 7和其他非Windows系統(tǒng),或者是在其他的虛擬機(jī)上運(yùn)行。
如說(shuō)上面所提的限制是你所急需的,目前的解決辦法是使用真機(jī)來(lái)測(cè)試(或者另找一款更好的模擬器)。我們會(huì)在后面的版本中把上面的限制列表變短,所以請(qǐng)?zhí)顚?xiě)調(diào)查問(wèn)卷來(lái)幫助我們進(jìn)行優(yōu)先級(jí)排序。