代码改变世界

Windows 8 App Certification Error Solution

2013-01-25 21:06  chenkai  阅读(2725)  评论(1编辑  收藏  举报

well.最近Team打算发布一个Windows 8 Game Application.在经过Windows 8 App Certification Kit 测试工具时遇到各种各样错误导致认证无法通过.还好经过反复尝试耗费一些时间把这些问题逐一解决.所以在一下篇章将详述遇到问题以及对应的解决方案.

但这些问题归结已经全部官方认证GuideLine文档中已经有了很详细.所以如果打算开发Windows 8 还是建议你好好读读这个文档:

Windows 8 的认证要求 Guide Line

首先来看看我们Realse第一个新版本certificate遭遇错误.

提示错误A: 支持的API测试失败

失败

支持的 API

  • 发现错误: 支持的 API 测试检测到以下错误:

    • 此应用程序类型不支持 msvcr110.dll 中的 API _close。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 msvcr110.dll 中的 API _lseek。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 msvcr110.dll 中的 API _open。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 msvcr110.dll 中的 API _read。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 msvcr110.dll 中的 API _write。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API GetModuleFileNameW。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API GetModuleHandleW。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API LoadLibraryExW。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API LoadLibraryW。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API lstrlenA。SimpleGame.exe 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API GetModuleFileNameW。OpenXLivePages.dll 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API GetModuleHandleW。OpenXLivePages.dll 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API LoadLibraryExW。OpenXLivePages.dll 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API LoadLibraryW。OpenXLivePages.dll 调用此 API。
    • 此应用程序类型不支持 kernel32.dll 中的 API lstrlenA。OpenXLivePages.dll 调用此 API。
  • 未修复时会产生影响: 使用不在用于 Windows 应用商店应用的 Windows SDK 中的 API 与 Windows 应用商店认证要求冲突。

提示错误B:调试配置测试失败

调试配置测试

 

失败

调试配置

  • 发现错误: 调试配置测试检测到以下错误:

    • 二进制文件 OpenXLive.WinRT.UI.winmd 是在调试模式下生成的。
    • 二进制文件 SimpleGame.exe 是在调试模式下生成的。
    • 二进制文件 OpenXLivePages.dll 是在调试模式下生成的。
  • 未修复时会产生影响: Windows 应用商店不允许应用的调试版本。

提示错误C: Windows 安全功能测试

Windows 安全功能测试

 

失败

二进制分析器

  • 发现错误: 二进制分析器测试检测到以下错误:

    • 文件 F:\Work Projects\SnackCards XAML\SimpleGame\Debug\SimpleGame\AppX\OpenXLivePages.dll 未通过 WXCheck 检查。
    • 文件 F:\Work Projects\SnackCards XAML\SimpleGame\Debug\SimpleGame\AppX\OpenXLivePages.dll 未通过 SafeSEHCheck 检查。
    • 文件 F:\Work Projects\SnackCards XAML\SimpleGame\Debug\SimpleGame\AppX\SimpleGame.exe 未通过 WXCheck 检查。
    • 文件 F:\Work Projects\SnackCards XAML\SimpleGame\Debug\SimpleGame\AppX\SimpleGame.exe 未通过 SafeSEHCheck 检查。

为何要提前提到这个三个Certificate认证不通过错误? 根据我们经验判断.这些错误全部是因为一个问题引起的. 发布的应用包是Debug版本.而不是采用Realse方式Build发布包而导致的.

这里不得不说的是.Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用.所以采用Certificattion Kit 测试工具必须是Realse版本发布包. 这样包含测试信息很完整. 测试验证会正常通过.

当遇到无法调用APi或是提示存在二进制文件.这些基本是因为采用Debug版本发布包.的原因.

提示错误D: 应用清单合规性测试失败.

应用清单合规性测试

 

失败

应用清单

  • 发现错误: 应用清单测试检测到以下错误:

    • 背景色和前景文本色的对比度比率为 1。此比率应大于或等于 1.5。
  • 未修复时会产生影响: 无法将与 Windows 应用商店认证要求冲突的应用程序提交到 Windows 应用商店。

关于这个问题.

主要是因为应用程序在进入Forground TExt Color和Background Color 颜色的对比度比率超过了的问题.1.默认项目的设置时:

2013-01-25_194003

导致的.所以只需要修成该如下值:

2013-01-25_110232

即可.保证期颜色值对比度比率小于1. 重新认证这个错误即不再出现提示.

关于这个问题或是可以参考如下文章:

Windows 8 –The Contrast ratio of the background color and foreground text color is 1.This ratio should be greater than or eaqual to 1.5

Failed with “The Contrast ratio of the background color and forground color text is1.This ratio should be greater than or equal to 1.5“

提示错误F: 运行时元数据验证错误

Windows 运行时元数据验证

 

通过

ExclusiveTo 属性测试

 

失败

类型位置测试

  • 发现错误: 类型位置测试检测到以下错误:

    • 在与 SimpleGame 名称空间不匹配的文件 F:\Work Projects\SnackCards XAML\SimpleGame\Debug\SimpleGame\AppX\SnackStudio_win8_metro.winmd 中找到了该名称空间中的类型。
  • 未修复时会产生影响: Windows 应用商店不允许使用未通过 Windows 运行时元数据验证的应用程序。

这个问题主要是因为解决方案中.有些引用的文件或库命名空间和当前项目命名空间不一致导致元数据认证失败.所以基本上直找到这个文件.修改一致.如果是Realse发布时生成的文件.则需要在打开.vsproject文件修改生成NameSpace值和当前项目命名一致即可.重新生成该解决方案认证后则不再提示该错误.

提示错误G: 性能启动测试出错.

性能测试

 

通过

字节码生成

 

通过

优化的绑定引用

 

失败

性能启动

  • 发现错误: 性能启动测试收集了以下结果:

    • ,g:g螾ubhV1Y%?
  • 未修复时会产生影响: 应用程序启动时间对于为用户创建快速且流畅的体验非常重要。此应用不会由 Windows 应用商店接受。

在Windows 8 为了保证用户在平板和Pc端一直用户体验.所以官方在认证文档很明确规定.应用程序启动和挂起的时间.当前如果你的应用启动时间超过5秒.则会提示该错误.而导致这个问题因素有很多.Launch时间值是点击应用到应加载资源进入开始过场动画后进入操作主页面这个时间段.所以如果提示该错误.则需要仔细分析.因为每个应用程序出现这种错误提示原因可能都不一致.如下分享一些我们确认这个问题地方和如何解决的方案.仅供参考.

首先应用执行时进入App_OnLaunched方法.所以在应用启动时尽量减少不必要的资源加载.如果逻辑无法避免.应尽量减少在该函数要执行的操作.或是把这些操作放在后台来执行.保证用户点击应用能够快速在5秒钟之内得到应用主界面的响应.这个是第一个需要排除的.

另外在采用Windows App certification Kit认证时可以通过如下方式来查看认证Log日志和测试时具体值.类似.当前提示在Launch这个应用超过5秒. 那你是否想知道当前应用启动时间是多少?这里有一个小技巧.在C默认的安装目录中:

C:\Users\kai\AppData\Local\Microsoft\AppCertKit

下.找到有一个Global_data.xml文件中打开可以看到:

2013-01-25_201133

这个Global.xml包含了每次运行Windows App Certification Kit时全局变量参数和对应的值.类似性能测试出现错误可以查找:Performance 则可以明确看到两个明确在本次测试中 出现PerformanceLaunch_ExecutionTime和PerformanceSuspend_ExecutionTime.两个参数.即应用程序在此次测试加载和挂起所耗费时间值.当前对应单位是时:分:秒.可以看到对应参数和值如下:

   1:  <anyType xsi:type="GlobalDataItem">
   2:        <KeyName>PerformanceLaunch_ExecutionTime</KeyName>
   3:        <Value>00:00:14.9318050</Value>
   4:        <Parameter>NONE</Parameter>
   5:  </anyType>
   6:  <anyType xsi:type="GlobalDataItem">
   7:        <KeyName>PerformanceSuspend_ExecutionTime</KeyName>  
   8:        <Value>00:02:39.2459527</Value>
   9:        <Parameter>NONE</Parameter>
  10:  </anyType>

可以很明显看到.本次应用程序在测试Launch时间为14.93秒.远远超过Windows 8 规定5秒.

Ps:这个Global.xml文件是当前执行认证流程获取的值.如果重新运行一次Certifiction Kit则获得新的应用运行的全局的参数值.

另外因为在认证结果没有相关错误提示.目前我们还无法判断当前性能问题出在哪.所以你如果想知道认证流程也就是出现这个错误过程.你可以再C:\Users\kai\AppData\Local\Microsoft\AppCertKit目录查看类似logotest_trace_1252013_174027.txt文件,.文件命名默认采用logotest_trace_+测试时间戳.打开可以看到:

2013-01-25_202602

 

这是这次执行认证整个历程日志Log文件.如果在执行过程出错.会有明确Error info.信息提示,.出来.很方便知道问题出在哪.所以如果你遇到问题.不知道如何解决.?so. 好好查看一下Log文件.

另外在C:\Users\kai\AppData\Local\Microsoft\AppCertKit文件下还有每次测试单项的测试结果的XML格式文件.类似一次执行可以看到自动生成如下文件:

2013-01-25_202945

看基本每一项都有独立的XML记录本次数据.这对确认问题来说是最好不过的原材料和素材.

在回到这个问题如何解决.首先在Build我们项目在output看到要访问的资源. 因为我们发布Windows 8 Game.发现在加载图片和音乐文件时消耗很大的时间.而且是在应用程序启动的时候就要播放音乐,查看属性:

2013-01-25_203318

可以看到在Exclued From Build选项设置为No.即每次编辑都会项目重新加载.这就意味每次都需要耗费一定时间等待资源加载成功后用户才能看到操作主界面.so 把所有图片和音乐文件的属性Exclued From Build选项设置为Yes.排除项目资源之外.在来重新运行Certification Kit 发现依然失败.来看看Global.xml中具体对应的值:

   1:  <anyType xsi:type="GlobalDataItem">
   2:     <KeyName>PerformanceLaunch_ExecutionTime</KeyName>
   3:     <Value>00:00:05.2984610</Value>
   4:     <Parameter>NONE</Parameter>
   5:  </anyType>
   6:  <anyType xsi:type="GlobalDataItem">
   7:     <KeyName>PerformanceSuspend_ExecutionTime</KeyName>
   8:     <Value>00:02:12.5057474</Value>
   9:     <Parameter>NONE</Parameter>
  10:  </anyType>

可以发现虽然这次依然大于5秒.但相对于第一次运行14.93秒已经大大提升了.可见减少在应用程序Launch时加载资源或更多的操作时一种很有效方式.当减少在launch是一些应用程序操作放到后台时.该验证错误就通过.le

当然在认证时.发现有一个问题需要提示一下.在每次修改应用程序.重新发布本机时.如果原来发布的是Debug版本.建议每次在采用Windows App Certification Kit测试时都要卸载.在最新修改Realse版本包去测试.

如果你在调试过程过程修改多次.依然发现反复测试会提示这个性能Launched超时的问题. 无法通过 首先在App: OnLaunced事件中尽量减少不必要操作.如果是逻辑上无法避免的操作.这里有一个很通用的解决方案来处理这个问题:

通用解决方案:

通常来说.App加载时间指的是App启动到显示SplashScreen-到渲染出首页操作主页面这段时间. 如果应用的确需要在启动需要加载一定的操作.通常的做法是第一时间启动一个和Splashscreen图片类似的空页面稍加改动如添加一个进度条/圈,然后再后续进行处理.

这样做法目的是保证用户在操作应用不会等待太多时间.如果真的有太多操作.在页面添加操作进度条.增加用户体验即可.这种解决基本是通用的.相信原来做Windows phone也用这种方式处理过这个问题.Windows 8也是如此.

或者在Visual Studio 2012 中.发布测试包方法来验证该发布包.

Project > Store > Create App Package中点击Create App Packages:

2013-01-25_204629

 

选着no.next:

2013-01-25_204639

设置本地发布保存地址.当然因为是游戏目前只支持X86版本.点击Create创建成功后则可以直接看到对当前最新发布包认证:

2013-01-25_205608

点击Launch即可立即验证.这种做法是为了保证.每次修改后.验证发布包都是每次在Build之后都是最新.不会因为本地安装不同版本的包.导致重新验证.这是比较直接的一种方式.

well说道这里基本涵盖Windows 8 APP Certification 过程中涵盖基本错误提示和具体的解决方案.当然每个Application照成如上错误原因可能是完全不同的.本篇的目的给出具体的解决方案同时能够提供分析解决这些问题一些思路.希望对Windows 8开发Dev一些参考和帮助.

参考资料:

Failed with “The Contrast ratio of the background color and forground color text is1.This ratio should be greater than or equal to 1.5“

Windows 8 - The contrast ratio of the background color and foreground text color is 1. This ratio should be greater than or equal to 1.5

Performance test failed with unreadable message

Windows App Certification Kit fails on one computer but run one second?

Wack Fail: Application Suspend was not detected for application?

Windows 8 App Certification Kit –Test Failed?

无觅相关文章插件,快速提升流量