AppInstaller XML 问题

Posted

技术标签:

【中文标题】AppInstaller XML 问题【英文标题】:AppInstaller XML Issue 【发布时间】:2021-01-30 12:30:18 【问题描述】:

我正在尝试遵循 Microsoft 文档 但我对为什么我的 appinstaller 失败感到困惑:

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller xmlns="http://schemas.microsoft.com/appx/appinstaller/2018" Uri="https://xxxxxx.blob.core.windows.net/installer/Package.appinstaller" Version="1.0.0.0">
    <MainPackage Name="MyApp" Version="12.21.289.0" Publisher="CN=xxxxxx" ProcessorArchitecture="x64" Uri="https://xxxxxx.blob.core.windows.net/installer/MyApp.msix"/>
    <UpdateSettings> <OnLaunch HoursBetweenUpdateChecks="1" /> <AutomaticBackgroundTask/> </UpdateSettings>
</AppInstaller>

如果我运行 MSIX 文件,它会按应有的方式安装。 我一直在努力遵循这一点: https://docs.microsoft.com/en-us/windows/msix/desktop/azure-dev-ops 我收到此错误: 如果我删除 UpdateSettings 属性,它只会导致另一个错误: “应用程序安装失败并显示错误消息:Appinstaller 操作失败,错误代码为 0x80D05011。详细信息:未知错误 (0x80d05011)”

请帮忙。

【问题讨论】:

嗨@LostButFound,您介意在这里分享详细日志和管道定义吗? 【参考方案1】:

如果这对任何人有帮助,我找到了这个帖子: https://techcommunity.microsoft.com/t5/msix-deployment/windows-10-2004-msix-not-updating-please-check-whether-the/m-p/1466701

基本上答案是重启你的机器。我做了,它似乎已经修复了它

@The-pademelon 还提到重新启动传递优化服务也有效。

【讨论】:

您好,感谢您的分享,您可以Accept it as an Answer,它可以帮助遇到相同问题的其他社区成员,我们可以归档这个帖子,谢谢。 奇怪,重启解决了这个问题。 @LucaZiegler 显然这与缓存的 .installer 文件有关。这对我来说没有意义,但它确实有效。 重启/停止传递优化服务似乎可以解决问题;无需重新启动 PC。【参考方案2】:

好吧,经过三天无望的调试和多次尝试找到这个问题的根源,我们终于弄明白了。 解决方法见下文。

传递优化服务错误地缓存了它检索到的任何 HTTP 资源的大小(它可以是 appinstaller 文件或 MSIX 包),并在后续请求中包含 Range HTTP 标头,其字节范围值可能已过时。

例如,如果您的应用安装程序的长度为 725 字节,Windows DO 服务第一次发出格式正确的 HTTP 请求并下载整个 XML。请求示例:

GET https://foobar.com/baz.appinstaller HTTP/1.1
Connection: Keep-Alive
Accept: */*
Range: bytes=0-724
User-Agent: Microsoft-Delivery-Optimization/10.0
MS-CV: ......
Content-Length: 0
Host: foobar.com

但如果您在网络服务器上更新了 appinstaller 文件,并且它的大小增加了,例如,最多 4096 字节,DoSvc 仍然只请求前 725 个字节,显然得到了一个无法解析的损坏的 XML。即使ETag 被正确处理并且已针对appinstaller HTTP 资源进行了更改!

如果您的应用安装程序文件大小减小,您很可能会收到416 Range Not Satisfiable。

这是我们使用 Fiddler 转储的来自 Amazon S3(我们托管我们的 appinstaller 和 MSIX 包)的真实响应:

HTTP/1.1 206 Partial Content
x-amz-id-2: ...
x-amz-request-id: ...
Date: Tue, 06 Apr 2021 21:45:12 GMT
Last-Modified: Tue, 06 Apr 2021 21:40:24 GMT
ETag: "af2d8bb5c638eca059cdb4dc6c694123"
Accept-Ranges: bytes
Content-Range: bytes 0-724/4096
Content-Type: application/appinstaller
Content-Length: 725
Server: AmazonS3

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller 
  Uri="https://tvd-packages.tradingview.com/beta/latest/win32/TradingView.appinstaller" 
  Version="1.0.0.1071"
  xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2">
  <MainPackage 
    Name="TradingView.Desktop" 
    Version="1.0.0.1071" 
    Publisher="CN=&quot;TradingView, Inc.&quot;, O=&quot;TradingView, Inc.&quot;, STREET=470 Olde Worthington Road Suite 200, L=Westerville, S=Ohio, PostalCode=43082, C=US" 
    ProcessorArchitecture="x64" 
    Uri="https://tvd-packages.tradingview.com/beta/1.0.0-beta.1.5/win32/x64/TradingView.msix" />
  <UpdateSettings>
    <OnLaunch HoursBetweenUpdateChecks="0" />
  </UpdateSettings>

<!--
- WHAT TH

你注意到Content-Range: bytes 0-724/4096 并且评论被切断了吗?这是传递优化服务的格式错误的 HTTP 范围请求的结果。

解决方法:你猜到了吗?是的,只是不要改变 appinstaller 的大小!例如,我们用 XML 注释填充它,精确到 4096 字节,如果我们需要向 XML 添加更有意义的内容,我们只需从 XML 注释中删除一些字符,使其再次变为 4096 字节。我们甚至在我们的 gitlab 部署管道中进行了简单的大小测试,以确保不会意外更改 appinstaller 的大小。

您可以查看我们自 2021 年 4 月以来使用的当前生产应用安装程序:https://tvd-packages.tradingview.com/stable/latest/win32/TradingView.appinstaller

P.S. 如果对同一个 URL 执行请求,就会出现问题。如果 URL 更改,DoSvc HTTP 客户端逻辑将其作为不同的资源处理。这就是为什么 appinstaller 文件更有可能成为这个问题的受害者。

【讨论】:

感谢您投入时间。我不喜欢在每次构建后手动编辑 appinstaller 的想法,但至少知道这是一个选项是件好事。从长远来看,仅限于 999 个版本可能会非常严重。此信息也可能有助于鼓励 Microsoft 解决问题。您几乎已经将所有调试和诊断工作交给了他们。请所有阅读此文件的人报告。 我举报了这个developercommunity.visualstudio.com/t/…?对于 Visual Studio,如果您进入 Windows 反馈应用程序并搜索“DoSvc 服务无法安装 appinstaller”,您应该会找到我提交的 Windows 反馈报告。受此问题影响的任何人都应该对这些问题进行投票。我认为您必须登录才能使用这两项服务。 @Nipheris 感谢您的解决方法。你什么时候填充XML?在包中包含 *.appinstaller 文件之前,有没有办法在发布过程中运行 powershell 脚本或其他东西?我尝试向*.wapproj 项目文件添加一个执行powershell 脚本的自定义Target,但它似乎不支持它xml &lt;Target Name="Test" AfterTargets="Publish"&gt; &lt;Exec Command="powershell $(MSBuildProjectDirectory)\appinstaller-length-fixer.ps1 $(MSBuildProjectDirectory)\Package.appinstaller\"/&gt; &lt;/Target&gt; @SzilardD 我们在构建和发布过程中也不使用 Windows 应用程序打包项目和 MSBuild,所以我认为我们的解决方案对您没有帮助。我们的应用程序是基于 Electron 的,工具基本上是基于 Node.js 的,所以我们只有一个自定义脚本。 @SzilardD 顺便说一句,“在 appinstaller 文件包含在包中之前”是什么意思?我们在 CI 期间构建 MSIX,将它们存储在 Artifactory 中,并且仅在我们要公开发布时 - 我们上传新的 MSIX 包并从模板即时生成 appinstaller 文件,将其填充到所需的常量大小。 appinstaller 文件不能也不应该包含在 MSIX 中。【参考方案3】:

这是windows交付优化服务中的一个bug,我们现在能做的只是一个解决方法。

开发者: 这个问题是由于版本号的一部分改变了它有多少位数,比如从 1.0.9.9 到 1.0.10.0,如果你让构建过程自动增加这些,这会很快发生。解决方法是转入下一个版本 (1.1.0.0)。解决此问题的最佳方法可能是始终从 0.100.100 或 0.1000.1000 的基本版本开始,否则您将在可用的总版本号方面受到严重限制。

用户: 任务管理器 -> 服务 -> DoSvc -> 重启 这比系统重启要快一些,也方便一些。

注意:服务的中断状态是由这个版本编号错误引起的,但是一旦发生,重新启动是纠正它的唯一方法。

【讨论】:

我将关于范围的发现作为单独的答案发布。信息太多,无法放入评论。随时更新您的答案,将所有内容集中在一处。 @max 感谢您分享您的结果。我在从 0.0.9.0 到 0.0.10.0 时遇到问题,导致客户端尝试更新时 DoSvc 服务进入损坏状态。您关于将要构建的内容的结果很有用,但为了完成图片,我仍然打算测试导致此问题的范围,这发生在构建完成并上传并在客户端计算机上触发更新之后。 问题重现是因为在版本字符串中添加了额外的数字后,appinstaller 的大小增加了。请参阅我的答案以获得解释。【参考方案4】:

补充@user3190036 的答案:我设法构建和安装的最大版本号是65535.65535.65535.9

似乎第 4 个范围是错误所在,因为如果您使用这样的任意大数字,它不符合作为错误消息的一部分出现的架构:

MakeAppx : error: Error info: error C00CE169: App manifest validation error: The app manifest must be valid as per schema: Line 7, Column 33, Reason: '1.0.125500.9' violates pattern constraint of 
'(0|[1-9][0-9]0,3|[1-5][0-9]4|6[0-4][0-9]3|65[0-4][0-9]2|655[0-2][0-9]|6553[0-5])(\.(0|[1-9][0-9]0,3|[1-5][0-9]4|6[0-4][0-9]3|65[0-4][0-9]2|655[0-2][0-9]|6553[0-5]))3'.
The attribute 'Version' with value '1.0.125500.9' failed to parse.

将正则表达式解构为

(0
|[1-9][0-9]0,3
|[1-5][0-9]4
|6[0-4][0-9]3
|65[0-4][0-9]2
|655[0-2][0-9]
|6553[0-5])

(\.
(0
|[1-9][0-9]0,3
|[1-5][0-9]4|6[0-4][0-9]3
|65[0-4][0-9]2
|655[0-2][0-9]
|6553[0-5])
)3

我们可以更清楚地看到可能的取值范围:4 个部分中的任何一个都为 0..65535,但由于存在错误,第 4 部分被限制为单个数字 0..9。

对我有用的最小版本号是0.0.0.0

于 2021 年 5 月 5 日在最新的 Win Server 2019 上测试

【讨论】:

以上是关于AppInstaller XML 问题的主要内容,如果未能解决你的问题,请参考以下文章

“解析应用程序包时出错。”从 Web (MSIX) 打开 Windows 10 .appinstaller 文件时

在 Windows 10 家庭版上安装 .appxbundle

wix安装程序ice03无效的语言ID

MSIX Web 安装程序不工作 - 解析应用程序包时出错

`gradle install` 如何生成 `pom.xml` 文件

如何使用 Windows Installer XML 注册 COM 对象