Microsoft 本周发布了 Visual Studio 2015 预览版, 里面包含 Android 开发工具. 安装的时候, 如果选 Android 开发, Visual Studio 会把调试 Android 应用程序用的 Visual Studio 模拟器也装上.
在介绍这个新模拟器之前, 我们先来聊一聊, 为什么需要一个新的 Android 模拟器 – 当然, 你也可以直接跳到自己感兴趣的部分去阅读 :-)
Android 模拟器存在的必要性
我们知道, 模拟器在 编程-编译-调试 开发周期中, 扮演着很重要的角色(甚至比物理设备还重要). 所以我们相信, 今天发布的这个模拟器, 在开发中是必不可少的.
有了优秀的模拟器, 不代表我们就不需要物理设备了. 反之亦然, 他们之间其实是互补的关系.
下列几种情况, 只能用物理设备测试, 模拟器派不上用场:
测试代码的性能. 虽然模拟器能帮你纠正代码中的错误, 但是它无法正确的给出, 代码在指定设备上的性能评估. 毕竟, 我们都希望测试的结果, 尽量接近用户实际使用的效果.
测试某些硬件问题. 比如, 你想测试下游戏的触摸灵敏度, 外放的音效, 或者调试 OEM 设备的 Bug , 这些测试只能在物理设备上进行.
评估真实的用户体验. 譬如, 你设计出来的人机交互界面, 适不适合用户边走路, 边单拇指操作?
除去上面列举的场景,大家应该都会很乐意使用模拟器。因为调试代码通常占用了80%的开发时间,而模拟器为我们大大提高了工作效率。(除非你的模拟器有其他阻塞性问题或者使用限制)。下面是使用模拟器的几个理由:
大部分的测试工作都是用来验证程序的正确性而非性能,并且大部分的代码都与底层硬件无关。所以是用模拟器是极好的。
购买一大堆硬件设备来测试是一件很奢侈的事情(特别是持续不断的购买新机)。大部分的硬件差异可以使用模拟器软件进行配置,比如说屏幕分辨率,不同屏幕的DPI,API级别/平台版本号等等。
使用物理动作来测试程序对传感器输入的反应也是很费劲的,比如说动作变化、地理位置变化或是网络/电池的变化。在这种场景下,选择模拟器来模拟传感器的输入就非常便捷高效,比如说模拟器可以模拟一段旅程中位置的变化,并测试应用程序对地理位置变化的响应。
使用模拟器还有一项而外的便利。管理多个物理连接的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的Andriod模拟器解决了以上痛点。废话不多说,下面开始给大家介绍使用VS的Android模拟器的调试方法,我们将从如何选择Android模拟器开始讲起。
用 Visual Studio 模拟器调试 Android 程序
无论你用的是哪一种编程模式: 用 JavaScript (或 TypeScript) 的 Cordova, C++, 或 是用 C# 的 Xamarin, 都可以在 Visual Studio 2015 预览版上 编写-编译-调试 Android 代码.
启动调试模式的时候, 要选择调试目标(Debug Target). 调试目标可以是一台物理设备, 或者是某个在你电脑上运行的模拟器. 我们来看看怎么给 Visual Studio 2015 预览版中的 Cordova 和 C++, 以及 Visual Studio 2013 的 Xamarin 选择一个调试目标.
C++ 项目的调试目标选择菜单如下图所示:
Cordova 项目要选择菜单的***两项, 具体看下面的截图:
(切记, 不要选 “Android Emulator” 这一项. 因为它运行的速度太慢了)
Xamarin 项目的选项如下图所示:
***把位于 项目属性-Android 选项 中的 "Use Fast Deployment" 勾选去掉.
注: 如果你想从别的 Android IDE 临时用下 VS 的模拟器应急. 首先, 按照上面介绍的方法启动模拟器; 然后, 把项目关掉, 保留模拟器继续运行就可以. 其他 IDE 可以通过 ADB 调用 VS 的模拟器.
选好调试目标后, 按 F5 , 你的应用就会发布到模拟器中. 就像平时调试 VS 的代码一样, 程序运行到断点处停下, 然后你可以查看堆栈, 变量等等. 现在, 大家都知道怎么用模拟器调试了吧? 那我们继续将其他功能。
传感器模拟以及Visual Studio Android模拟器的其他能力
除了使用模拟器做为部署的目标板以外,你还可以使用模拟器的传感器模拟以及其他功能。 下面会给大家讲解其中的一部分,顺序不分先后。
缩放
你可以在开发机上(主机侧)调整模拟器的显示大小。模拟器的DPI值是由你的主机显示器决定的,与缩放的大小无关。所以如果你觉得模拟器占用了太多的桌面空间,那就缩小它。
使用模拟器右侧的工具栏中的“Zoom”按钮,就可以调整大小。
你也可以使用全屏模式,点击"Zoom"按钮上方的“Fit to Screen”按钮即可。
如果你想对模拟器中运行的程序进行截屏(比如说,使用windows自带的截屏工具),要想取得***的效果,就要把模拟器的缩放比例调到***(也就是100%)。如果想要更好的效果,就要使用模拟器自带的截屏工具了,这个工具我后面也会提到。
屏幕的朝向/旋转
除非你的应用界面是固定不变的, 否则, 就应该测试下, 手机处在不同方向时, 应用界面翻转后的各种效果, 如: 竖屏, 左横屏, 右横屏. 垂直工具栏上有两个按钮 "左旋转"(Roate Left) 和 "右旋转" (Rotate Right), 分别可将模拟器向左和向右旋转. 旋转后, 模拟器的尺寸不发生改变.
网络信息
由于模拟器使用的是宿主机器上的网络连接, 所以网络部分不需要配置.
你可以点击垂直工具栏上的 "工具"(Tools) 按钮, 然后在展开的"附加工具" (Additional Tools)面板中点击 "网络"(Network) 选项卡查看网络配置信息.
定位 (GPS)
如果你的应用跟导航, 地理围栏(geofencing), 行走/骑行/驾驶有关. 那么, "附加工具"(Additional Tools)面板中的 “定位”(Location) 选项卡里头的定位跟模拟驾驶(driving simulation) 功能就会变得很有用 .
地图可以拖动过, 放大缩小, 甚至可以查找某个具体位置. 通过放置或移除地图上的大头针 (pin) 创建地图上的点(map points). 左下角显示的是坐标. 上边的工具栏的保存按钮, 可以将地图上的点存储为 XML 文件. 有需要时候, 再重新加载进来.
除了 “Live”模式 , 这种由地图上的点, 直接改变模拟器 GPS 位置外. 还有其他模式可以选择! 比如你想在地图上设置几个点, 并在这些点之间模拟移动的效果 . 那就选 “Pin” 模式. 然后点工具栏最右边的 Play 按钮,就能模拟出从一点到另外一点的移动效果.。甚至, 还可以设置移动的速度(以秒为单位)。
***,还有一个跟 “Pin” 模式差不多的 “Route” 模式。此模式也是模拟一点到另外一点的移动效果。不过多了点"曲折"。模拟器会自动计算出两点之间的实际路径,并以 1 秒钟为时间间隔,为这条路径创建隐形的点。而在这些点之间的移动速度,则取决于另外一个设置。该设置的选项有:“步行(Walking)” (5 公里/小时), “骑行(Biking)” (25 公里/小时), “限速(Speed Limit)” (在地图上, 不同位置, 速度也不一样), 和“快速(Fast)”。
加速传感器
如果你想测试应用对手机移动的响应效果, 那就打开 “附加工具(Additional Tools)” 面板中的 “加速传感器(Accelerometer)” 。
在 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), 可以将模拟器从休眠中唤醒.
截屏
要实现对应用截屏,打开"其他工具",切换到"截屏"标签。然后点击“捕捉"按钮,这样就可以实现截屏,并让你预览一下即刻所截屏。如果你打算保存这个截屏,点击"保存..."按钮。如果不喜欢你刚才的截屏,忽略或者再次点击"捕捉"按钮。
截屏工具总是实现(按照左下角所显示的清晰度的)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\vsemu.sdcard.vhd
这样VHD就被作为另外的一个驱动器安装到了你的Windows上,你可以像使用其它的驱动器一样来使用它. 在重启模拟器之前,你必须卸载VHD,你可以通过在驱动器上右键选择“弹出Eject”来实现这个步骤.
可以再镜像中实现对SD卡的支持让其它的内置Android应用和功能可以使用,比如浏览器下载和照相机应用——它为我带来了下一项能力.
照相机
通常你可能会要使用应用里面的照相机(使用一个合适的API),而我们支持这个功能. 你也可以直接使用内置的照相机应用. 当你在模拟器里面启动照相机时,你将会看到一个固定的图像,你可以获取这个图像的快照,以模拟拍照.
音频播放,键盘文字输入…
当然模拟器理所当然还会提供其它的一些功能,尽管他们需要来自产品团队的“努力” :-)。在这里我不会把所有的功能都列出来,单其中有两个值得注意:
你可以在模拟器中使用你机器的键盘输入文本
任何来自模拟器的音频播放都可以通过你机器的音响收听到
配置
在预览版中,提供了2组默认配置:
典型的Android手机配置:5吋屏幕,295 DDI,720x1280,1024MB
典型的Android平板配置:7吋屏幕,315DPI,1080x1920,2048MB
你可以在预览版中修改内存的分配,Hyper-V Manager的配置窗口中提供了配置“Startup RAM”的选项。注意,你也可以修改每个配置中使用的CPU核心数(默认值是2)。不过,我们还没有对所有的可能配置进行测试。
我们的工作才刚刚开始,在后面的版本中我们会提供更多的功能,同时也希望大家在下面的这个调查问卷中反馈意见,以便于我们对需求进行排序。
看看内部实现原理
如果你对Visual Studio Android模拟器的实现原理感兴趣,我可以简单地回答这个问题,就是我们重用了其他产品的工作成果。在概念上,一个模拟器软件可以分为以下4个部分:
虚拟机(表示为一个vhd),用于模拟你使用的目标板,在这这里目标机就是Android。我们先从Android Open Source Project (AOSP)上获取到代码,并加以改进,将其配置为一个x86的虚拟镜像,这样就可以使用Visual Studio来进行快速的调试。
Shell/Chrome,提供了用户交互界面,可以用它来装载虚拟镜像并将其进行渲染显示出来。可以把这个过程和远程桌面做一下类比:其实你就是远程连接到一个本地镜像上。我们的工作就是从这里开始,直接借鉴了Windows Phone模拟器(我们内部称其为XDE)的shell/chrome。 然后根据Android的特殊需求,做了一些必要的修改。
虚拟化技术,XDE使用先虚拟化技术来装载镜像,这样才能进行远程连接和控制。Windows有深厚的虚拟化技术功底,我们正是使用了虚拟化技术Hyper-V来完成这项工作。
连接管道,VS和XDE需要通过连接管道来通信,同样的调试引擎和虚拟镜像也需要。这里我们重用了XDE与Visual Studio之间现有的连接机制,同时也使用了Android Debug Bridge (ADB) 。
现在,再来看看目前这个应用的使用限制,我再次希望大家给我们反馈改进意见,我们会优先解决大家反馈的问题。
当前的使用限制
今天给大家分享的是早期的预览版,这个版本中还有不少问题和Bug,我希望大家能把更多的问题反馈为我们。 同时这个版本还有不少已知的使用限制--大家赶紧把你们最想要的功能反馈给我们,我们会优先处理:
直接或间接使用OpenGL 2以及以上版本的应用程序,模拟器目前无法渲染显示。这项功能不久就会支持,我们已经在内部版本中实现,用来会感觉非常流畅!
市面上有太多不同的Android版本。我们目前只支持 KitKat API 19(android-4.4.4_r1)。后续会支持更多版本...
如果你的APP使用了 Google Play Services 层,那么这些应用不能在模拟器上直接运行。这是因为我们构建的Android镜像没有包含GMS包(我们目前还没有获取到相关的许可证)。
你需要在x86下重新编译你的代码。如果你的代码只能在ARM下运行,或者使用了不能在x86下运行的第三方库,那么目前你的代码是无法在我们的模拟器上运行的。
你只能在支持Hyper-V的操作系统上安装我们的模拟器。不支持Hyper-V的操作系统有Windows 7和其他非Windows系统,或者是在其他的虚拟机上运行。
如说上面所提的限制是你所急需的,目前的解决办法是使用真机来测试(或者另找一款更好的模拟器)。我们会在后面的版本中把上面的限制列表变短,所以请填写调查问卷来帮助我们进行优先级排序。