实验 1b:将应用添加到映像

我们现在将采用应用(如 IoT 核心版默认应用),将其打包,并创建一个新的 Windows IoT 核心版映像,你可以将其加载到你的设备上。

注意

此过程对于后台和前台应用是相同的。 唯一需要注意的区别是,只能选择一个前台应用作为启动应用,而所有其他已安装的应用都将作为后台应用运行。

先决条件/要求

注意

当你阅读本制造指南时,ProjectA 将开始类似于 C:\IoT-ADK-AddonKit\Source-arm\Products\SampleA 中的 SampleA 映像。

我们将使用我们在实验 1a:创建基本映像中创建的 ProjectA 映像。

要完成此部分,还需要以下工具:

  • Visual Studio
  • Windows 评估和部署工具包 (Windows ADK)
  • Windows IoT 核心版包
  • IoT 核心版 ADK 加载项
  • IoT 核心版 Powershell 环境
  • 文本编辑器,比如记事本或 VS Code

支持的应用程序类型

通用 Windows 平台 (UWP) 应用

IoT 核心版是以 UWP 为中心的操作系统,UWP 应用是其主要的应用类型。

通用 Windows 平台 (UWP) 是面向 Windows 10 所有版本的通用应用平台,包括 Windows 10 IoT 核心版。 UWP 演变自 Windows 运行时 (WinRT)。 要了解更多信息及 UWP 的概览,请点击此处

传统 UWP 应用

UWP 应用仅会在 IoT 核心版上运行,与其在其他 Windows 10 版本中别无二致。 在 Visual Studio 中,系统会将简单的空白 Xaml 应用恰如其分地部署到 IoT 核心版设备,与在手机或 Windows 10 PC 上的做法别无二致。 IoT 核心版完全支持所有标准 UWP 语言和项目模板。

为支持 IoT 方案,我们在传统 UWP 应用模型中添加了一些内容,任何利用这些方案的 UWP 应用都需要将相应信息添加到其清单中。 特别是,需要将“iot”命名空间添加到这些标准 UWP 应用的清单中。

在清单的属性中,需要定义 iot xmlns,并将其添加到 IgnorableNamespaces 列表中。 最终的 xml 应如下所示:

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
  IgnorableNamespaces="uap mp iot">

后台应用

除了传统的 UI 应用外,IoT 核心版还添加了一个名为“后台应用程序”的新 UWP 应用类型。 这些应用程序不具有 UI 组件,而是具有能够实现“IBackgroundTask”接口的类。 然后其会将该类注册为“StartupTask”以在系统启动时运行。 由于这类应用仍是 UWP 应用,因此可以访问同一组 API 并由同一语言提供支持。 唯一的区别是其中没有 UI 入口点。

每种类型的 IBackgroundTask 均会获取其自己的资源策略。 此类做法通常会受到限制,用以改进设备上的电池寿命和计算机资源,在这些设备上,这些后台应用是前台 UI 应用的辅助组件。 在 IoT 设备上,后台应用通常是设备的主要功能,因此这些 StartupTask 会获取在其他设备上镜像前台 UI 应用的资源策略。

可以在 MSDN 中深入了解有关后台应用的详细信息。

非 UWP (Win32) 应用

IoT 核心版支持某些传统的 Win32 应用类型,如 Win32 控制台应用和 NT 服务。 这些应用的构建与运行方式与 Windows 10 桌面端别无二致。 此外,还提供了由 C++ 语言编写而成的 IoT 核心版控制台项目模板,有助于使用 Visual Studio 轻松构建此类应用。

对于这些非 UWP 应用,存在两个主要限制:

  1. 不提供旧版 Win32 UI 支持:IoT 核心版不包含用于创建经典 (HWND) Windows 的 API。 CreateWindow() 和 CreateWindowEx() 等传统方法或处理 Windows 句柄 (HWND) 的任何其他方法均不可用。 此外,IoT 核心版不支持依赖此类 API 的框架,包括 MFC、Windows Forms 和 WPF。
  2. 仅限 C++ 应用:目前仅支持 C++ 在 IoT 核心版上开发 Win32 应用。

应用服务

应用服务是可向其他 UWP 应用提供服务的 UWP 应用。 它们与设备上的 Web 服务类似。 应用服务作为后台任务在主机应用中运行,并可向其他应用提供其服务。 例如,应用服务可能会提供其他应用可能使用的条形码扫描仪服务。 应用服务允许你创建应用可在同一设备上调用的无 UI 服务,从 Windows 10 版本 1607 开始,应用可在远程设备上调用这些服务。 从 Windows 10 版本 1607 开始,可以创建在与主机应用相同的进程中运行的应用服务。

要了解有关创建后台应用服务以及从 uwp 应用使用服务(以及后台任务/服务)的详细信息,请点击此处

使用服务、扩展和包扩展你的应用

Windows 10 提供了许多用于扩展和组件化应用的技术。 此表可帮助你根据需求确定使用哪种技术。 后面是方案和技术的简要说明。

方案 资源包 资产包 可选包 平面捆绑包 应用扩展 应用服务 流式安装
第三方代码插件 ✔️
进程内代码插件 ✔️
UX 资产(字符串/映像) ✔️ ✔️ ✔️ ✔️ ✔️
按需内容
(例如其他级别)
✔️ ✔️ ✔️
单独许可和购买 ✔️ ✔️ ✔️
应用内购买 ✔️ ✔️
优化安装时间 ✔️ ✔️ ✔️ ✔️
减少磁盘占用空间 ✔️ ✔️
优化打包 ✔️ ✔️ ✔️
缩短发布时间 ✔️ ✔️ ✔️ ✔️

创建 appx 包

第一步是创建一个将在 IoT 设备上运行的通用 Windows 平台 (UWP) 应用程序。 如果你已经创建并测试过你的 UWP 应用程序,则可以跳过此部分

  1. 创建一个 UWP 应用。 这可以是为 IoT 核心版设计的任何应用,保存为 Appx 包。 对于我们的示例,我们使用 IoT 核心版默认应用。

  2. 在 Visual Studio 中,将你的应用程序另存为 Appx 包。 为此,请单击“项目>存储>”“创建应用包>”“我想创建用于旁加载的>包”“下一步

  3. 选择“输出位置”为 C:\DefaultApp(或任何其他不包含空格的路径。)

  4. 选择“生成应用包:”从不

  5. 单击 “创建”

应用包窗口的屏幕快照

Visual Studio 在所选体系结构 () 指定位置创建 Appx 文件, (Arm、x86、x64) 。 在我们的示例中,此文件为:C:\DefaultApp\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test

  1. 可选:测试应用。 请注意,你可能已经测试了应用作为生成项目的一部分。

打包 Appx

下一步是打包 Appx 服务应用文件,这将允许你使用 Windows ADK 来自定义和生成此文件(在你生成 FFU 映像时)。

  1. 打开 IoTCorePShell.cmd。 系统应该提示你以管理员身份运行。

  2. 使用 New-IoTAppxPackage 为你的 Appx 创建包。 将文件路径位置和包名称替换为你的 Appx 包。 在我们的示例中,命令如下:

    Add-IoTAppxPackage "C:\DefaultApp\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test.appx" fga Appx.MyUWPApp
    
    (or) newappxpkg "C:\DefaultApp\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test\IoTCoreDefaultApp_1.2.0.0_ARM_Debug_Test.appx" fga Appx.MyUWPApp
    

    注意

    fga 参数表示 Appx 文件是前台应用程序。 如果你将你的包指定为后台应用程序(使用 bga 参数)并且在映像中没有其他前台应用程序,则系统在启动时会卡住(无限期地显示旋转图标)。

    这将在 C:\MyWorkspace\Source-<arch>\Packages\Appx.MyUWPApp 中创建一个新文件夹,复制 appx 文件及其依赖项,并生成一个 customizations.xml 文件以及用于生成包的 package xml 文件。

    请注意,如果你的 Appx 具有依赖项,则在运行此命令时,你将需要 Dependencies 子目录与你的 Appx 放在同一位置。 否则,在你生成 FFU 映像时,将导致错误。

    这还会将 FeatureID APPX_MYUWPAPP 添加到 C:\MyWorkspace\Source-<arch>\Packages\OEMFM.xml 文件中。

  3. 在 IoT 核心版 Shell 环境中,现在可以使用 New-IoTCabPackage 将包生成到 .CAB 文件中。

    New-IoTCabPackage Appx.MyUWPApp
    (or) buildpkg Appx.MyUWPApp
    

    这会将包生成到 C:\MyWorkspace\Build\<arch>\pkgs\<oemname>.Appx.MyUWPApp.cab 下面的 .CAB 文件中。

更新项目的配置文件

你现在可以更新你的项目配置文件以将你的应用包含在 FFU 映像生成中。

  1. 使用 Add-IoTProductFeature 为我们的应用包添加 FeatureID:

    Add-IoTProductFeature ProductA Test APPX_MYUWPAPP -OEM
    (or) addfid ProductA Test APPX_MYUWPAPP -OEM
    

    这会将名为 APPX_HELLOWOLRDAPP 的 FeatureID 添加到指定产品的 Test OEMInput XML 文件(C:\IoT\Workspaces\ContosoWS\Source-arm\<product name>\TestOEMInput.xml 文件)。

  2. 使用 Remove-IoTProductFeature 删除样本测试应用 IOT_BERTHA

    Remove-IoTProductFeature ProductA Test IOT_BERTHA
    (or) removefid ProductA Test IOT_BERTHA
    

生成和测试映像

在 IoT 核心版 PowerShell 环境中,通过在工作文件夹中构建所有包(使用 New-IoTCabPackage),让你的环境准备好创建产品:

New-IoTCabPackage All
(or) buildpkg all

再次生成 FFU映像,如实验 1a:创建基本映像中所述。 可使用以下命令:

New-IoTFFUImage ProductX Test
(or)buildimage ProductX Test 

生成 FFU 文件 (它现在应包含应用) 后,可以按照 实验室 1a 中的说明将其刷写到硬件设备。

若要了解如何在 IoT 设备上安装 appx 文件,请参阅安装应用文档了解详细信息。

更新 IoT Core 设备上的应用

后续步骤

实验 1c:将文件和注册表设置添加到映像