创建和转换源内容组映射

若要使应用准备好进行流式安装,需要创建内容组映射。 本文将帮助你了解创建和转换内容组映射的具体内容,同时提供一些提示和技巧。

创建源内容组映射

你需要创建 SourceAppxContentGroupMap.xml 文件,然后使用 Visual Studio 或 MakeAppx.exe 工具将此文件转换为最终版本:AppxContentGroupMap.xml。 可以通过从头开始创建 AppxContentGroupMap.xml 来跳过一个步骤,但建议(通常更容易)创建并转换 SourceAppxContentGroupMap.xml,因为在 AppxContentGroupMap.xml 中不允许使用通配符(而通配符确实很有帮助)。

让我们看一个简单的应用场景,其中的应用流式安装非常有用。

假设已创建游戏,但最终应用的大小超过 100 GB。 从 Microsoft Store 下载需要很长时间,这可能会带来不便。 如果选择使用应用流式安装,可以指定下载应用文件的顺序。 通过告诉 Store 首先下载必要文件,用户将能够更快地使用您的应用,同时在后台下载其他非必要的文件。

注意

使用应用流式处理安装很大程度上依赖于应用的文件组织。 建议尽快考虑应用流式安装的内容布局,以简化应用文件分段。

首先,我们将创建一个 SourceAppxContentGroupMap.xml 文件。

在了解详细信息之前,下面是简单、完整 SourceAppxContentGroupMap.xml 文件的示例:

<?xml version="1.0" encoding="utf-8"?>  
<ContentGroupMap xmlns="http://schemas.microsoft.com/appx/2016/sourcecontentgroupmap" 
                 xmlns:s="http://schemas.microsoft.com/appx/2016/sourcecontentgroupmap"> 
    <Required>
        <ContentGroup Name="Required">
            <File Name="StreamingTestApp.exe"/>
        </ContentGroup>
    </Required>
    <Automatic>
        <ContentGroup Name="Level2">
            <File Name="Assets\Level2\*"/>
        </ContentGroup>
        <ContentGroup Name="Level3">
            <File Name="Assets\Level3\*"/>
        </ContentGroup>
    </Automatic>
</ContentGroupMap>

内容组映射有两个主要组件:包含必需内容组的必需部分和可包含多个自动内容组的自动部分。

必需内容组

必需内容组是 SourceAppxContentGroupMap.xml<Required> 元素的单个内容组。 必需内容组应包含启动具有最少用户体验的应用所需的所有必要文件。 由于 .NET Native 编译,所有代码(应用程序可执行文件)须是“必需”组的一部分,将资产和其他文件留给“自动”组。

例如,如果你的应用是游戏,则“必需”组可能包括主菜单或游戏主屏幕中使用的文件。

下面是原始 SourceAppxContentGroupMap.xml 示例文件的代码片段:

<Required>
    <ContentGroup Name="Required">
        <File Name="StreamingTestApp.exe"/>
    </ContentGroup>
</Required>

此处有几个需要记住的要点:

  • <Required> 元素内的 <ContentGroup>必须命名为“Required”(必需)。此名称仅保留给必需内容组,不能与最终内容组映射中其他任何 <ContentGroup> 内容共用。
  • 只有一个 <ContentGroup>。 这是有意为之,因为应该只有一组必要文件。
  • 在此示例中的文件是单个 .exe 文件。 必需内容组不限于一个文件,可以有多个文件。

开始编写此文件的简单方法是在喜欢的文本编辑器中打开一个新页面,将文件快速“另存为”到应用的项目文件夹,并将新创建的文件命名为:SourceAppxContentGroupMap.xml

重要

如果要开发 C++ 应用,需要调整 SourceAppxContentGroupMap.xml 的文件属性。 将 Content 属性设置为 true,并将 File Type 属性设置为 XML 文件

创建 SourceAppxContentGroupMap.xml 时,在文件名中使用通配符会很有帮助,有关详细信息,请参阅使用通配符的提示和技巧部分。

如果使用 Visual Studio 开发应用,建议在必需内容组中包括以下内容:

<File Name="*"/>
<File Name="WinMetadata\*"/>
<File Name="Properties\*"/>
<File Name="Assets\*Logo*"/>
<File Name="Assets\*SplashScreen*"/>

添加单个通配符文件名将包括从 Visual Studio 添加到项目目录的文件,例如应用可执行文件或 DLL。 WinMetadata 和 Properties 文件夹包括由 Visual Studio 生成的其他文件夹。 资产通配符用于选择要安装的应用的徽标和 SplashScreen 图像。

请注意,不能在文件结构的根目录中使用双通配符“**”来包含项目中的每个文件,因为尝试将 SourceAppxContentGroupMap.xml 转换为最终 AppxContentGroupMap.xml 时会失败。

另外请务必注意,内容组映射中不应包含占用情况文件(AppxManifest.xml、AppxSignature.p7x、resources.pri 等)。 如果占用情况文件包含在你指定的其中一个通配符文件名中,将会被忽略。

自动内容组

自动内容组是在用户与已下载的内容组交互时,在后台下载的资产。 这些文件包含启动应用时非必要的任何其他文件。 例如,可以将自动内容组分解为不同的级别,以将每个级别定义为单独的内容组。 如必需内容组部分所述:由于 .NET Native 编译,所有代码(应用程序可执行文件)须是必需组的一部分,将资产和其他文件留给自动组。

让我们仔细看看 SourceAppxContentGroupMap.xml 示例中的自动内容组:

<Automatic>
    <ContentGroup Name="Level2">
        <File Name="Assets\Level2\*"/>
    </ContentGroup>
    <ContentGroup Name="Level3">
        <File Name="Assets\Level3\*"/>
    </ContentGroup>
</Automatic>

自动组的布局与必需组非常相似,但有一些例外情况:

  • 存在多个内容组。
  • 自动内容组可以具有唯一的名称,但为必需内容组保留的名称“Required”(必需)除外。
  • 自动内容组不能包含必需内容组中的任何文件。
  • 自动内容组可以包含其他自动内容组的文件。 文件将仅下载一次,并使用包含这些文件的第一个自动内容组进行下载。

使用通配符 的提示和技巧

内容组映射的文件布局始终与项目根文件夹相关。

在本示例中,在两个 <ContentGroup> 元素中使用通配符,以检索一个级别为“Assets\Level2”或“Assets\Level3”的文件内的所有文件。如果使用更深入的文件夹结构,可以使用双通配符:

<ContentGroup Name="Level2">
    <File Name="Assets\Level2\**"/>
</ContentGroup>

也可以对文件名的文本使用通配符。 例如,如果要将“Assets”文件夹(文件名带“Level2”)中的每一个文件都包含在内,可以使用如下所示的方式:

<ContentGroup Name="Level2">
    <File Name="Assets\*Level2*"/>
</ContentGroup>

可将 SourceAppxContentGroupMap.xml 转换为 AppxContentGroupMap.xml

要将版本 SourceAppxContentGroupMap.xml 转换为最终版本 AppxContentGroupMap.xml,可以使用 Visual Studio 2017 或 MakeAppx.exe 命令行工具。

要使用 Visual Studio 转换内容组映射,请执行以下操作:

  1. SourceAppxContentGroupMap.xml 添加到项目文件夹
  2. 在“属性”窗口中将 SourceAppxContentGroupMap.xml 的生成操作更改为“AppxSourceContentGroupMap”
  3. 在解决方案资源管理器中,右键单击项目
  4. 导航到 Store -> 转换内容组映射文件

如果未在 Visual Studio 中开发应用,或者只想使用命令行,则使用 MakeAppx.exe 工具转换你的 SourceAppxContentGroupMap.xml

简单的 MakeAppx.exe 命令可能显示如下:

MakeAppx convertCGM /s MyApp\SourceAppxContentGroupMap.xml /f MyApp\AppxContentGroupMap.xml /d MyApp\

/s 选项指定 SourceAppxContentGroupMap.xml 的路径,/f 指定 AppxContentGroupMap.xml 的路径。 最后的选项 /d 指定应使用哪个目录来扩展文件名通配符,在本例中是应用项目目录。

有关可用于 MakeAppx.exe 选项的更多信息,请打开命令提示符,导航到 MakeAppx.exe 并输入:

MakeAppx convertCGM /?

这就是你需要为应用准备最终 AppxContentGroupMap.xml 所需的一切! 在应用完全准备好进入 Microsoft Store 之前,还有更多工作要做。 有关向应用添加流式安装的更多信息,请检查此页面