应用包生成工具 (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

使用应用包生成工具

注意

整个工具都支持相对路径。

 

使用目录结构创建包

将 AppxManifest.xml 放在包含应用的所有有效负载文件的目录的根目录中。 将为应用包创建一个相同的目录结构,并在部署时提取包时可用。

  1. 将所有文件放在单个目录结构中,根据需要创建子目录。

  2. 创建一个有效的包清单 AppxManifest.xml,并将其放在根目录中。

  3. 运行以下命令:

    MakeAppx pack /d input_directorypath /p filepath.appx

使用映射文件创建包

  1. 创建有效的包清单 AppxManifest.xml。

  2. 创建映射文件。 第一行包含字符串 [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"
    
  3. 运行以下命令:

    MakeAppx pack /f mapping_filepath /p filepath.appx

使用 SignTool 对包进行签名

  1. 创建证书。 清单中列出的发布者必须与签名证书的发布者使用者信息匹配。 有关创建签名证书的更多信息,请参阅如何创建应用包签名证书

  2. 运行 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 对应用包进行签名

从包中提取日志

  1. 运行以下命令:

    MakeAppx unpack /p file.appx /d output_directory

  2. 已打开的包与已安装的包具有相同的结构。

使用目录结构创建包捆绑包

我们使用 bundle 包命令,通过从<内容目录>(包括子文件夹)添加所有包,在<输出捆绑包名称>处创建应用捆绑包。 如果<内容目录> 包含捆绑清单 AppxBundleManifest.xml,则会忽略它。

  1. 将所有包放在单个目录结构中,根据需要创建子目录。

  2. 运行以下命令:

    MakeAppx bundle /d input_directorypath /p filepath.appxbundle

使用映射文件创建包捆绑包

我们使用 bundle 命令,通过添加<映射文件>中的包列表中的所有包,在<输出捆绑包名称>处创建应用包。 如果<映射文件>包含捆绑清单 AppxBundleManifest.xml,则会忽略它。

  1. 创建<映射文件>。 第一行包含字符串 [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"
    
  2. 运行以下命令:

    MakeAppx bundle /f mapping_filepath /p filepath.appxbundle

从捆绑包中提取包

  1. 运行以下命令:

    MakeAppx unbundle /p bundle_name.appxbundle /d output_directory

  2. 未打开的包与已安装的包具有相同的结构。

使用密钥文件加密包

  1. 创建密钥文件。 密钥文件必须以一行开头,该行包含字符串“[Keys]”,然后是描述用于加密包的密钥的行。 每个键由一对带引号的字符串描述,字符串之间用空格或制表符分隔。 第一个字符串表示密钥 ID,第二个字符串以十六进制形式表示加密密钥。

        [Keys]
        "0"                 "1AC4CDCFF1924D2885A0607269787BA6BF09B7FFEBF74ED4B9D86E423CF9186B"
    
  2. 运行以下命令:

    MakeAppx.exe encrypt /p package_name.appx /ep encrypted_package_name.eappx /kf keyfile_name.txt

  3. 输入包将使用提供的密钥文件加密为指定的加密包。

使用全局测试密钥加密包

  1. 运行以下命令:

    MakeAppx.exe encrypt /p package_name.appx /ep encrypted_package_name.eappx /kt

  2. 输入包将使用全局测试密钥加密为指定的加密包。

使用密钥文件解密包

  1. 创建密钥文件。 密钥文件必须以一行开头,该行包含字符串“[Keys]”,然后是描述用于加密包的密钥的行。 每个键由一对带引号的字符串描述,字符串之间用空格或制表符分隔。 第一个字符串表示 base64 编码的 32 字节密钥 ID,第二个字符串表示 base64 编码的 32 字节加密密钥。

        [Keys]
        "OWVwSzliRGY1VWt1ODk4N1Q4R2Vqc04zMzIzNnlUREU="                 "MjNFTlFhZGRGZEY2YnVxMTBocjd6THdOdk9pZkpvelc="
    
  2. 运行以下命令:

    MakeAppx.exe decrypt /p package_name.appx /ep unencrypted_package_name.eappx /kf keyfile_name.txt

  3. 输入包将使用提供的密钥文件解密为指定的未加密包。

使用全局测试密钥解密包

  1. 运行以下命令:

    MakeAppx.exe decrypt /p package_name.appx /ep unencrypted_package_name.eappx /kt

  2. 输入包将使用全局测试密钥解密为指定的未加密包。

使用情况

命令行参数 /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 构建的包是可安装的。