基于 Arm 的设备正变得越来越受欢迎,因为他们的节电性质、更长的电池寿命和令人印象深刻的处理能力。 Arm 上的 Windows 支持针对日益流行的 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 应用
若要在将 Arm64 解决方案平台添加到 Visual Studio 中的项目后,检查 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 Store 中的现有应用包。
如果尚未在 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有助于修正它们。 了解详细信息。