Windows CE 应用容器入门

Windows CE 应用容器是一项使大多数 CE 应用程序可以在 Windows 10 IoT 核心版上运行的技术。

此解决方案分两个阶段构建。 第一个阶段使用适用于 x86 或 ARM32 体系结构的 BSP 来创建 Windows CE 2013 映像。 然后在第二个阶段中,此映像包含在 Windows 10 IoT 核心版映像中,而该映像会针对将安装解决方案的特定设备硬件使用 x64 或 ARM32 BSP。

CE 应用容器体系结构

有关此体系结构的详细信息,请查看此视频:实现 Windows CE 设备现代化

先决条件

Windows CE 应用容器软件需要已更新的 Windows Compact 2013(2020 年 6 月或之后的版本号 6294)版本以及已更新的适用于 x64 和 ARM32 的 Windows 10 IoT 核心版包(2020 年 8 月或之后的更新)。 要获取最新的 Windows 10 IoT 核心版包,请联系 Microsoft 经销商。

注意

你必须拥有有效的 IoT 核心版服务订阅,才能分发采用 CE 应用容器技术的设备。

此外,还将需要以下各项:

针对 Windows CE 应用容器配置、构建和打包 CE

创建 Windows Embedded Compact 2013 映像的过程尚未得到显著更新。 生成映像的一般过程如下:

  1. 使用平台生成器创建 OS Design 项目

  2. 选择平台生成器板支持包 (BSP)

  3. 选择合适的设计模板

  4. 配置该设计模板提供的选项

  5. (可选)将子项目添加到设计项目中

  6. 生成映像

主要更改在于选择正确的 BSP 以及 CE 映像的其他注意事项。 本指南假设你已熟悉生成 Windows CE 系统映像的过程,但也有必要深入了解更改部分。

步骤 2 是在使用 CE 应用容器时,之前的 OS Design 项目过程中唯一更改的部分,请参见下文了解更多详细信息。

步骤 2 - 选择平台生成器 BSP

为了支持 Windows CE 应用容器,平台生成器中添加了针对 x86 和 ARM 体系结构的新 BSP。

为 CE 应用容器创建 OS Design 时,根据基于 IoT 核心版的设备的基本硬件,选择“Windows CE 应用容器:x86”或“Windows CE 应用容器:ARMv7”(ARM32)。

例如,如果目标 IoT 核心版设备使用 Intel 硬件,则将选择“Windows CE 应用容器:x86”选项。 或者,如果 IoT 核心版硬件使用 NXP i.MX6,则将选择“Windows CE 应用容器:ARMv7”选项。

选择 CE 应用容器 BSP

完成此操作后,你将能够照常以为 Windows Embedded Compact 映像进行配置的方式配置选项和子项目。 这些配置将内置到将在 Windows 10 IoT 核心版映像中部署的 CE 容器中。

生成 Windows 10 IoT 核心版映像

注意

此过程已在 Windows 10 IoT 核心版制造指南的实验室部分作详细介绍。 以下部分仅提供在 IoT 核心版映像生成过程的某些阶段执行的其他操作。 强烈建议你先熟悉 Windows 10 IoT 核心版制造指南,然后再继续。

过程概述

与生成 Windows Embedded Compact 映像的过程不同,Windows 10 IoT 核心版分离且集成了固件、板支持包、映像定义和应用程序包含内容的创建。 通过对这些部分使用不同的技术,可以将需要在组织中的不同团队或个人之间完成的工作分开。

创建映像的基本步骤如下:

  1. 创建工作区

  2. 导入适当的 IoT 核心版板支持包 (BSP)

  3. 导入之前创建的 CE 应用容器

  4. 创建产品定义

  5. 为产品添加功能和应用程序

  6. 构建完整闪存更新 (FFU)

  7. 将 FFU 部署到设备并进行测试

  8. 完成零售 FFU 并为其签名

Windows 10 IoT 核心版制造指南针对每个步骤都提供了详细的指导。 虽然其中一些步骤与使用平台生成器 (PB) 创建设备映像的过程类似,但有必要对某些领域进行更深入的探索。

步骤 1 - 创建工作区

查看 IoT 核心版制造指南中的创建基本映像文档,了解如何创建工作区。

步骤 2 - 导入适当的 IoT 核心版板支持包 (BSP)

查看 IoT 核心版制造指南中的创建基本映像文档,了解对板的支持。

步骤 3 - 导入 Windows CE 应用容器

如上所述,要使用 PB 创建 Windows CE 应用容器,并使用 Import-IoTCEPAL 命令将其导入到 IoT 核心版工作区。 此命令会将所需内容从 CE 平面发布目录复制到 IoT ADK 工作区。 如果多次调用,则之前的状态会备份到工作区的 Source-\$Arch\CEPAL.OLD 目录下。

步骤 4 - 创建产品定义

查看 IoT 核心版制造指南中的创建基本映像文档,以创建产品定义。

步骤 5 - 将 CE 应用容器添加到产品

将 CE 应用容器定义导入到工作区后,需要确保运行 Add-IoTCEPAL 命令,该命令会将对 CE 应用容器包的引用添加到相关的产品 OEMInput.xml 文件(测试和零售)。

下一步是使用 Add-IoTProductFeature 命令将 IOT_CEPAL 功能添加到 OEMInput.xml。 这会将对 Windows CE 应用容器(Windows CE 前端 UWP 应用 + 支持驱动程序)的 Windows 主机支持添加到我们的产品定义中,并在默认应用组中包含 CE 应用容器。 我们将在后面的部分中介绍启动配置。

步骤 6 - 生成 CAB 文件

这是 FFU 创建过程中的一个重要步骤,每当更改配置、添加/更改应用程序或驱动程序时都应执行此步骤。 你将结合使用 New-IoTCabPackage 和“全部”选项。 此外,也可以根据需要构建单个功能,但通常应在生成 FFU 这一步之前重新生成所有包,这是最佳做法。

步骤 7 - 将 FFU 部署到设备

生成映像后,可以将其部署到设备。 这可以使用 DISM 通过特定于设备的部署过程从命令行完成,也可以使用 Windows 10 IoT 核心版仪表板来完成。 关于更多详细信息,请参阅 Windows 10 IoT 核心版制造指南

使用现有 FFU 将 Windows CE 应用容器部署到设备

CE CAB 是 IoT 核心版上的可部署包。 如果当前存在 IoT 核心版映像,则可以使用 APPLYUPDATE 命令将这些 CAB 部署到设备。 首先将 CAB 复制到设备,然后使用 APPLYUPDATE 暂存和提交 CAB。 请注意,采用这种更新方式时需遵循包版本控制要求,因此如果要将已更新版本的包部署到设备,则它们的版本号必须更高。 (请参阅 IoT ADK 环境中的 Set-IoTCabVersion 命令)。 有关此内容的详细信息,请参阅创建和安装包

步骤 8 - 生成零售映像

拥有正确签名的映像对于保护和更新设备至关重要。 对于 Windows 10 IoT 核心版,这表现为测试签名版本和零售签名版本之间的差异。 切勿公开部署测试签名版映像。 测试签名版映像应仅用于调试目的,你应在创建最终零售签名版映像之前更正任何错误或配置更改。

注意

除了计算机上安装的开发和部署工具之外,还需要以下内容才能启用零售签名:

  • 零售代码签名证书
  • 交叉签名证书

正确添加应用程序并为其签名

如果你有一个或多个要包含在 Windows 10 IoT 核心版零售映像中的自定义应用程序,则需要验证在将这些应用程序添加到零售映像中时它们是否已进行正确签名。

其他信息

向现有映像添加新应用程序

要将新应用程序添加到现有 OS Design,可以将项目作为子项目添加到 OS Design 项目,也可以创建普通部署 CAB 包,以将它们作为初始设备设置的一部分部署到设备。

打包最佳做法

应始终确保包尽可能精细,以减少更新时间。

由于包是更新的最小单位,因此请确保每个包都尽可能小。 在平台生成器中生成时,生成的包根据内存部分和模块/文件类型(根据 bib 文件)自动分离。

  • 对于在平台生成器中生成并通过 OSDesign.bib 打包的自定义资产,请考虑将自定义资产添加到 BIB(而不是 NK)中的单独内存部分中,以便对自定义代码的更新可以与对 CE OS 的更新分开发布。

  • 对于通过 IoT ADK 打包命令添加的自定义资产:确保创建的包尽可能小。

向平台生成器包中添加其他内容

一般不建议通过修改由平台生成器生成的结果包,来将其他组件添加到系统映像中, 而是应按照 Windows 10 IoT 核心版制造指南进行操作。 但是,如果必须将文件添加到由平台生成器创建的包中,请按照现有过程进行操作。 向 PB 生成的包中添加内容时,请考虑以下各项:

  • 包的最大大小约为 400 MB,超过此大小将阻止更新。

  • 更新针对包粒度进行。 如果包中的单个资产需要更新,则该包的所有资产将同时更新。 要减少更新的大小,请将内容隔离为多个单独的包,以最大程度减少总更新大小。

通过平台生成器添加其他文件

上文详述的打包过程由生成 CE BIN 文件的相同输入驱动。 因此,如果 OSDesign.bib 中引用了这些文件,并且将注册表项添加到 OSDesign.reg 中,则 MAKEIMG 过程将在生成的 CAB 文件中添加这些文件。 在此过程中,MAKEIMG 现将执行以下操作:

  1. ROMIMAGE 将在平面发布目录 (FRD) 中创建一个名为 CEPAL\_PKG 的目录,该目录为 Windows CE for CEPAL 暂存已安装的目录结构。

  2. ROMIMAGE 根据 CE BIB 文件列出放置在 CEPAL\_PKG 中的所有 CE 文件的清单。

  3. ROMIMAGE 将为每个内存部分创建多个 WM.XML 文件。 这样做是为了能够以更细粒度的方式推送更新,因为更新的最小单位是包。

  4. ROMIMAGE 将进行创建,而该创建内容会引用所有已创建的包。

创建的所有包都将使用固定前缀 “%OEM\_NAME%.WindowsCE.\*” 进行命名,其中 %OEM\_NAME% 是在 IoT 核心版创建过程中调用 New-IoTCabPackage 时填充的。 命名空间中的包名称派生自 BIB 文件中的内存部分(例如 NK),后跟模块/文件(也由 BIB 文件确定)。

Windows Embedded Compact 2013 与 Windows 10 IoT 核心版应用程序之间的通信

建议使用本地环回法在 CE 容器中运行的应用程序之间进行通信。 有关详细信息,请参阅本文档中的本地环回。

自动启动 CE 应用容器应用程序

要自动启动 CE 容器应用程序,可以创建预配程序包,该程序包会将启动应用程序设置为“Microsoft.Windows.IoT.CEPAL.DkMonUWP_cw5n1h2txyewy!App”,并将此预配程序包添加到映像中。 还需要通过使用 Remove-IoTProductFeature 命令并从 IoT 核心版产品定义中删除 IOT_BERTHA 功能 ID,来删除默认启动应用程序。

Windows CE 应用容器的可用配置设置

CE 中基于注册表的配置

默认情况下不可执行的堆栈

默认情况下,Windows CE 应用容器已禁用可执行堆栈页面以提高安全性。 但是,某些旧版应用程序可能要依赖于此行为才能正确运行。 要启用可执行堆栈,请在 CE 映像中设置以下注册表值(建议将其放入平台生成器中的 OSDesign.reg)

KeyPath = HKEY\_LOCAL\_MACHINE\CEPAL
ValueName = MemoryOptions Type = REG\_DWORD
Value = 1
GWES 的 16 位 565 替代

如果 Windows CE 应用容器配置了 32 位显示器,则 GWES 将进行 16 位到 32 位 RGB 转换,前提是 16 位 RGB 像素数据为 RGB555 格式。 如果位图资源是 16 位 565,并且无法将这些资源转换为 RGB555,则可以通过注册表项更改 GWES 的默认转换行为。 创建以下注册表项:

HKEY\_LOCAL\_MACHINE\SYSTEM\GDI\16bpp565RGBPalette.

主机中基于注册表的配置(IoT 核心版)

为 Windows CE 应用容器配置串行端口

需要将主机串行端口映射到 CE 环境中。 此映射存在于 IoT 核心版的注册表中,并需要由映像创建者进行配置。

HKEY\_CURRENT\_USER\Software\Microsoft\Windows NT\CurrentVersion\CEPAL\Devices\Serial 下,存在使用以下架构将来宾 COM 端口映射到主机 COM 端口的配置条目。

KeyPath = HKEY\_CURRENT\_USER\Software\Microsoft\Windows NT\CurrentVersion\CEPAL\Devices\Serial\0

ValueName = Guest Type = REG\_SZ Value = COM1

ValueName = Host

Type = REG\_SZ

Value = \\?\Some\DeviceInterface\Path

KeyPath= HKEY\_CURRENT\_USER\Software\Microsoft\Windows NT\CurrentVersion\CEPAL\Devices\Serial\1

ValueName = Guest Type = REG\_SZ Value = COM2

ValueName= Host Type = REG\_SZ

Value = \\?\Some\Other\DeviceInterface\Path

如果启动 CE 时上述注册表路径不存在,则将根据系统上发现的串行设备写入默认配置。

主机中基于文件的配置

CE 容器可以使用主机 C:\WindowsCE\CEEnvConfig.json 上的本地文件进行配置。 下面是此配置文件的示例:

{
 "OEMOptions" :
    {
     "GUI" : true,
     "Width" : 1024,
     "Height" : 768, "FillScreen" : true, "ColorDepth" : 32,
     "RefreshRate" : 30, "noAslrSupport" : true, "OemConfigApp" : "",
     "OemConfigFile" : ""
    },
 "CEPALDevOptions" :
    {
     "VsDebugMode" : true, "FastDebugBoot" : false
    }
 }

OEMOptions

密钥 说明
GUI 通过 UI 启动 CE 应用容器(默认值为 true)
宽度 CE 应用容器显示器的宽度(默认值为 1024)
Height CE 应用容器显示器的高度(默认值为 768)
FillScreen
ColorDepth 设置每像素的默认位数(默认值为 32)
RefreshRate 显示器每秒重绘次数
noAslrSupport 禁用 CE 应用容器中的地址空间布局随机化(默认值为 true)
OEMConfigApp 由 OEM 提供的应启动以进行配置的应用的包系列名称。
OEMConfigFile 文件的路径,该文件包含在 OEMConfigApp 与 CE 应用容器之间共享的其他配置选项

CE 应用容器仅提供一个网络接口供使用。 如果主机系统中存在多个 NIC,则必须在主机注册表中选择一个接口,以确保所选 NIC 是确定的。

OEMConfigFile

C:\WindowsCE\CEEnvConfig.json 中指定 OEMConfigFile。 确保 UWP 应用程序可以读取此文件。 下面是一个示例:

{
   “FactoryReset”: false, “PlatformBuilderDebugMode”: false,
   “NetInterface”: “Some Network Profile Id”
}

选项:

密钥 说明
FactoryReset 配置应用使用它来通知 CE 应用容器转储永久性状态。
PlatformBuilderDebugMode 用于启动支持 KITL 的 CE 应用容器,以使用平台生成器进行调试。
NetInterface 根据配置文件名称为 CE 选择网络接口。

参考