创建 Windows 通用版 OEM 包
Windows IoT 核心版版本 1709 支持 Windows 通用 OEM 打包标准。
这种新的打包架构与未来更多类型的设备兼容。 如果你使用传统打包标准 (pkg.xml) 为 IoT 核心版设备生成了包,并希望在 IoT 设备上使用这些包,可将它们转换为新的打包标准。
包
包是用于创建 IoT 核心版映像的逻辑构建基块。
- 添加的所有内容都将打包。 添加到设备的每个驱动程序、库、注册表设置、系统文件和自定义项将包含在一个包中。 每个项的内容和位置将列在包定义文件 (*.wm.xml) 中。
- 受信任的合作伙伴可以更新包。 设备上的每个包由你或受信任的合作伙伴签名。 这样,OEM、ODM、开发人员和 Microsoft 就可以协同工作,帮助为你的设备提供安全和功能更新,而不会妨碍彼此的工作。
- 包的版本受控制。 这有助于更轻松地实现更新,并使系统还原更可靠。
包分为三个主要类别:
- 操作系统工具包包,包含核心 Windows 操作系统
- SoC 供应商预生成的包,包含用于支持芯片组的驱动程序和固件
- OEM 包,包含特定于设备的驱动程序和自定义项
首先创建一个新的空包
安装适用于 Windows 10 版本 1709 的 Windows ADK,并根据获取自定义 Windows IoT 核心版所需的工具和实验 1a:创建基本映像中所述获取其他工具和测试证书。
使用文本编辑器基于以下模板创建新的包定义文件(也称为 Windows 清单文件)。 使用 wm.xml 扩展名保存该文件。
<?xml version='1.0' encoding='utf-8' standalone='yes'?> <identity xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="MediaService" namespace="Media" owner="OEM" > </identity>
创建空的包文件 (*.cab)。 创建的文件名基于文件的所有者、命名空间和名称。
c:\oemsample>pkggen myPackage.wm.xml /universalbsp Directory of c:\oemsample 04/03/2017 05:56 PM <DIR> . 04/03/2017 05:56 PM <DIR> .. 04/03/2017 05:43 PM 333 myPackage.wm.xml 04/03/2017 05:56 PM 8,239 OEM-Media-MediaService.cab
将内容添加到包中
包的内容组织成包定义文件中的 XML 元素列表。
以下示例演示如何将一些文件和注册表设置添加到包中。 此示例定义了一个变量 (_RELEASEDIR),每次生成包时都可以更新该变量。
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<identity
xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="MediaService"
namespace="Media"
owner="OEM"
>
<files>
<file source="$(_RELEASEDIR)\MediaService.dll"/>
</files>
<regKeys>
<regKey keyName="$(hklm.software)\OEMName\MediaService">
<regValue
name="StringValue"
type="REG_SZ"
value="MediaService"
/>
<regValue
name="DWordValue"
type="REG_DWORD"
value="0x00000020"
/>
</regKey>
</regKeys>
</identity>
运行 pkggen.exe 工具
PkgGen.exe [project] /universalbsp ...
[project]··········· Full path to input file : .wm.xml, .pkg.xml, .man
Values:<Free Text> Default=NULL
[universalbsp]······ Convert wm.xml BSP package to cab
Values:<true | false> Default=False
[variables]········· Additional variables used in the project file,syntax:<name>=<value>;<name>=<value>;....
Values:<Free Text> Default=NULL
[cpu]··············· CPU type. Values: (x86|arm|arm64|amd64)
Values:<Free Text> Default="arm"
[languages]········· Supported language identifier list, separated by ';'
Values:<Free Text> Default=NULL
[version]··········· Version string in the form of <major>.<minor>.<qfe>.<build>
Values:<Free Text> Default="1.0.0.0"
[output]············ Output directory for the CAB(s).
Values:<Free Text> Default="CurrentDir"
示例:
c:\oemsample>pkggen myPackage.wm.xml /universalbsp /variables:"_RELEASEDIR=c:\release"
添加驱动程序组件
在包定义文件中,使用 driver 元素注入驱动程序。 建议使用相对路径,因为这通常是描述 INF 源路径的最简单方式。
<drivers>
<driver>
<inf source="$(_RELEASEDIR)\Media.inf"/>
</driver>
</drivers>
如果默认的文件导入路径不同于 INF 源路径,你可以使用 defaultImportPath 属性。 在以下示例中,INF 位于当前目录中,但要导入的文件与 $(_RELEASEDIR) 相关。
<drivers>
<driver defaultImportPath="$(_RELEASEDIR)">
<inf source="Media.inf"/>
</driver>
</drivers>
如果要导入的文件与它们在 INF 中的定义方式不相关,则你可以应用文件替代。 不建议这样做,但在特殊情况下可以采取这种做法。
<drivers>
<driver>
<inf source="Media.inf"/>
<files>
<file name="mdr.sys" source="$(_RELEASEDIR)\path1\mdr.sys" />
<file name="mdr.dll" source="$(_RELEASEDIR)\path2\mdr.dll" />
</files>
</driver>
</drivers>
添加服务组件
在包定义文件中,使用 service 元素(及其子元素和属性)来定义和打包系统服务。
<service
dependOnService="AudioSrv;AccountProvSvc"
description="@%SystemRoot%\system32\MediaService.dll,-201"
displayName="@%SystemRoot%\system32\MediaService.dll,-200"
errorControl="normal"
imagePath="%SystemRoot%\system32\svchost.exe -k netsvcs"
name="MediaService"
objectName="LocalSystem"
requiredPrivileges="SeChangeNotifyPrivilege,SeCreateGlobalPrivilege"
sidType="unrestricted"
start="delayedAuto"
startAfterInstall="none"
type="win32UserShareProcess"
>
生成和筛选 WOW 包
若要生成来宾或 WOW 包(在 64 位设备上运行的 32 位包),请将 buildWow="true" 属性添加到 myPackage.wm.wml
<identity
xmlns="urn:Microsoft.CompPlat/ManifestSchema.v1.00"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
name="MediaService"
namespace="Media"
owner="OEM"
buildWow="true"
>
现在,运行 PkgGen.exe 会为每个主机包生成一个 WOW 包。
04/05/2017 07:59 AM 11,870 OEM-Media-MediaService.cab
04/05/2017 07:59 AM 10,021 OEM-Media-MediaService_Wow_arm64.arm.cab
通常,64 位设备将获取其 Host 64 位包以及其来宾 32 位包或 WOW 包,这两个包都是从 myPackage.wm.xml 生成的。 为了避免两个包之间发生资源冲突,请使用生成筛选器:
<regKeys buildFilter="not build.isWow and build.arch = arm" >
<regKey keyName="$(hklm.software)\OEMName\MediaService">
<regValue
name="StringValue"
type="REG_SZ"
value="MediaService"
/>
</regKey>
在这种情况下,注册表项是主机 32 位 Arm 包的独占项。 CPU 开关用于设置 build.arch;在生成 32 位主机包时,PkgGen 会将 build.isWow 设置为 false,在生成 32 位来宾包或 WOW 包时将其设置为 true。
[cpu]··············· CPU type. Values: (x86|arm|arm64|amd64)
Values:<Free Text> Default="arm"
转换 Windows 通用 OEM 包
如果你使用 pkg.xml 打包模型创建了包,并想要在 Windows IoT 核心版版本 1709 上使用这些包,则需要重新创建这些包,或使用 pkggen.exe 工具转换它们。
转换包后,可能需要修改 wm.xml 文件以确保它遵循架构。
IoT 核心版加载项 v4.x 支持新的 Windows 通用 OEM 包标准 (wm.xml)。 这种新的打包架构与未来更多类型的设备兼容。
转换包文件
若要将以旧式手机打包格式 (pkg.xml) 创建的现有包转换为新的 wm.xml 格式,请运行以下命令:
pkggen.exe "filename.pkg.xml" /convert:pkg2wm
或者,在 IoTCoreShell 提示符下,使用 convertpkg 或 buildpkg 进行转换。 输出的 wm.xml 文件将保存到同一文件夹中。
convertpkg.cmd MyPackage.pkg.xml
buildpkg.cmd MyPackage.pkg.xml
使用 buildpkg 查看和测试 wm.xml 包。
buildpkg.cmd MyPackage.wm.xml
将文件转换为 wm.xml 格式后,可以安全地删除 pkg.xml 文件。
重新生成应用包
使用具有相同组件名称的 newAppxPkg。 这会重新生成 customizations.xml 文件。 appx 的版本号将保留为 ppkg 的版本号。
newAppxPkg "C:\DefaultApp\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test.appx" fga Appx.MyUWPApp
了解详细信息:添加应用。
添加文件:注意零大小文件和相对路径
wm.xml 不支持零大小文件。 若要解决此问题,请在文件中添加一个空白区域,使该文件变为非零大小文件。
路径:添加位于当前目录中的文件时,需要显式在文件名的前面添加 .\ 前缀。
<BinaryPartition ImageSource=".\uefi.mbn" />
了解详细信息:添加文件
更新预配程序包 customization.xml 文件
在 ADK 版本 1709 中,需要更新 customizations.xml 文件:
在 product\prov 文件夹中,手动将 Common/ApplicationManagement 移到 Common/Policies/ApplicationManagement
<Customizations>
<Common>
<Policies>
<ApplicationManagement>
<AllowAppStoreAutoUpdate>Allowed</AllowAppStoreAutoUpdate>
<AllowAllTrustedApps>Yes</AllowAllTrustedApps>
</ApplicationManagement>
预配程序包 (PPKG) 现在支持类似于包版本的由四个部分组成的版本。 由于这种变化,版本 1.19 高于版本 1.2。 以前的版本使用基于字符的排序,因此版本 1.19 被视为低于 1.2。
了解详细信息:添加预配文件