使用Visual Studio 2015调试 Marmalade所构建的Android应用

[原文发表地址]: Using Visual Studio 2015 to debug an Android app built with Marmalade

[原文发表时间]:2015/12/7 2:52 PM

对于本篇博客,我们欢迎来自Marmalade ( https://www.madewithmarmalade.com ) 的客座作者 Alex Baude。他的团队最近发布的Marmalade Platform 现在支持Visual Studio 2015 ,因此我们邀请他就这方面的工作给我们提供更丰富的信息。

Visual Studio 2015为在Android平台上构建和调试跨平台C++代码提供了新的跨平台本地开发技术。开箱即用,Visual Studio 2015提供了基于Android Native-Activity的工程模板,可以快速创建高性能的应用程序。

Marmalade平台包括一个跨平台C++SDK,Marmalade Core,它的一个关键功能是一个平台抽象API,将本地平台的多数复杂性隐藏了起来,并且开发人员可以编写一次代码而部署于很多目标。基于C++的Marmalade Core 应用程序可以部署到iOS,Android,NaCL,Windows Phone,以及Windows 10等等。

而现在,根据我们最新发布的SDK,我们对Visual Studio 2015的这项新的跨平台功能进行了扩充,本地调试的Marmalade Core 应用程序可以在Android(x86)的Visual Studio Emulator或连接的Android设备(ARM)上运行。

使用Visual Studio 2015构建一个Marmalade Core应用程序

Marmalade Core工程默认生成一个Visual Studio解决方案,它能生成一个可以无需重复编译即可部署到多个目标平台的应用程序二进制。所以它也叫做”单一二进制“,使用Marmalade专有技术,可以用来从Windows机器以及Android机器部署到iOS上。这种类型的Visual Studio解决方案,对于分布式的编程或在Marmalade桌面模拟器上调试是理想的。

对于设备本地调试,Marmalade Core工程也可以生成一个特殊的Visual Studio解决方案,它可以在Window Phone、Windows 10上调试, 现在也可以在Android上调试。

我们可用Android Native Debug方式启动Visual Studio 2015,无论是从命令行还是Marmalade中心。

从命令行,运行以下命令:

mkb MyProject.mkb --buildenv=VC14 --buildenv-toolset=ANDROIDNATIVE

从Marmalade中心,在工程页选择Android作为目标平台并点击如下图的Open in IDE for debugging按钮。

在Visual Studio IDE中您会发现生成的解决方案包含如下图所示的两个工程。

Android.Packaging

这个工程包含需要将您的应用程序打包和部署到一个Android目标的Visual Studio配置。

<app_name>_vc14_androidnativetoolset

这个工程包含您应用程序的源文件,以及生成一个动态库,它将包含在由Android.Packaging工程生成的APK文件中。

Marmalade的makefile builder系统将会自动使用适合Marmalade Core应用程序的合适的flags,填充工程的C++和连接器设置。默认情况下选择GCC 4.9构建ARMv7-a和vfpv3-d16 fpu变量和softfp float ABI。

只要工程一经生成,开发人员就可以像往常一样,使用新Visual Studio 2015中的Android特定功能,例如代码完成和代码高亮的智能感应,从这个IDE端编辑,构建和运行此应用程序。

使用Visual Studio2015调试Marmalade Core应用程序

调试MarmaladeCore应用程序是比较容易的:像平常一样简单地使用已经存在的Visual Studio 调试功能。

例如,按F5,应用程序将会被构建,打包然后部署到链接的Android设备或者Visual Studio Emulator for Android上。应用程序将会自动地加载到调试器中。

对于Visual Studio 2015 深层次的调试能力的展示,我们将通过一个调试会话来示范。它使用了一个真实的游戏,SineWave,这个游戏是Mad Fellows Games Studio使用Marmalade开发的,它有iOS, Android和 Windows版本. 这是个未来的轨道射击游戏,游戏中的音乐节奏是为了帮助您确定移动时间点的。

设置断点监测局部变量

在主菜单Sound按钮的回调函数中设置一个断点,用来展示一些用户交互发生时刚好到达这个断点。

MainMenu.cpp代码窗口,黄色箭头显示当前的执行位置。当游戏暂停的时候,你可以拖动这个黄色的箭头到另一个位置,使程序可以绕过一个特殊的代码路径跳到那个要执行的点。断点可以在代码窗口和Breakpoint窗口中进行关闭和开启。

一个很有用的功能是Call Stack窗口,它为函数提供了代码路径,以及源代码和行号。同样地,在Local窗口,Visual Studio能够快速地进入局部变量,并在当前范围内提供了内存地址和变量值。在当前这个例子中是CMainMenu实例和它的成员变量。

逐句反汇编

我们经常需要看一下特殊函数的反汇编,尤其是代码中包含内联汇编的情况。Visual Studio在X86和ARM上具有这种能力,请看下面在一个相同断点的示例:

使用Immediate窗口

更多的开发同样需要进入到Immediate窗口来评估运行时间的函数(和那个设置断点的函数在同一个线程上)。这对于评估动态的或在每个设备上不同的代码是非常有用的。

以下是Marmalade Core函数的一个例子,s3eDeviceGetInt, 被调用去检索如PPI,Logical PPI, 空闲内存量和ARM设备以及x86模拟器的属性:

x86 Emulator ARM device

 

总结

Visual Studio 2015上新的构建和调试本地C++ Android应用程序的能力,被Marmalade平台全面地利用了起来。这就需要我们为我们用户的开发工具提供更加强大的功能。

Visual Studio Emulator for Android 提供了一个快速的X86模拟器,用以在使用不同的技术规范而形成的各种不同型号和Android版本上进行调试。 同样具备在插入的设备上调试的能力,使开发者只需要最小的努力就能很方便地部署和基准测试他们的游戏,所有这些都在Visual Studio IDE里面完成。

Alex Baude, Marmalade Technologies高级软件工程师,工作在Marmalade平台: 一个跨平台的SDK,开发人员能够使用它基于单个代码库面向不同的手机和桌面平台。他长期从事针对Windows Phone和iOS的研发,尤其是跨平台编译器和底层工具的开发,目前专注于在Marmalade SDK中扩展Android 支持。