介绍 Visual Studio 的 Android 模拟器

[原文发表地址]:Introducing Visual Studio’s Emulator for Android

[原文发表时间]:2014/11/12 7:31 AM

这篇文章在2015年2月被更新以反映最新的变化。

 Microsoft Visual Studio 2015 现已添加Android开发选项:C++,Cordova,以及是用C# 的 Xamarin。当你选择一个Android开发选项,Visual Studio将安装全新的Visual Studio模拟器用作Android应用程序的调试。你也可以点这里查看视频介绍。

在介绍这个新模拟器之前,我们先来聊一聊,为什么需要一个新的Android 模拟器 – 当然,你也可以直接跳到自己感兴趣的部分去阅读:-)

Android模拟器存在的必要性

我们知道,模拟器在编程-编译-调试开发周期中,扮演着很重要的角色(甚至比物理设备还重要)。所以我们相信,今天发布的这个模拟器,在开发中是必不可少的。

有了优秀的模拟器,不代表我们就不需要物理设备了。反之亦然,他们之间其实是互补的关系。

下列几种情况,只能用物理设备测试,模拟器派不上用场:

  1. 测试代码的性能。虽然模拟器能帮你纠正代码中的错误,但是它无法正确的给出,代码在指定设备上的性能评估。毕竟,我们都希望测试的结果,尽量接近用户实际使用的效果。   
  2. 测试某些硬件问题。比如,你想测试下游戏的触摸灵敏度,外放的音效,或者调试 OEM 设备的 Bug ,这些测试只能在物理设备上进行。
  3. 评估真实的用户体验。譬如,你设计出来的人机交互界面,适不适合用户边走路,边单拇指操作? 

除去上面列举的场景,大家应该都会很乐意使用模拟器。因为调试代码通常占用了80%的开发时间,而模拟器为我们大大提高了工作效率。(除非你的模拟器有其他阻塞性问题或者使用限制)。下面是使用模拟器的几个理由:

  1. 大部分的测试工作都是用来验证程序的正确性而非性能,并且大部分的代码都与底层硬件无关。所以是用模拟器是极好的。
  2. 购买一大堆硬件设备来测试是一件很奢侈的事情(特别是持续不断的购买新机)。大部分的硬件差异可以使用模拟器软件进行配置,比如说屏幕分辨率,不同屏幕的DPI,API级别/平台版本号等等。
  3. 使用物理动作来测试程序对传感器输入的反应也是很费劲的,比如说动作变化、地理位置变化或是网络/电池的变化。在这种场景下,选择模拟器来模拟传感器的输入就非常便捷高效,比如说模拟器可以模拟一段旅程中位置的变化,并测试应用程序对地理位置变化的响应。
  4. 使用模拟器还有一项而外的便利。管理多个物理连接的USB设备 (一大堆连线和接口) ,是很麻烦的。此时使用模拟器就简单得多,模拟器就是一个运行在电脑上普通的应用层序,除去了物理连接的烦恼,非常便于管理。

所以说模拟器是软件的开发的好伴侣,我们希望把VS的模拟器打造成第一流的。我们从开发者那里收集到现有模拟器的难点,在我们的版本上予以一一击破:

  • 速度慢。这是从Android开发者那排名第一的抱怨。“这个模拟器速度慢极了,严重影响了我的生产率,我还不如用真机测试。”速度慢是不可接受的。使用模拟器应该比使用真机的运行速度更快才是,这样才能提高测试效率。记住一点,我们并不是在测试代码的运行性能,对功能测试来说就是要让模拟器尽可能地跑得快。
  • 与Windows的Hyper-V冲突。很多模拟器在运行时要关闭Hyper-V,或是在使用Hyper-V时,性能反而更糟糕。但使能Hyper-V是大部分开发者的常见配置,频繁重启电脑来开关Hyper-V是不可接受的。
  • 对那些要使用Windows Phone模拟器(基于Hyper-V)的开发者来说就更为苦恼。总不能为因为要测试跨平台的代码,不断的重启和配置电脑设置吧。
  • 额外的购买和安装步骤。如果你已经在使用Visual Studio,那么恭喜你,你不许要再额外购买和安装一款其他的模拟器软件。
  • 更多的费用开销。购买一款卓越的模拟器,也意味着更高的开销,这也是拒绝使用模拟器的一个主要原因。Visual Studio的Android模拟器是附赠的,不需要额外的费用。

简单来说,我们在Visual Studio的Android模拟器解决了以上痛点。废话不多说,下面开始给大家介绍使用VS的Android模拟器的调试方法,我们将从如何选择Android模拟器开始讲起。

用Visual Studio 模拟器调试 Android 程序

无论你用的是哪一种编程模式:用 JavaScript(或 TypeScript)CordovaC++,或是用 C# 的Xamarin,都可以在Visual Studio 2015 预览版上 编写-编译-调试Android 代码。

联系这三个选项,当你启动调试模式时,要选择调试目标(Debug Target)。调试目标可以是一台物理设备,或者是某个在你电脑上运行的模拟器。我们来看看怎么给 Visual Studio 2015 预览版中的 Cordova 和C++,以及 Visual Studio 2015的 Xamarin 选择一个调试目标。

C++项目的调试目标选择菜单如下图所示:

确保“x86“被选定为体系结构。Cordova项目要选择菜单的最后四项,具体看下面的截图:

(切记,不要选SDK附带的“Android Emulator” 这一项, 因为它运行的速度太慢了)

Xamarin 项目的选项如下图所示:

为了获得Xamarin项目的最佳效果,最好把位于 项目属性-Android 选项 中的 "Use Fast Deployment" 勾选去掉。

如果你想从别的 Android IDE 临时用使用VS 的模拟器应急 首先 ,再Visual Studio2015中按照上面介绍的方法启动模拟器 ; 然后 把项目关掉 保留模拟器继续运行就可以 其他 IDE 可以通过 ADB 调用 VS 的模拟器

选好调试目标后,按F5 ,你的应用就会发布到模拟器中。就像平时调试VS 的代码一样,程序运行到断点处停下,然后你可以查看堆栈,变量等等。现在,大家都知道怎么用模拟器调试了吧?那我们继续将其他功能。 

传感器模拟以及Visual Studio Android模拟器的其他能力

除了使用模拟器做为部署的目标板以外,你还可以使用模拟器的传感器模拟以及其他功能。下面会给大家讲解其中的一部分,顺序不分先后。

缩放

你可以在开发机上(主机侧)调整模拟器的显示大小。模拟器的DPI值是由你的主机显示器决定的,与缩放的大小无关。所以如果你觉得模拟器占用了太多的桌面空间,那就缩小它。

使用模拟器右侧的工具栏中的“Zoom”按钮,就可以调整大小。

你也可以使用全屏模式,点击"Zoom"按钮上方的“Fit to Screen”按钮即可。

如果你想对模拟器中运行的程序进行截屏(比如说,使用windows自带的截屏工具),要想取得最好的效果,就要把模拟器的缩放比例调到最大(也就是100%)。如果想要更好的效果,就要使用模拟器自带的截屏工具了,这个工具我后面也会提到。

屏幕的朝向 / 旋转

除非你的应用界面是固定不变的,否则,就应该测试下,手机处在不同方向时,应用界面翻转后的各种效果,如: 竖屏,左横屏,右横屏。垂直工具栏上有两个按钮 "左旋转"(Rotate Left) 和 "右旋转" (Rotate Right) ,分别可将模拟器向左和向右旋转。旋转后,模拟器的尺寸不发生改变。

网络信息

由于模拟器使用的是宿主机器上的网络连接,所以网络部分不需要配置。

你可以点击垂直工具栏上的 "工具"(Tools) 按钮,然后在展开的"附加工具" (Additional Tools)面板中点击 "网络"(Network) 选项卡查看网络配置信息。

clip_image010

定位 (GPS)

如果你的应用跟导航,地理围栏(geofencing),行走/骑行/驾驶有关。那么,"附加工具"(Additional Tools)面板中的 “定位”(Location) 选项卡里头的定位跟模拟驾驶(driving simulation) 功能就会变得很有用。
 clip_image012

地图可以拖动过,放大缩小,甚至可以查找某个具体位置。 通过放置或移除地图上的大头针(pin) 创建地图上的点(map points) 。左下角显示的是坐标。上边的工具栏的保存按钮,可以将地图上的点存储为 XML 文件。有需要时候,再重新加载进来。

除了 “Live” 模式, 这种由地图上的点,直接改变模拟器 GPS 位置外。还有其他模式可以选择! 比如你想在地图上设置几个点,并在这些点之间模拟移动的效果 。那就选 “Pin” 模式。然后点工具栏最右边的 Play 按钮,就能模拟出从一点到另外一点的移动效果。甚至,还可以设置移动的速度(以秒为单位)。

最后,还有一个跟 “Pin”模式差不多的 “Route” 模式。 此模式也是模拟一点到另外一点的移动效果。不过多了点"曲折"。模拟器会自动计算出两点之间的实际路径,并以1 秒钟为时间间隔,为这条路径创建隐形的点。而在这些点之间的移动速度,则取决于另外一个设置。该设置的选项有:“步行(Walking)” (5 公里/小时),“骑行(Biking)” (25 公里/小时),“限速(Speed Limit)” (在地图上,不同位置,速度也不一样),和“快速(Fast)”。

加速传感器

如果你想测试应用对手机移动的响应效果,那就打开“附加工具(Additional Tools)” 面板中的 “加速传感器(Accelerometer)” 。

clip_image014
 在 3D 面板中,直接按住里面那个红点,朝你想模拟的方向拖动。如果你的应用已经写了处理移动事件的代码。那它就能接收到手机移动的事件。

左下角的 X,Y,Z 值,可以通过点击 “Reset” 按钮重置。也可以由:直立竖屏(Portrait Standing),直立横屏(Landscape Standing),平躺竖屏(Portrait Flat),和平躺横屏(Landscape Flat),这几项来设置手机的初始朝向(Orientation)。

最后,你可以点击右下角的 “Play”按钮模拟震动效果。我们能看的到的震动效果,实际上就是X,Y,Z 这几个值发生改变而已。如果这几个值不再急剧变化,说明震动已经停止。

电源 / 电池模拟 ( 以及开关机按钮 )

假如,你的应用需要对电池的电量变化做出响应。那么你就会喜欢上 “附加工具(Additional Tools)” 面板中的 “电池(Battery)” 选项卡里面提供的功能。

里面有一个滑动条,用来设置电池的剩余电量。当你调整电量的时候,右上角的电池图标也会跟着改变。你的应用也会做出相应的反应。

如果你把 “电池充电(Charging)” 勾选去掉,过一段时间后,模拟器的屏幕就会变黑(blank)。这个时间可以在系统设置(Settings)-显示(Display)-休眠(Sleep) 里面设置。点垂直菜单栏的电源开关按钮(Power),可以将模拟器从休眠中唤醒。

clip_image016

截屏

要实现对应用截屏,打开"其他工具",切换到"截屏"标签。然后点击“捕捉"按钮,这样就可以实现截屏,并让你预览一下即刻所截屏。如果你打算保存这个截屏,点击"保存…"按钮。如果不喜欢你刚才的截屏,忽略或者再次点击"捕捉"按钮。
 clip_image018

截屏工具总是实现(按照左下角所显示的清晰度的)100%进行截屏的,不会理会缩放设置如何。同时总是正面截图,不管你选择何种图像旋转方式。

通过拖拽安装 APKs 

APK 是 Android 的安装文件。要在 Visual Studio 模拟器上安装 APK 文件,直接把 APK 文件拖到模拟器里面就可以。安装的时候,模拟器会提示 “正在复制文件…”。安装完毕,会有一个消息框提示 “ xxx 文件已经成功安装到 Android 系统中”。要确保你的 APK 文件是用 x86 模式生成的!

当然,你也可以把其他类型的文件(非 APK 文件)拖到模拟器中,这些文件会保存到 SD 卡上。这也是我们接下来要讲的内容。

SD

如果你的有向目标设备的SD卡读写的需求,模拟器可以利用一个硬盘上的文件夹模拟这个SD卡。

要注意Android镜像会使用一个独立的VHD文件来支持对SD卡的模拟。所以如果你想要在你的开发机器上和SD卡传输文件,你可以把这个VHD安装到你的Windows上:关闭模拟器(以停止VM的运行),然后再Windows Explorer上找到VHD的位置,双击它就能安装。VHD默认会位于下面的这儿路径下面:

C:\Users\%username%\AppData\Local\Microsoft\XDE\Android\vsemulator.[targetname].sdcard.vhd, where[targetname] is of the format size.android.apilevel (eg.vsemulator.phone.android.api19.sdcard.vhd)

这样VHD就被作为另外的一个驱动器安装到了你的Windows上,你可以像使用其它的驱动器一样来使用它。在重启模拟器之前,你必须卸载VHD,你可以通过在驱动器上右键选择“弹出Eject”来实现这个步骤。

可以再镜像中实现对SD卡的支持让其它的内置Android应用和功能可以使用,比如浏览器下载和照相机应用——它为我带来了下一项能力。

照相机

通常你可能会要使用应用里面的照相机(使用一个合适的API),而我们支持这个功能。你也可以直接使用内置的照相机应用。当你在模拟器里面启动照相机时,你将会看到一个固定的图像,你可以获取这个图像的快照,以模拟拍照。你还可以导航到“照相机”选项中的其他工具,在这里你可以切换前置或后置摄像头显示默认动画,来自文件的图片,或一个附加的摄像头。任何能够被Windows识别的摄像头,将在下拉列表中显示前置和后置摄像头。

多点触控

如果你的应用程序同时使用多个触摸点(例如,捏取屏幕功能),你可以在模拟器显示旁边的竖直工具栏上选择“单点输入”和“多点触摸输入”

选择“多点触摸输入”后将覆盖三个点。外侧的两个大点充当捏取和缩放的接触点,内部点控制触摸点的源点。如果你在使用一个触摸屏上的模拟器,你可以用自己的手指直接与模拟器的屏幕进行交互。

音频播放,键盘文字输入…

当然模拟器理所当然还会提供其它的一些功能,尽管他们需要来自产品团队的“努力” :-)。在这里我不会把所有的功能都列出来,单其中有两个值得注意:

  • 你可以在模拟器中使用你机器的键盘输入文本
  • 任何来自模拟器的音频播放都可以通过你机器的音响收听到

配置

随着CTP6的发布,你可以挑选KitKat (Android Version 4.4.1, API Level 19)和Lollipop (Android Version 5.0, API Level 21)2组默认配置:

  • 典型的Android手机配置:5”屏幕,295 DDI,720x1280,1024MB
  • 典型的Android平板配置:7”屏幕,315 DPI,1080x1920,2048MB

你可以在预览版中修改内存的分配,Hyper-V Manager的配置窗口中提供了配置“Startup RAM”的选项。注意,你也可以修改每个配置中使用的CPU核心数(默认值是2)。不过,我们还没有对所有的可能配置进行测试。
 clip_image020

我们的工作才刚刚开始,在后面的版本中我们会提供更多的功能。

看看内部实现原理

如果你对Visual Studio Android模拟器的实现原理感兴趣,我可以简单地回答这个问题,就是我们重用了其他产品的工作成果。在概念上,一个模拟器软件可以分为以下4个部分:

  1. 虚拟机(表示为一个vhd),用于模拟你使用的目标板,在这这里目标机就是Android。我们先从Android Open Source Project(AOSP)上获取到代码,并加以改进,将其配置为一个x86的虚拟镜像,这样就可以使用Visual Studio来进行快速的调试。
  2.  Shell/Chrome,提供了用户交互界面,可以用它来装载虚拟镜像并将其进行渲染显示出来。可以把这个过程和远程桌面做一下类比:其实你就是远程连接到一个本地镜像上。我们的工作就是从这里开始,直接借鉴了Windows Phone模拟器(我们内部称其为XDE)的shell/chrome。然后根据Android的特殊需求,做了一些必要的修改。
  3. 虚拟化技术,XDE使用先虚拟化技术来装载镜像,这样才能进行远程连接和控制。Windows有深厚的虚拟化技术功底,我们正是使用了虚拟化技术Hyper-V来完成这项工作。
  4. 连接管道,VS和XDE需要通过连接管道来通信,同样的调试引擎和虚拟镜像也需要。这里我们重用了XDE与Visual Studio之间现有的连接机制,同时也使用了Android Debug Bridge (ADB)

现在,再来看看目前这个应用的使用限制,我再次希望大家给我们反馈改进意见,我们会优先解决大家反馈的问题。

当前的使用限制

我们的目标是时常更新模拟器,希望大家通过报告遇到的高品质的问题/错误使我们做到这点。我们还存在不少已知的使用限制—请告诉我们哪些对你是最重要的,我们会优先处理:

  • 如果你的应用程序直接或间接使用OpenGL ES 3.0以及以上版本,模拟器目前无法渲染显示。这是因为我们使用开源的ANGLE(类似本地图形层引擎)项目, 在OpenGL ES和DirectX被转发到主机的GPU运行之前,转化OpenGL ES对DirectX的调用。一旦ANGLE支持OpenGL ES 3.0,我们就会将它运行在模拟器上。
  • 如果你的APP使用了 Google Play Services 层,那么这些应用不能在模拟器上直接运行。这是因为我们构建的Android镜像没有包含GMS包(我们目前还没有获取到相关的许可证)。
  • 你需要在x86下重新编译你的代码。如果你的代码只能在ARM下运行,或者使用了不能在x86下运行的第三方库,那么目前你的代码是无法在我们的模拟器上运行的。
  • 你只能在支持Hyper-V的操作系统上安装我们的模拟器。不支持Hyper-V的操作系统有Windows 7和其他非Windows系统,或者是在其他的虚拟机上运行。

如说上面所提的限制是你所急需的,目前的解决办法是使用真机来测试(或者另找一款更好的模拟器)。我们会在后面的版本中把上面的限制列表变短。