Windows Phone

更快地在市场上推出 Windows Phone 应用程序

Cheryl Simmons

Windows Phone SDK 7.1 包含一些卓尔不凡的工具,可用于在将面向 Windows Phone 7.5 的应用程序推向市场之前评估应用程序是否符合认证标准和提升性能。在本文中,我将通过示例应用程序引导你使用市场测试工具包和性能分析工具,并展示如何使用这些工具来评估你的应用程序是否已准备好推向市场。我还将演示如何使用这些工具提供的数据来改进应用程序,以便应用程序在第一次试发行时便能获得市场认可。有关市场认证要求的详细信息,请参阅 MSDN 库文章“Windows Phone 应用程序认证要求”(wpdev.ms/certreq)。

Windows Phone SDK 7.1 中包含了本文所用的全部工具,可以从 wpdev.ms/wpsdk71rtw 下载它。

示例应用程序和测试工具

为了练习使用市场测试工具包和性能分析工具,我创建了一个名为“Examine the Stamen”的示例应用程序,这是一个简单的鲜花识别应用程序。我为我的母亲创建了这个应用程序;她可以使用这个应用程序来提高辨认鲜花的能力。这个应用程序的开始屏幕上将显示多张较小的鲜花图片。用户点击鲜花后,应用程序将导航到另一个页面,其中显示所选鲜花的较大图片。再次点击该图片,消息框中将显示鲜花的名称。图 1 显示了在应用程序中导航时显示的图像。(另外,我使用的是 Windows Phone Emulator 中的新屏幕快照工具来获取这些屏幕快照。有关详细信息,请参阅 MSDN 库文章“操作方法: 为 Windows Phone Marketplace 创建屏幕快照”(wpdev.ms/rYoZKP))。

Images Displayed in the Examine the Stamen Program图 1 Examine the Stamen 程序中显示的图像

虽然此应用程序并不完全属实,不过也体现了合理的手机应用程序导航模型。我将在 Visual Studio 中使用市场测试工具包评估此应用程序,然后使用 Windows Phone 性能分析工具进一步检查。在发现任何问题之后,我将使用文档资源来判断如何修复这些问题,然后使用工具重新进行测试。

我们现在开始吧。

使用市场测试工具包

我已经为 Examine the Stamen 创建了颇具吸引力的 UI 和合理的导航模型。我打算在以后添加更多鲜花,不过现在则希望尽快将应用程序推向市场。对我而言,下一步是使用市场测试工具包,通过自动化、监视和手动测试套件来评估应用程序是否可以推向市场。

为了运行测试,我在 Visual Studio 中打开应用程序,然后在“项目”菜单上选择“市场测试工具包”。

此时将在 Visual Studio 中打开一个新选项卡,其中显示了市场测试工具包测试套件。图 2 显示了该的测试工具包的第一页。

The First Page of the Marketplace Test Kit in Visual Studio图 2 Visual Studio 中市场测试工具包的第一页

可用的测试套件显示在左侧的选项卡中。使用“应用程序详细信息”选项卡可以指定用于自动测试的应用程序图像。自动测试评估应用程序 XAP 大小、插图和屏幕快照是否符合认证要求,并确定应用程序所使用的资源数量。手动测试则提供了引导你使用应用程序的步骤,并确保应用程序符合附加的认证标准。

在本文中,我将重点介绍监视测试。有关所有四种测试套件的详细信息,请参阅“Windows Phone 市场测试工具包”MSDN 库页 (wpdev.ms/toHcRb)。

监视测试套件评估应用程序是否符合重要的认证标准,例如:

  • 启动时间
  • 应用程序内存使用峰值
  • “后退”按钮处理
  • 由于未处理的异常造成的应用程序突然退出

运行监视测试

要运行监视测试,需要启动应用程序的发行版、将其部署到设备上(该测试在仿真器上无法工作)并在应用程序中浏览。配置此项的选项位于 Visual Studio 中的“标准”工具栏上。运行监视测试的目标是按照应用程序用户的方式浏览应用程序,练习浏览到所有可能的浏览路径。执行这些操作时,测试工具包将监视应用程序并收集相关数据。

通过监视测试对应用程序进行测试时,还需要测试应用程序在终止后短时间内重新激活的性能。这种终止并重新激活的过程称为“逻辑删除”。在 Windows Phone 7.5 中,应用程序在逻辑删除之前将自动进入休眠状态。

要强制应用程序立即执行逻辑删除以进行调试和测试,请在“项目”属性的“调试”选项卡上选择“调试期间在停用后进入逻辑删除状态”选项。在“项目”菜单上选择“属性”以打开项目属性。图 3 显示选中了此选项。有关逻辑删除的详细信息,请参阅“Windows Phone 执行模型概览”MSDN 库页 (wpdev.ms/ExMod)。

Selecting the Option to Test Tombstoning in Project Properties图 3 在项目属性中选择选项以测试逻辑删除

配置这些选项之后,我将返回“市场测试工具包”选项卡。接入开发人员注册的设备,在测试工具包的“监视测试”页上单击“启动应用程序”。

应用程序启动后,我将来回浏览、选择鲜花、点击名称和单击“后退”按钮以返回应用程序的开始页。点击“开始”按钮,然后点击“后退”按钮以强制应用程序执行逻辑删除并返回。

当我觉得已经按照用户的通常使用方式浏览并且已执行逻辑删除和重新激活了应用程序之后,我可以停止应用程序和测试会话。为了实现最佳结果,我在应用程序的开始页上单击“后退”按钮以结束测试会话,从而退出应用程序。然后,可以在测试工具包中单击“监视测试”页上的“关闭应用程序”按钮,不过,为了得到最准确的测试结果,我使用“后退”按钮退出应用程序。应用程序退出时,监视会话结束。

测试会话结束后,测试工具包的结果状态栏中将显示套件正在分析结果,分析完成后将更新结果表。

图 4 中显示的应用程序结果让我感到震惊。

Test Results Showing Two Failures图 4 测试结果显示两处失败

在这个测试套件的四项测试中,我的应用程序有两处失败。启动时间太长并且使用的内存过多。我决定进行进一步研究。

使用性能分析工具

一般而言,要想让应用程序在市场上受到欢迎,应用程序必须性能优秀,响应迅速。至少,你应该研究并修复测试工具包所确定的性能问题。对于上述任意一种情形,你都可以使用 Windows Phone 性能分析工具(也称为分析器)。

现在我关闭测试工具包,并决定使用分析器来查看启动时间和内存问题。这是一个很好的工具,它可以显示应用程序的潜在问题以及更正这些问题的可能处理方法。

分析器有两个选项:

  • 执行分析: 执行分析器将评估应用程序的帧速率、CPU 使用率和一般内存使用情况。你可以使用该工具深入研究填充速率、创建了多少个画面以及可能影响应用程序性能的其他执行详细信息。
  • 内存分析: 内存分析器显示内存使用情况、图像加载以及垃圾收集事件。使用内存分析器可以查看内存使用趋势,这可以指示内存泄漏情况。

除非你确定应用程序仅存在内存问题,否则请选择执行分析器。我知道存在内存问题,但又非常关注启动时间问题,因此我决定首先使用执行分析器查看我的应用程序。

在 Visual Studio 中打开应用程序后,转到“调试”菜单,然后选择“启动 Windows Phone 性能分析”。(注意: 如果你使用的是 Visual Studio Premium 或 Ultimate,请不要选择“启动性能分析”,此选项不适用于手机项目。)

打开性能分析工具之后,Visual Studio 中将显示带有当前分析会话名称的新选项卡。该名称包括项目的名称以及分析会话的日期/时间,其后为 .sap 后缀,用于分析结果文件。这些文件始终保存在项目中,因此可以反复查看。图 5 显示了在运行任何测试之前的“性能分析”选项卡。

The Performance Analysis Tab Before Any Tests Have Been Run图 5 运行任何测试之前的“性能分析”选项卡

在分析器选项卡上,我选择了“执行”选项。为了获得最佳结果,确保在 Visual Studio 工具栏上的部署和调试选项框中仍选择了“Windows Phone 设备和版本”,并确保设备已接入且未锁定。(注意: 使用分析器时,可以将应用程序部署到仿真器上,但结果无法指示设备性能。)

单击“启动应用程序”以启动分析会话。与市场测试工具包类似,我按照用户的方法使用应用程序,确保执行了逻辑删除并至少返回一次应用程序。使用“后退”按钮退出应用程序,要获得最准确的结果,建议使用这种方法,不过你也可以使用性能分析工具中的“停止分析”选项来结束分析会话。分析器会耗费一些时间来分析结果,并以图形格式将结果显示在页面上(如图 6 所示)。结果非常有趣。

Results of a Performance Analysis Test图 6 性能分析测试结果

图形中 CPU 使用情况的绿色部分表示屏幕更新和触碰输入。可以看到,最初 CPU 使用率很高,由于启动时间缓慢,这不足为奇。还可以看到,在加载图像时也显示了很高的 CPU 使用峰值,并且内存使用不断攀升。查看这些结果,无需进一步检查,我便可以知道内存使用问题可能与应用程序中的图像处理方式相关。虽然此图形表明,应用程序退出时将释放使用的所有内存,但是我还是担心,如果应用程序长时间运行而不是像测试中这样运行短短几秒,这可能会造成设备崩溃。

现在,重新运行性能分析工具,并选中内存选项,这可以确认我的内存使用不断增长的问题。

查找并修复问题

要使用分析工具跟踪问题,请在图形中选择问题区域,然后在“观察摘要”部分中查看说明。

在执行分析器结果中,单击并拖动鼠标以选择显示 CPU 使用峰值的图形部分。此时将立即更新“性能警告”部分,其中显示需要研究的问题(请参见图 7)。

A Performance Warning About High CPU Usage on the UI Thread图 7 关于 UI 线程的高 CPU 使用率性能警告

根据“观察摘要”,应用程序使用了大量 CPU 来执行 UI 线程上的函数。这显然会导致启动时间缓慢和整体性能低下,但我不确定这是否会造成内存问题。分析器的优点在于它提供了一些跟踪说明,因此,我将进行跟踪。依次选择“CPU 使用率”和“函数”。结果表随即更新,我按“包含样本 %”列对结果进行排序。此时将以蓝色显示我的应用程序函数调用,并带有包含命名空间(在本例中可能为 MemoryLeak)、类和方法名的完全限定名。此外,函数调用是指向代码中的方法的活动链接。图 8 显示了这些结果。

The Peformance Analysis Tool Shows Methods That Might Be Causing Problems图 8 性能分析工具显示可能导致问题的方法

通过查看这些结果,我可以确定在加载第二个页面时执行的方法使用了大量 CPU。这可能不会修复启动时间的问题,但绝对可以改善内存问题。

单击链接以查看 FlowerPage.OnNavigatedTo 方法。此方法创建了鲜花对象列表,并使用 LoadBitmap 方法为每朵鲜花加载一张位图。以下是对 LoadBitmap 方法的典型调用:

bitmap = LoadBitmap("/MemoryLeak;component/Images/tulip.jpg");

以及加载资源的 LoadBitmap 方法:

private BitmapImage LoadBitmap(string urlString)
{
  var streaminfo = App.GetResourceStream(new Uri(urlString, UriKind.Relative)); 
  BitmapImage bitmap = new BitmapImage();
  bitmap.SetSource(streaminfo.Stream);
  return bitmap;
}

用户导航到此页面时,我提取在导航 URI 中的主页上单击的鲜花的名称,并在 FlowerPage 上加载相同的鲜花图像。

很明显,加载图像导致了内存问题,但我并不确定我应当执行哪些操作。

如果“观察摘要”没有提供足够的信息来解决应用程序中的性能问题,你应该查看 MSDN 和 Web 以寻求性能指导。下面提供了一些很有用的资源:

  • “Windows Phone 应用程序的性能注意事项”(位于“介质”部分下)(wpdev.ms/utCq6h)
  • “Windows Phone 的性能技术”(wpdev.ms/perfTech)
  • Silverlight for Windows Phone 性能团队博客 (wpdev.ms/slmperf)
  • 分析和改进 Windows Phone 应用程序性能(来自 MIX11 的视频)(wpdev.ms/mixwpperf)
  • 专家课程: 构建成功 Windows Phone 应用程序的关键技巧(来自 MIX11 的视频)(wpdev.ms/mixwptoptips)

我开始研究性能并在手机应用程序中加载资源,然后发现了一些严重问题。根据“介质”部分下“Windows Phone 应用程序的性能注意事项”MSDN 库文章的内容,我应该将图像文件指定为内容而非资源,因为手机已进行优化可以使用文件。将介质文件作为资源编译时,内容将在使用之前复制到文件中,这会降低性能。

我将图像文件的生成操作更改为“内容”,然后对代码进行了相应细微改动。

在 LoadBitmap 方法中,指定 BitmapImage 的 UriSource 而非调用 SetSource:

private BitmapImage LoadBitmap(string urlString)
{
  BitmapImage bitmap = new BitmapImage();
  bitmap.UriSource = new Uri(urlString, UriKind.Relative);
  return bitmap;
}

调用 LoadBitmap 时,将相对 URL 传递给每个位图:

bitmap = LoadBitmap("/Images/tulip.jpg");

重新运行测试工具包和性能分析工具

在修复市场测试工具包和性能分析工具中发现的问题之后,你可以重新运行这些工具。

我重新编译应用程序,然后再次运行市场测试工具包,结果中的差别简直令人难以置信(请参见图 9)。应用程序现在通过了所有四项测试。启动时间并不是很让人满意,但至少达标了。

Changing Image Handling Results in Passing All Four Marketplace Tests图 9 更改图像处理方式导致通过所有四项市场测试

最后一次运行执行分析器。可以看到结果发生了显著变化(请参见图 10)。

Image Handling Changes Result in CPU and Memory Performance Analysis Improvements图 10 更改图像处理方式改善 CPU 和内存性能分析结果

现在,用户在不同页面之间浏览时,不会再出现极高的 CPU 峰值,并且无需反复加载图像,而只需在应用程序启动时加载一次图像即可。我们还可以从图形看出,应用程序的内存使用保持稳定,并且比应用程序以前的版本要低。接下来,我选择一些较小的 CPU 峰值,结果随即在图 11 中显示。

Investigating a CPU Spike Shows No Performance Warnings图 11 研究 CPU 峰值未显示任何性能警告

分析器未显示任何性能问题,这样我就放心了,我开始计划将应用程序推向市场。我相信该应用程序一定会得到大家的认可,并且我可以根据需要改进应用程序和提交更新。

遵循此模式

在本文中,我介绍了如何使用市场测试工具包和性能分析工具来确定和修复示例 Windows Phone 应用程序中的问题。这些工具已集成到 Visual Studio 中,并作为 Windows Phone SDK 的一部分安装。市场测试工具包可帮助你确定应用程序是否满足认证要求。性能分析工具则帮助你确定内存和 CPU 性能问题。在向市场推出应用程序之前,建议你采用本文中演示的类似模式:

  1. 使用我演示的工具,包括市场测试工具包内含的所有测试套件。
  2. 确定并修复所有问题。
  3. 重新测试以确认修复情况。

如果遵循此模式,你可以尽早发现问题,并可以更快地创建更卓越的应用程序。此外,这也有助于确保你的应用程序在第一次试发行时就得到市场的认可。

Cheryl Simmons 是 Microsoft Windows Phone 开发人员内容团队的高级程序员。

衷心感谢以下技术专家对本文进行了审阅:Pratap LakshmanRaghuram LankaNitin Madnikar