使用 MakeAppx.exe 来创建 MSIX 包或捆绑包

MakeAppx.exe 既创建应用包(.msix 或 .appx),也创建应用包捆绑包(.msixbundle 或 .appxbundle)。 MakeAppx.exe 还会从应用包或捆绑包提取文件,并加密或解密应用包和捆绑包。 此工具包含在 Windows 10 SDK 中,并且可以从命令提示符或脚本文件中使用。

有关如何使用 MakeApp.exe 打包桌面应用程序的信息,请参阅手动打包桌面应用

重要

如果使用 Visual Studio 开发应用,建议使用 Visual Studio 向导来创建应用包。 有关更多信息,请参阅使用 Visual Studio 打包 UWP 应用,和使用 Visual Studio 从源代码打包桌面应用程序

重要

请注意,MakeAppx.exe 不会创建应用包上传文件(.appxupload 或 .msixupload),这是推荐用于提交到合作伙伴中心的有效应用包类型。 应用包上传文件通常作为 Visual Studio 打包过程的一部分创建,但也可以手动创建

使用 MakeAppx.exe

根据 SDK 的安装路径,下面是 MakeAppx.exe 在 Windows 10 电脑上的位置:

  • C:\Program Files (x86)\Windows Kits\10\bin\<build number>\<architecture>\makeappx.exe

其中 <architecture> = x86、x64、arm、arm64 或 chpe。 或者它可能位于:

  • C:\Program Files (x86)\Windows Kits\10\App Certification Kit\makeappx.exe

MakeAppx.exe 的语法和选项

常规 MakeAppx.exe 语法:

MakeAppx <command> [options]      

下表介绍了 MakeAppx.exe 的命令。

命令 说明
打包 创建包。
解压 将指定包中的所有文件提取到指定输出目录。
bundle 创建捆绑包。
解除捆绑 将所有包解压缩到指定输出路径下、以捆绑包或包的全名命名的子目录。
加密 在指定的输出包/捆绑包处,从输入包/捆绑包创建加密的应用包或捆绑包。
decrypt 在指定的输出包/捆绑包处,从输入应用包/捆绑包创建解密的应用包或捆绑包。

该选项列表适用于所有命令:

选项 描述
/d 指定输入、输出,或内容目录。
/l 适用于本地化包。 对本地化包进行默认验证。 此选项仅禁用该特定验证,而不要求禁用所有验证。
/kf 使用指定密钥文件中的密钥,加密或解密包或捆绑包。 这不能与 /kt 一起使用。
/kt 使用全局测试密钥,加密或解密包或捆绑包。 这不能与 /kf 一起使用。
/no 防止覆盖已存在的输出文件。 如果未指定该选项或 /o 选项,系统会询问用户是否覆盖该文件。
/nv 跳过语义验证。 如果未指定此选项,则该工具将执行包的完整验证。
/o 覆盖已存在的输出文件。 如果未指定该选项或 /no 选项,系统会询问用户是否覆盖该文件。
/p 指定该应用包或捆绑包。
/v 支持将详细记录输出到主机。
/? 显示帮助文本。

以下列表包含可能的自变量:

Argument 描述
<输出包的名称> 已创建包的名称。 这是追加 .msix 或 .appx 的文件名。
<加密输出包的名称> 创建的加密包名称。 这是追加 .emsix 或 .eappx 的文件名。
<输入包的名称> 包的名称。 这是追加 .msix 或 .appx 的文件名。
<加密输入包的名称> 加密包的名称。 这是追加 .emsix 或 .eappx 的文件名。
<输出捆绑包的名称> 创建的捆绑包的名称。 这是追加 .msixbundle 或 .appxbundle 的文件名。
<加密输出捆绑包的名称> 创建的加密捆绑包的名称。 这是追加 .emsixbundle 或 .eappxbundle 的文件名。
<输入捆绑包的名称> 捆绑包的名称。 这是追加 .msixbundle 或 .appxbundle 的文件名。
<加密输入捆绑包的名称> 加密捆绑包的名称。 这是追加 .emsixbundle 或 .eappxbundle 的文件名。
<内容目录> 关于应用包或捆绑内容的路径。
<映射文件> 指定包来源和目的地的文件名。
<输出目录> 输出包和捆绑包目录的路径。
<密钥文件> 包含加密或解密所用密钥的文件的名称。
<算法 ID> 创建块映射时所使用的算法。 有效的算法包括:SHA256(默认值)、SHA384、SHA512。

创建应用程序包

应用包是打包到 .msix 或 .appx 包文件的应用文件的完整集。 要使用 pack 命令创建应用包,必须为包的位置提供内容目录或映射文件。 你还可以在创建包时对其进行加密。 如果要加密包,必须使用 /ep 并指定使用的是密钥文件 (/kf),还是全局测试密钥 (/kt)。 有关创建加密包的更多信息,请参阅加密或解密包或捆绑包

pack 命令特定选项:

选项 描述
/f 指定相应映射文件。
/h 指定创建块映射时使用的哈希算法。 只能与 pack 命令一起使用。 有效的算法包括:SHA256(默认值)、SHA384、SHA512。
/m 指定输入应用部件清单的路径,该清单将用作生成输出应用包或资源包清单的基础。 使用此选项时,还必须使用 /f,并在映射文件中包括 [ResourceMetadata] 部分,以指定要包含在所生成清单中的资源维度。
/nc 防止对包文件进行压缩。 默认情况下,文件根据检测到的文件类型进行压缩。
/r 生成一个资源包。 这必须与 /m 一起使用,并意味着使用 /l 选项。

以下用法示例显示了 pack 命令一些可能的语法选项:

MakeAppx pack [options] /d <content directory> /p <output package name>
MakeAppx pack [options] /f <mapping file> /p <output package name>
MakeAppx pack [options] /m <app package manifest> /f <mapping file> /p <output package name>
MakeAppx pack [options] /r /m <app package manifest> /f <mapping file> /p <output package name>
MakeAppx pack [options] /d <content directory> /ep <encrypted output package name> /kf <key file>
MakeAppx pack [options] /d <content directory> /ep <encrypted output package name> /kt

下面显示了 pack 命令的命令行示例:

MakeAppx pack /v /h SHA256 /d "C:\My Files" /p MyPackage.msix
MakeAppx pack /v /o /f MyMapping.txt /p MyPackage.msix
MakeAppx pack /m "MyApp\AppxManifest.xml" /f MyMapping.txt /p AppPackage.msix
MakeAppx pack /r /m "MyApp\AppxManifest.xml" /f MyMapping.txt /p ResourcePackage.msix
MakeAppx pack /v /h SHA256 /d "C:\My Files" /ep MyPackage.emsix /kf MyKeyFile.txt
MakeAppx pack /v /h SHA256 /d "C:\My Files" /ep MyPackage.emsix /kt

创建一个应用程序包

应用包类似于应用包,但捆绑包可以减小用户所下载应用的大小。 例如,应用程序包适用于特定语言的资产、不同的图像规模资产或适用于特定版本 Microsoft DirectX 的资源。 与创建加密应用包类似,还可以在捆绑时加密应用包。 要加密应用程序包,必须使用 /ep 选项,并指定使用的是密钥文件 (/kf),还是全局测试密钥 (/kt)。 有关创建加密捆绑包的更多信息,请参阅加密或解密包或捆绑包

bundle 命令特定选项:

选项 描述
/bv 指定捆绑包的版本号。 版本号必须由四个部分组成,并用句点分隔,格式为:<Major>.<Minor>.<Build>.<Revision>。
/f 指定相应映射文件。

请注意,如果未指定捆绑包版本,或如果捆绑包设置为“0.0.0.0”,则使用当前日期和时间创建捆绑包。

以下用法示例显示了 bundle 命令一些可能的语法选项:

MakeAppx bundle [options] /d <content directory> /p <output bundle name>
MakeAppx bundle [options] /f <mapping file> /p <output bundle name>
MakeAppx bundle [options] /d <content directory> /ep <encrypted output bundle name> /kf MyKeyFile.txt
MakeAppx bundle [options] /f <mapping file> /ep <encrypted output bundle name> /kt

以下块包含 bundle命令的示例:

MakeAppx bundle /v /d "C:\My Files" /p MyBundle.msixbundle
MakeAppx bundle /v /o /bv 1.0.1.2096 /f MyMapping.txt /p MyBundle.msixbundle
MakeAppx bundle /v /o /bv 1.0.1.2096 /f MyMapping.txt /ep MyBundle.emsixbundle /kf MyKeyFile.txt
MakeAppx bundle /v /o /bv 1.0.1.2096 /f MyMapping.txt /ep MyBundle.emsixbundle /kt

从包或捆绑包提取文件

除了打包和捆绑应用外、MakeAppx.exe 还可以解压缩或解除捆绑现有包。 必须将内容目录作为提取文件的目标提供。 如果尝试从加密包或捆绑包提取文件,可以使用 /ep 选项同时解密和提取文件,并指定是否应使用密钥文件 (/kf) 或全局测试密钥 (/kt) 对其进行解密。 有关解密包或捆绑包的更多信息,请参阅加密或解密包或捆绑包

特定于 unpackunbundle 命令的选项:

选项 描述
/nd 在解压缩或解除捆绑包/捆绑包时不执行解密。
/pfn 将所有文件解压缩/解除捆绑到指定输出路径下、以捆绑包或包的全名命名的子目录

以下用法示例显示了 unpackunbundle 命令一些可能的语法选项:

MakeAppx unpack [options] /p <input package name> /d <output directory>
MakeAppx unpack [options] /ep <encrypted input package name> /d <output directory> /kf <key file>
MakeAppx unpack [options] /ep <encrypted input package name> /d <output directory> /kt

MakeAppx unbundle [options] /p <input bundle name> /d <output directory>
MakeAppx unbundle [options] /ep <encrypted input bundle name> /d <output directory> /kf <key file>
MakeAppx unbundle [options] /ep <encrypted input bundle name> /d <output directory> /kt

以下块包含 unpack and unbundle 命令的示例:

MakeAppx unpack /v /p MyPackage.msix /d "C:\My Files"
MakeAppx unpack /v /ep MyPackage.emsix /d "C:\My Files" /kf MyKeyFile.txt
MakeAppx unpack /v /ep MyPackage.emsix /d "C:\My Files" /kt

MakeAppx unbundle /v /p MyBundle.msixbundle /d "C:\My Files"
MakeAppx unbundle /v /ep MyBundle.emsixbundle /d "C:\My Files" /kf MyKeyFile.txt
MakeAppx unbundle /v /ep MyBundle.emsixbundle /d "C:\My Files" /kt

加密或解密一个包或捆绑包

MakeAppx.exe 工具还可以加密或解密现有的包或捆绑包。 只需提供包名称、输出包名称,以及加密或解密是否应使用密钥文件 (/kf) 或全局测试密钥 (/kt)。

无法通过 Visual Studio 打包向导进行加密和解密。

特定于 encryptdecrypt 命令的选项:

选项 描述
/ep 指定一个加密的应用包或捆绑包。

以下用法示例显示了 encryptdecrypt 命令一些可能的语法选项:

MakeAppx encrypt [options] /p <package name> /ep <output package name> /kf <key file>
MakeAppx encrypt [options] /p <package name> /ep <output package name> /kt

MakeAppx decrypt [options] /ep <package name> /p <output package name> /kf <key file>
MakeAppx decrypt [options] /ep <package name> /p <output package name> /kt

以下块包含 encryptdecrypt 命令的示例:

MakeAppx.exe encrypt /p MyPackage.msix /ep MyEncryptedPackage.emsix /kt
MakeAppx.exe encrypt /p MyPackage.msix /ep MyEncryptedPackage.emsix /kf MyKeyFile.txt

MakeAppx.exe decrypt /p MyPackage.msix /ep MyEncryptedPackage.emsix /kt
MakeAppx.exe decrypt p MyPackage.msix /ep MyEncryptedPackage.emsix /kf MyKeyFile.txt

密钥文件

密钥文件须以包含字符串“[Keys]”的行开头,后跟描述每个包加密密钥的行。 每个密钥由引号中的一对字符串表示,中间用空格或制表符分隔。 第一个字符串表示 base64 编码的 32 字节密钥 ID,而第二个字符串表示 base64 编码的 32 字节加密密钥。 密钥文件应是一个简单的文本文件。

密钥文件示例:

[Keys]
"OWVwSzliRGY1VWt1ODk4N1Q4R2Vqc04zMzIzNnlUREU="    "MjNFTlFhZGRGZEY2YnVxMTBocjd6THdOdk9pZkpvelc="

映射文件

映射文件必须以包含字符串“[Files]”的行开头,后跟描述要添加到包中的文件的行。 每个文件由引号中的一对路径描述,中间用空格或制表符分隔。 每个文件都表示其来源(磁盘上)和目的地(包中)。 映射文件应是一个简单的文本文件。

映射文件示例(没有 /m 选项):

[Files]
"C:\MyApp\StartPage.html"               "default.html"
"C:\Program Files (x86)\example.txt"    "misc\example.txt"
"\\MyServer\path\icon.png"              "icon.png"
"my app files\readme.txt"               "my app files\readme.txt"
"CustomManifest.xml"                    "AppxManifest.xml"

使用映射文件时,可以选择是否使用 /m 选项。 /m 选项能让用户指定要在生成的清单中包含的映射文件中的资源元数据。 如果使用 /m 选项,映射文件必须包含以“[ResourceMetadata]”行开头的部分,后跟指定“ResourceDimensions”和“ResourceId”的行。应用包可以包含多个“ResourceDimensions”,但只能有一个“ResourceId”。

映射文件示例(有 /m 选项):

[ResourceMetadata]
"ResourceDimensions"                    "language-en-us"
"ResourceId"                            "English"

[Files]
"images\en-us\logo.png"                 "en-us\logo.png"
"en-us.pri"                             "resources.pri"

MakeAppx.exe 执行的语义验证

MakeAppx.exe 执行有限的语义验证,旨在捕获最常见的部署错误,并帮助确保应用包有效。 如果想要在使用 MakeAppx.exe 时跳过验证,请参阅 /nv 选项。

此验证可用于确保:

  • 应用包中包含包清单中引用的所有文件。
  • 应用程序没有两个完全相同的密钥。
  • 应用程序不会注册此列表中禁止的协议:SMB、FILE、MS-WWA-WEB、MS-WWA。

这不是完整的语义验证,因为它只用于捕获常见错误。 MakeAppx.exe 生成的包不能保证可安装。