应用包生成工具 (MakeAppx.exe)
注意
有关使用此工具的 UWP 指南,请参阅使用 MakeAppx.exe 工具创建应用包。
应用包生成工具 (MakeAppx.exe) 从磁盘上的文件创建应用包,或将应用包中的文件提取到磁盘。 从 Windows 8.1 开始,应用包生成工具还会从磁盘上的应用包创建应用包捆绑包,或者从应用包捆绑包中提取应用包到磁盘。 它包含在 Microsoft Visual Studio 中,以及适用于 Windows 8 的 Windows 软件开发工具包(SDK) 或适用于 Windows 8.1 及更新版本的 Windows 软件开发工具包 (SDK) 中。 访问面向开发人员的下载内容获取它们。
MakeAppx.exe 工具通常位于操作系统版本特定的位置:
- C:\Program Files (x86)\Windows Kits\10\bin<build number><architecture>\makeappx.exe
其中,<architecture> = x86、x64、arm、ar64 或 chpe。 或者它可能位于:
C:\Program Files (x86)\Windows Kits\10\App Certification Kit\makeappx.exe
- 使用目录结构创建包
- 使用映射文件创建包
- 使用 SignTool 对包进行签名
- 从包中提取日志
- 使用目录结构创建包捆绑包
- 使用映射文件创建包捆绑包
- 从捆绑包中提取包
- 使用密钥文件加密包
- 使用全局测试密钥加密包
- 使用密钥文件解密包
- 使用全局测试密钥解密包
- 使用情况
使用应用包生成工具
注意
整个工具都支持相对路径。
使用目录结构创建包
将 AppxManifest.xml 放在包含应用的所有有效负载文件的目录的根目录中。 将为应用包创建一个相同的目录结构,并在部署时提取包时可用。
将所有文件放在单个目录结构中,根据需要创建子目录。
创建一个有效的包清单 AppxManifest.xml,并将其放在根目录中。
运行以下命令:
MakeAppx pack /d input_directorypath /p filepath.appx
使用映射文件创建包
创建有效的包清单 AppxManifest.xml。
创建映射文件。 第一行包含字符串 [Files],后跟的行在带引号的字符串中指定源(磁盘)和目标(包)路径。
[Files] "C:\MyApp\StartPage.htm" "default.html" "C:\MyApp\readme.txt" "doc\readme.txt" "\\MyServer\path\icon.png" "icon.png" "MyCustomManifest.xml" "AppxManifest.xml"
运行以下命令:
MakeAppx pack /f mapping_filepath /p filepath.appx
使用 SignTool 对包进行签名
创建证书。 清单中列出的发布者必须与签名证书的发布者使用者信息匹配。 有关创建签名证书的更多信息,请参阅如何创建应用包签名证书。
运行 SignTool.exe 对包进行签名:
SignTool sign /a /v /fd hashAlgorithm /f certFileName filepath.appx
hashAlgorithm 必须与打包应用时用于创建块映射的哈希算法匹配。 使用 MakeAppx 打包实用工具时,默认的 Appx 块映射哈希算法为 SHA256。 运行 SignTool.exe,指定 SHA256 作为文件摘要 (/fd) 算法:
SignTool sign /a /v /fd SHA256 /f certFileName filepath.appx
有关如何对包签名的更多信息,请参阅如何使用 SignTool 对应用包进行签名。
从包中提取日志
运行以下命令:
MakeAppx unpack /p file.appx /d output_directory
已打开的包与已安装的包具有相同的结构。
使用目录结构创建包捆绑包
我们使用 bundle 包命令,通过从<内容目录>(包括子文件夹)添加所有包,在<输出捆绑包名称>处创建应用捆绑包。 如果<内容目录> 包含捆绑清单 AppxBundleManifest.xml,则会忽略它。
将所有包放在单个目录结构中,根据需要创建子目录。
运行以下命令:
MakeAppx bundle /d input_directorypath /p filepath.appxbundle
使用映射文件创建包捆绑包
我们使用 bundle 命令,通过添加<映射文件>中的包列表中的所有包,在<输出捆绑包名称>处创建应用包。 如果<映射文件>包含捆绑清单 AppxBundleManifest.xml,则会忽略它。
创建<映射文件>。 第一行包含字符串 [Files],后跟的行指定要添加到捆绑包的包。 每个包由一对带引号的路径描述,路径之间用空格或制表符分隔。 这对路径表示包的源(在磁盘上)和目标(在捆绑包中)。 所有目标包名称都必须具有 .appx 扩展名。
[Files] "C:\MyApp\MyApp_x86.appx" "MyApp_x86.appx" "C:\Program Files (x86)\ResPack.appx" "resources\resPack.appx" "\\MyServer\path\ResPack.appx" "Respack.appx" "my app files\respack.appx" "my app files\respack.appx"
运行以下命令:
MakeAppx bundle /f mapping_filepath /p filepath.appxbundle
从捆绑包中提取包
运行以下命令:
MakeAppx unbundle /p bundle_name.appxbundle /d output_directory
未打开的包与已安装的包具有相同的结构。
使用密钥文件加密包
创建密钥文件。 密钥文件必须以一行开头,该行包含字符串“[Keys]”,然后是描述用于加密包的密钥的行。 每个键由一对带引号的字符串描述,字符串之间用空格或制表符分隔。 第一个字符串表示密钥 ID,第二个字符串以十六进制形式表示加密密钥。
[Keys] "0" "1AC4CDCFF1924D2885A0607269787BA6BF09B7FFEBF74ED4B9D86E423CF9186B"
运行以下命令:
MakeAppx.exe encrypt /p package_name.appx /ep encrypted_package_name.eappx /kf keyfile_name.txt
输入包将使用提供的密钥文件加密为指定的加密包。
使用全局测试密钥加密包
运行以下命令:
MakeAppx.exe encrypt /p package_name.appx /ep encrypted_package_name.eappx /kt
输入包将使用全局测试密钥加密为指定的加密包。
使用密钥文件解密包
创建密钥文件。 密钥文件必须以一行开头,该行包含字符串“[Keys]”,然后是描述用于加密包的密钥的行。 每个键由一对带引号的字符串描述,字符串之间用空格或制表符分隔。 第一个字符串表示 base64 编码的 32 字节密钥 ID,第二个字符串表示 base64 编码的 32 字节加密密钥。
[Keys] "OWVwSzliRGY1VWt1ODk4N1Q4R2Vqc04zMzIzNnlUREU=" "MjNFTlFhZGRGZEY2YnVxMTBocjd6THdOdk9pZkpvelc="
运行以下命令:
MakeAppx.exe decrypt /p package_name.appx /ep unencrypted_package_name.eappx /kf keyfile_name.txt
输入包将使用提供的密钥文件解密为指定的未加密包。
使用全局测试密钥解密包
运行以下命令:
MakeAppx.exe decrypt /p package_name.appx /ep unencrypted_package_name.eappx /kt
输入包将使用全局测试密钥解密为指定的未加密包。
使用情况
命令行参数 /p 总是必需的,或者 /d、/f 或 /ep。 请注意,/d、/f 和 /ep 互斥。
MakeAppx pack [options] /p <output package name> /d <content directory>
MakeAppx pack [options] /p <output package name> /f <mapping file>
MakeAppx unpack [options] /p <input package name> /d <output directory>
MakeAppx bundle [options] /p <output bundle name> /d <content directory>
MakeAppx bundle [options] /p <output bundle name> /f <mapping file>
MakeAppx unbundle [options] /p <input bundle name> /d <output directory>
MakeAppx encrypt [options] /p <input package name> /ep <output package name>
MakeAppx decrypt [options] /p <input package name> /ep <output package name>
命令行语法
以下是 MakeAppx 的命令行常用语法。
MakeAppx [pack|unpack|bundle|unbundle|encrypt|decrypt] [/h /kf /kt /l /o /no /nv /v /pfn /?]
MakeAppx 打包或解包包中的文件,捆绑或解包捆绑中的包,或加密或解密指定输入目录或映射文件中的应用程序包或捆绑。 下面是适用于MakeAppx 包、MakeAppx 解包、MakeAppx 捆绑包、MakeAppx 解包、MakeAppx 加密或 MakeAppx 解密的参数列表。
-
/l
-
此选项用于本地化包。 对本地化包进行默认验证。 此选项仅禁用该特定验证,而不要求禁用所有验证。
-
/o
-
覆盖输出文件(如果存在)。 如果未指定此选项或 /no 选项,则会询问用户是否要覆盖文件。
不能将此选项与 /no 一起使用。
-
/no
-
防止覆盖已存在的输出文件。 如果未指定此选项或 /o 选项,则会询问用户是否要覆盖文件。
不能将此选项与 /o 一起使用。
-
/nv
-
跳过语义验证。 如果未指定此选项,则该工具将执行包的完整验证。
-
/v
-
启用到控制台的详细日志记录输出。
-
/?
-
显示帮助文本。
MakeAppx 包、MakeAppx 解包、MakeAppx 捆绑包、 MakeAppx 解包、MakeAppx 加密和 MakeAppx 解密是互斥命令。 以下是专门适用于每个命令的命令行参数:
MakeAppx pack [h]
创建包。
-
/h algorithm
-
指定创建块映射时使用的哈希算法。 下面是算法的有效值:
- SHA256(默认值)
- SHA384
- SHA512
不能将此选项与 unpack 命令一起使用。
MakeAppx unpack [pfn]
将指定包中的所有文件提取到指定输出目录。 输出与包具有相同的目录结构。
-
/pfn
-
指定以包全名命名的目录。 此目录是在提供的输出位置下创建的。 不能将此选项与 pack 命令一起使用。
MakeAppx unbundle [pfn]
将所有包解压缩到指定输出路径下的子目录中,该路径以包的全名命名。 输出具有与已安装的软件包相同的目录结构。
-
/pfn
-
指定一个使用包捆绑包全名命名的目录。 此目录是在提供的输出位置下创建的。 不能将此选项与 bundle 命令一起使用。
MakeAppx encrypt [kf, kt]
在指定的输出包处从指定的输入应用包创建加密的应用包。
-
/kf <key file>
-
使用指定密钥文件中的密钥对包或捆绑包进行加密。 不能将此选项与 kt 一起使用。
-
/kt
-
使用全局测试密钥对包或捆绑包进行加密。 不能将此选项与 kf 一起使用。
MakeAppx decrypt [kf, kt]
从指定输出包处的指定输入应用包创建未加密的应用包。
-
/kf <key file>
-
使用指定密钥文件中的密钥解密包或捆绑包。 不能将此选项与 kt 一起使用。
-
/kt
-
使用全局测试密钥解密包或捆绑包。 不能将此选项与 kf 一起使用。
MakeAppx 执行的语义验证
MakeAppx 执行有限的语义验证,旨在捕捉最常见的部署错误,并帮助确保应用包有效。
此验证可用于确保:
- 应用包中包含包清单中引用的所有文件。
- 应用程序没有两个完全相同的密钥。
- 应用程序不会注册此列表中禁止的协议:SMB、FILE、MS-WWA-WEB、MS-WWA。
此语义验证不完整,并且不能保证 MakeAppx 构建的包是可安装的。