基于 Arm 的设备由于其高效节能、更长的电池寿命以及强大的处理能力,变得越来越受欢迎。加上 Windows on Arm 针对日益受欢迎的 AI 和机器学习工作负载优化的 NPU 支持,使这些设备更具吸引力。
本指南将介绍为运行在 Arm64 处理器上的设备添加支持的 Windows 应用程序的步骤。 指南还将介绍解决任何潜在问题或阻止程序(例如第三方依赖项或插件)的方法,这些问题可能会干扰创建基于 Arm64 的应用版本。
在基于 Arm 的设备上模拟 x86 或 x64 Windows 应用
Arm 版本的 Windows 10 包括仿真技术,使现有未修改的 x86 应用能够在 Arm 设备上运行。 Windows 11 扩展了模拟,以在 Arm 驱动的设备上运行未修改的 x64 Windows 应用。
虽然在 Arm 设备上模拟 x64 和 x86 的能力是向前迈出一大步,但本指南将帮助你添加 Arm 原生支持,以便你的应用可以利用本机性能提升和 Arm64 支持设备的独特品质,包括:
- 优化应用的能耗,以延长设备电池使用时间。
- 优化 CPU、GPU 和 NPU 的性能,以加速工作流,尤其是在使用 AI 时。
此外,需要将 内核驱动程序 编译为原生的 Arm64。 内核中不存在模拟。 这主要影响虚拟化方案。 有关需要直接访问内核模式中操作系统或硬件内部(而非用户模式)的设备驱动程序的应用程序,如果它们尚未更新以支持 Arm64 处理器,请参阅 使用 WDK 生成 Arm64 驱动程序。
注释
渐进式 Web 应用程序(PWA)将具备本地 Arm64 性能。
先决条件
如果要使用基于 Arm 的设备更新应用(本机编译 - 为正在运行的同一平台生成代码),可以使用:
Visual Studio 2022 v17.4 或更高版本。 这是 Visual Studio 第一个原生支持在基于 Arm 的处理器上构建和调试 Arm64 应用的全面可用版本。 Visual Studio 2022 17.4 和 Microsoft Visual C++ (MSVC) 本机 Arm64 版本相比以前的模拟版本性能显著提高。
(可选) LLVM (Clang) v12+ 或更高版本。 LLVM 12 添加了在 Arm64 上的 Windows 上托管的官方二进制版本,包括 Clang 编译器、LLD Linker 和编译器 rt 运行时库。
如果要更新 Windows 应用程序以支持在 Arm 上运行,并使用基于 x64 或 x86 的 Intel 设备(跨平台编译),可以使用:
- Visual Studio 2022 v17.10 (建议)
- Visual Studio 2019 v16.x
- Visual Studio 2017 v15.9 及更高版本(UWP、桌面桥、win32 C++)
- LLVM(Clang)v12+
在交叉编译或本机编译之间进行选择时,有几个因素需要考虑,例如可用的硬件和测试执行的简单性。
注释
GCC,GNU 编译器集合 预计在不久的将来提供支持。
添加 Arm64 本机支持的步骤
若要更新应用以在 Arm64 上本机运行:
- 在 Visual Studio 中向项目添加 Arm64 配置
- 测试和调试新生成的 Arm64 应用
- 在 Arm 设备上生成和测试应用
确认应用已成功针对 Arm 设备进行优化后:
步骤 1 - 在 Visual Studio 中向项目添加 Arm64 配置
若要将具有调试和发布目标的新 ARM64 解决方案平台添加到现有 x64 或 x86 应用项目,请执行以下操作:
- 在 Visual Studio 中打开解决方案(项目代码)(请参阅 受支持的版本的先决条件)。
- 在标准工具栏上的“解决方案平台”下拉菜单(或在“生成”菜单中),选择 Configuration Manager...
- 打开“活动解决方案平台”下拉菜单,然后选择 <新建...>。
- 在“键入或选择新平台”下拉菜单中,选择 ARM64,并确保“从中复制设置”的值设置为 x64,并且启用“创建新项目平台”复选框,然后选择 确定。
祝贺! 你已开始向应用添加 Arm 支持。 接下来,检查 Arm64 解决方案是否已成功生成。
如果解决方案未成功生成,则需要解决导致生成失败的问题。 最有可能的原因是,依赖项不适用于 ARM64,下面 故障排除 中介绍。
(可选):如果要首先验证应用二进制文件现在是否为 Arm64 生成,则可以在 PowerShell 中打开项目目录(在 Visual Studio 解决方案资源管理器中右键单击应用项目并选择 在终端中打开)。 更改目录,以便选择项目的新 bin\ARM64\Debug
或发布目录。 输入命令:dumpbin /headers .\<appname>.exe
(将 <appname>
替换为应用的名称)。 在终端的输出结果中向上滚动,找到 FILE HEADER VALUES
部分,并确认第一行 AA64 machine (ARM64)
。
步骤 2 - 测试和调试新生成的 Arm64 应用
要检查在 Visual Studio 项目中添加 Arm64 解决方案平台后,Arm64 解决方案平台是否成功生成:
- 关闭“活动解决方案平台”窗口。
- 将生成设置从 Debug 更改为 Release。
- 在“生成”下拉菜单中,选择 重新生成解决方案 并等待项目重新生成。
- 您将收到“全部重建成功”的结果。 如果没有,请参阅下面的 故障排除 部分。
为应用构建二进制文件以支持 Arm64 后,需要对其进行测试。 这需要拥有在 Arm 上运行 Windows 的设备或虚拟机。
如果在 Arm 设备上的 Windows 上进行开发,则可通过 Visual Studio 本地调试轻松进行设置。 如果交叉编译(使用未在 Arm 处理器上运行的设备),则需要在 Arm 设备上的 Windows 或虚拟机上使用远程调试,以便在另一台设备上运行 Arm64 应用时在 Visual Studio 中启用开发体验。
Arm 硬件或虚拟机上的 Windows 可用于测试
如果你正在寻找用于持续集成(CI)和测试的硬件,以下是一些基于 Arm64 的处理器的 Windows 设备:
有关设置 Arm 上运行 Windows 的虚拟机以支持持续集成(CI)和测试的帮助,请参阅 快速入门:在 Azure 门户中创建 Arm 上运行 Windows 的虚拟机。
阅读 Azure 博客公告,宣布 使用基于 Ampere Altra Arm 的处理器的 Azure 虚拟机 正式发布,并能够运行基于 Arm64 的 Windows 11 专业版和企业版。
详细了解 Windows 11 on Arm 预览版 (VHDX),以便使用 Hyper-V 和 Windows 预览体验计划 VHDX 创建本地 Windows on Arm 虚拟机。 *仅满足先决条件的设备支持 Arm64 VM。 x64 硬件不支持创建 Arm64 VM - 需要在云中托管 VM,请参阅上面的快速入门链接。
步骤 3 - 在 Arm 设备上生成和测试应用
添加测试自动化通行证对于持续集成和持续交付(CI/CD)策略非常重要。 对于在 Windows 上运行的 Arm64 解决方案,请务必在 Arm64 体系结构上运行测试套件 -- 这可能是 Arm 硬件上的实际 Windows,使用上面列出的 Arm 设备之一或上面列出的 VM 中的虚拟机。
将应用程序的编译与测试在同一台计算机上进行比较方便,但在许多情况下并非必需。 相反,你可以考虑扩展现有的生成基础结构,以便为 Arm64 生成交叉编译的输出。
步骤 4 - 更新安装程序并发布更新的应用
如果发布到 Microsoft 应用商店,请按照上述步骤生成应用的 Arm64 版本后,可以通过访问 合作伙伴中心仪表板 并将新生成的 ARM64 二进制文件添加到提交来更新 Microsoft 应用商店中的现有应用包。
如果你的应用尚未在 Microsoft 应用商店中发布,则可以按照说明 根据是要提交 MSI 还是 EXE、MSIX 包、PWA 或应用加载项创建应用提交。
如果生成自己的安装程序,应确保它能够成功安装新的 Arm64 版本。 大多数安装程序框架(如 WiX、Squirrel、InnoSetup、InstallAware等)都支持 Arm 上的 Windows,而没有问题。
如果您通过网页提供应用的安装程序,可以使用 User-Agent 客户端提示 来检测客户何时是通过搭载 Arm 架构的 Windows 设备访问的,并为他们提供更新的 Arm 原生版本应用。 与用户代理字符串不同,User-Agent 客户端提示允许你将 Arm 上的客户与 x86 设备上的客户区分开来。
步骤 5 - 规划正在进行的更新
既然您已经发布了应用的 Arm64 版本,您需要确保它像应用的其他版本一样保持更新。 最好使各个体系结构中的版本和功能保持一致,以避免将来客户混淆。
故障排除
可能会干扰或阻止你添加现有 x64 或 x86 Windows 应用的 Arm64 版本的常见问题包括:
由于未为 ARM64 编译的依赖项,导致无法成功构建
如果由于依赖项(无论是内部版本、第三方还是开源库)而无法生成,则需要找到一种方法来更新该依赖项以支持 ARM64 体系结构或删除它。
对于内部依赖项,我们建议为 ARM64 支持重新生成依赖项。
对于第三方依赖项,我们建议提交一个请求,要求维护人员使用 ARM64 支持重新生成。
对于开源依赖项,请考虑检查 vcpkg,以查看是否存在包含 ARM64 支持的较新版本的依赖项,你可以更新到该依赖项。 如果没有更新,建议您考虑亲自为该软件包添加 ARM64 支持。 许多开源维护人员将感谢贡献。
Linaro 组织还与企业和开源社区合作,开发基于 Arm 的技术的软件。 你可以 向 Linaro 服务台提交请求,以协助更新与 ARM 上 Windows 相关的任何缺失依赖项的包支持。
请考虑使用 Arm64EC。 Arm64EC 版本的依赖项可用于重新生成应用程序,同时仍使用 x64 版本的依赖项。 Arm64EC 进程中的任何 x64 代码(包括依赖项的代码)都将在应用中的模拟下运行。 (在这种情况下,无法使用 Arm64 版本的依赖项。
最后一个选项是删除和/或替换对应用项目的依赖项。
为 Arm64 以外的特定体系结构编写代码
- 需要修改特定于 CPU 的程序集或内联内在函数调用,以匹配 Arm CPU 上的可用指令和函数。 有关指导,请参阅:在 C 或 C++ 代码中使用汇编和内嵌函数。
应用依赖于内核驱动程序
内核驱动程序 需要生成为原生 Arm64。 内核中不存在模拟。 这主要影响虚拟化方案。 有关需要直接访问内核模式中操作系统或硬件内部(而非用户模式)的设备驱动程序的应用程序,如果它们尚未更新以支持 Arm64 处理器,请参阅 使用 WDK 生成 Arm64 驱动程序。
此外,Windows 上的驱动程序需要编译为 Arm64,并且无法进行仿真。 有关依赖于尚未更新以支持 Arm64 处理器的软件驱动程序的应用,请参阅 使用 WDK生成 Arm64 驱动程序。
Arm 上的 Windows 工具链
除了本指南 先决条件 部分中提到的对 Visual Studio 和 LLVM(CLANG)的支持,Arm64 还支持以下工具和框架:
- .NET 7
- .NET 6 (LTS)
- .NET 5.0.8+
- .NET Framework 4.8.1
- clang-cl 编译用于 Windows 的 C++ 代码,可以无缝替代 MSVC 编译器和链接器。 它仍然使用 MSVC 的标头和库,并与 MSVC 的 ABI 兼容。
以及第三方框架,包括:
- Qt for Windows,Boost C++ 库,Bazel,开源生成和测试工具。
- 在 Linaro,对适用于 Arm 上的 Windows 的 GCC 和 Mingw/GNU 工具链的支持
正在进行中。 - 有关更完整的列表,请参阅 Windows On Arm (WOA) - Confluence (atlassian.net)。
需要帮助? 充分利用我们的 App Assure 服务
应用保证 Arm 咨询服务可用于帮助开发人员构建 Arm 优化的应用。 这项服务是对我们现有承诺的补充:你的应用将在基于 Arm 的 Windows 上运行,如果遇到任何问题,Microsoft 将帮助你修正它们。 了解详细信息。