用资产包和包折叠进行开发

重要

如果打算将应用提交到 Microsoft Store,需要联系 Windows 开发人员支持部门,并获得批准,然后才能使用资产包和包折叠。

资产包可以减少应用到 Store 的总体打包大小和缩短发布时间。 可以在资产包简介中了解有关资产包以及如何加快开发迭代的详细信息。

如果要考虑为应用使用资产包或已知道要使用资产包,则用户可能想知道资产包将如何改变开发过程。 简而言之,应用开发保持不变 - 这是可能的,因为资产包采用了包折叠技术。

拆分应用后的文件访问

要了解包折叠如何能不影响开发过程,让我们先退一步,了解将应用拆分为多个包(资产包或资源包)时会发生什么。

概括而言,将某些应用的文件拆分为其他包(并非体系结构包)时,将无法直接访问相对于代码运行位置的这些文件。 这是因为这些包都安装到与安装体系结构包不同的目录中。 例如,如果你要制作一款游戏,该游戏已本地化为法语和德语且同时为 x86 和 x64 计算机生成,则应在游戏的应用程序包中包含以下应用包文件:

  • MyGame_1.0_x86.appx
  • MyGame_1.0_x64.appx
  • MyGame_1.0_language-fr.appx
  • MyGame_1.0_language-de.appx

将游戏安装到用户的计算机上时,每个应用包文件都将在 WindowsApps 目录中有自己的文件夹。 因此,对于运行 64 位 Windows 的法国用户,你的游戏将如下所示:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   `-- …
|-- MyGame_1.0_language-fr
|   `-- …
`-- …(other apps)

请注意,不会安装不适用于该用户的应用包文件(x86 和德语包)。

对于此用户,游戏的主可执行文件将位于 MyGame_1.0_x64 文件夹中,并且将从那里运行;通常,它只能访问此文件夹中的文件。 要访问 MyGame_1.0_language-fr 文件夹中的文件,必须使用 MRT API 或 PackageManager API。 MRT API 可以从安装的语言中自动选择最适合的文件,可以在 Windows.ApplicationModel.Resources.Core 中了解有关 MRT API 的详细信息。 或者,可以使用 PackageManager 类找到法语语言包的安装位置。 切勿假定应用包的安装位置,因为位置可能会发生变化并可能因用户而异。

资产包折叠

那么,如何访问资产包中的文件呢? 嗯,你可以继续使用用于访问体系结构包中任何其他文件的文件访问 API。 这是因为资产包文件将在通过包折叠过程安装时折叠到体系结构包中。 此外,由于资产包文件最初应该是体系结构包中的文件,这意味着在开发过程中从松散文件部署改为打包部署时,不必更改 API 使用。

要详细了解包折叠的工作原理,让我们从一个示例开始。 如果你有一个采用以下文件结构的游戏项目:

MyGame
|-- Audios
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Videos
|   |-- Level1
|   |   `-- ...
|   `-- Level2
|       `-- ...
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe

如果要将游戏拆分为 3 个包:x64 体系结构包、音频资产包和视频资产包,则游戏将分为以下包:

MyGame_1.0_x64.appx
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe
MyGame_1.0_Audios.appx
`-- Audios
    |-- Level1
    |   `-- ...
    `-- Level2
        `-- ...
MyGame_1.0_Videos.appx
`-- Videos
    |-- Level1
    |   `-- ...
    `-- Level2
        `-- ...

安装游戏时,将首先部署 x64 包。 然后,这两个资产包仍将部署到其自己的文件夹,就像上一示例中的 MyGame_1.0_language-fr 一样。 但是,由于包折叠,资产包文件还将硬链接为在 MyGame_1.0_x64 文件夹中显示(因此,即使这些文件出现在两个位置,也不会占用两倍的磁盘空间)。 资产包文件将显示的位置正是其相对于包根的位置。 因此,所部署游戏的最终布局如下所示:

C:\Program Files\WindowsApps\
|-- MyGame_1.0_x64
|   |-- Audios
|   |   |-- Level1
|   |   |   `-- ...
|   |   `-- Level2
|   |       `-- ...
|   |-- Videos
|   |   |-- Level1
|   |   |   `-- ...
|   |   `-- Level2
|   |       `-- ...
|   |-- Engine
|   |   `-- ...
|   |-- XboxLive
|   |   `-- ...
|   `-- Game.exe
|-- MyGame_1.0_Audios
|   `-- Audios
|       |-- Level1
|       |   `-- ...
|       `-- Level2
|           `-- ...
|-- MyGame_1.0_Videos
|   `-- Videos
|       |-- Level1
|       |   `-- ...
|       `-- Level2
|           `-- ...
`-- …(other apps)

对资产包使用包折叠时,用户仍可用相同的方式访问已拆分为资产包的文件(请注意,体系结构文件夹的结构与原始项目文件夹完全相同),并可添加资产包或在资产包之间移动文件,而不会影响代码。

现在,来看一个更复杂的包折叠示例。 假设要基于级别拆分文件,并且要保留与原始项目文件夹相同的结构,则包应如下所示:

MyGame_1.0_x64.appx
|-- Engine
|   `-- ...
|-- XboxLive
|   `-- ...
`-- Game.exe
MyGame_Level1.appx
|-- Audios
|   `-- Level1
|       `-- ...
`-- Videos
    `-- Level1
        `-- ...

MyGame_Level2.appx
|-- Audios
|   `-- Level2
|       `-- ...
`-- Videos
    `-- Level2
        `-- ...

这将允许 MyGame_Level1 包中的 Level1 文件夹和文件以及 MyGame_Level2 包中的 Level2 文件夹和文件在包折叠期间合并到 AudiosVideos 文件夹。 因此,一般来说,在 MakeAppx.exe 的映射文件或打包布局中为打包文件指定的相对路径是在包折叠后用于访问这些文件的路径。

最后,如果不同资产包中有两个文件具有相同的相对路径,这将导致包折叠过程中发生冲突。 如果发生冲突,应用的部署将导致错误并失败。 此外,由于包折叠利用硬链接,如果你确实使用资产包,你的应用将无法部署到非 NTFS 驱动器。 如果你知道应用可能会被用户移动到可移动驱动器,则不应使用资产包。