重要
如果你打算将应用提交到应用商店,则需要联系 Windows 开发人员支持 部门,并获得批准才能使用资产包和程序包折叠。
资产包可以减少应用发布到应用商店时的总体打包大小和发布时间。 可以在资产包 简介中了解有关资产包以及如何加快开发迭代的详细信息。
如果要考虑为应用使用资产包或已知道要使用它,则可能想知道资产包将如何更改开发过程。 简而言之,应用开发会保持不变 - 这是因为资产包的包折叠可以实现。
拆分应用后的文件访问
为了理解包折叠不会影响您的开发过程,让我们首先了解一下将应用拆分为多个包(例如资产包或资源包)时会发生什么情况。
从总体上看,当您将应用程序中的某些文件拆分为其他包(非体系结构包)时,您将无法直接相对于代码运行的位置访问这些文件。 这是因为这些包都安装到安装体系结构包的不同目录中。 例如,如果你正在制作一个游戏,并且你的游戏已本地化为法语和德语,并且你同时为 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 文件夹和文件在包折叠期间合并到音频和视频文件夹中。 通常情况下,在映射文件或MakeAppx.exe的打包布局中为打包文件指定的相对路径是在打包完成后用于访问这些文件的路径。
最后,如果不同资产包中有两个具有相同相对路径的文件,这将导致包折叠过程中发生冲突。 如果发生冲突,应用的部署将导致错误并失败。 此外,由于包折叠利用硬链接,如果你确实使用资产包,你的应用将无法部署到非 NTFS 驱动器。 如果你知道你的应用可能会被用户移动到可移动驱动器,则不应使用资产包。