ARM 上的 Windows
如果你的应用程序使用 Electron 6.0.8 或更高版本运行,你现在可以为 Arm 上的 Windows 10 构建它。这极大地提高了性能,但需要重新编译应用程序中使用的任何原生模块。它也可能需要对你的构建和打包脚本进行一些小修改。
运行基本应用程序
如果你的应用程序不使用任何原生模块,那么创建应用程序的 Arm 版本非常容易。
- 确保应用程序的
node_modules
目录为空。 - 使用 命令提示符,在运行
npm install
/yarn install
之前运行set npm_config_arch=arm64
。 - 如果你将 Electron 安装为开发依赖项,npm 将下载并解压缩 arm64 版本。然后,你可以像往常一样打包和分发应用程序。
一般注意事项
特定于架构的代码
许多特定于 Windows 的代码包含 if... else 逻辑,用于在 x64 或 x86 架构之间进行选择。
if (process.arch === 'x64') {
// Do 64-bit thing...
} else {
// Do 32-bit thing...
}
如果你想以 arm64 为目标,这样的逻辑通常会选择错误的架构,因此仔细检查你的应用程序和构建脚本中是否存在这样的条件。在自定义构建和打包脚本中,你应该始终检查环境中 npm_config_arch
的值,而不是依赖于当前进程架构。
原生模块
如果你使用原生模块,你必须确保它们针对 MSVC 编译器的 v142 版本(在 Visual Studio 2017 中提供)进行编译。你还必须检查原生模块提供的或引用的任何预构建的 .dll
或 .lib
文件是否可用于 Arm 上的 Windows。
测试应用程序
要测试应用程序,请使用运行 Windows 10(版本 1903 或更高版本)的 Arm 上的 Windows 设备。确保将应用程序复制到目标设备 - Chromium 的沙箱在从网络位置加载应用程序资产时将无法正常工作。
开发先决条件
Node.js/node-gyp
建议使用 Node.js v12.9.0 或更高版本。 如果更新到新版本的 Node 不切实际,你可以改为 手动更新 npm 的 node-gyp 版本 到 5.0.2 或更高版本,其中包含针对 Arm 编译原生模块所需的更改。
Visual Studio 2017
Visual Studio 2017(任何版本)是交叉编译原生模块所必需的。你可以通过微软的 Visual Studio Dev Essentials 计划 下载 Visual Studio Community 2017。安装后,你可以通过从 命令提示符 运行以下命令来添加特定于 Arm 的组件。
vs_installer.exe ^
--add Microsoft.VisualStudio.Workload.NativeDesktop ^
--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
--add Microsoft.VisualStudio.Component.VC.Tools.ARM64 ^
--add Microsoft.VisualStudio.Component.VC.MFC.ARM64 ^
--includeRecommended
创建交叉编译命令提示符
在环境中设置 npm_config_arch=arm64
会创建正确的 arm64 .obj
文件,但标准的 VS 2017 开发人员命令提示符 将使用 x64 链接器。要解决此问题
- 复制 VS 2017 的 x64_x86 交叉工具命令提示符 快捷方式(例如,通过在开始菜单中找到它,右键单击,选择 打开文件位置,复制和粘贴)到某个方便的位置。
- 右键单击新的快捷方式,然后选择 属性。
- 将 目标 字段更改为在末尾读取
vcvarsamd64_arm64.bat
而不是vcvarsamd64_x86.bat
。
如果操作成功,命令提示符应在启动时打印类似于以下内容的信息
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.15
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64_arm64'
如果你想直接在 Arm 上的 Windows 设备上开发应用程序,请在 目标 中替换 vcvarsx86_arm64.bat
,以便可以使用设备的 x86 模拟进行交叉编译。
针对正确的 node.lib
进行链接
默认情况下,node-gyp
会解压缩 Electron 的 node 头文件并将 x86 和 x64 版本的 node.lib
下载到 %APPDATA%\..\Local\node-gyp\Cache
中,但不会下载 arm64 版本(对此的修复正在开发中)。要解决此问题
- 从 https://www.electron.js.cn/headers/v6.0.9/win-arm64/node.lib 下载 arm64
node.lib
- 将其移动到
%APPDATA%\..\Local\node-gyp\Cache\6.0.9\arm64\node.lib
将 6.0.9
替换为你使用的版本。
交叉编译原生模块
完成上述所有操作后,打开交叉编译命令提示符并运行 set npm_config_arch=arm64
。然后使用 npm install
像往常一样构建项目。与交叉编译 x86 模块一样,如果原生模块之前已为其他架构编译,你可能需要删除 node_modules
以强制重新编译原生模块。
调试原生模块
可以使用 Visual Studio 2017(运行在你的开发机器上)和相应的 Visual Studio 远程调试器(运行在目标设备上)来调试原生模块。要调试
- 通过 命令提示符 在目标设备上启动应用程序
.exe
(将--inspect-brk
传递给它,以便在加载任何原生模块之前暂停它)。 - 在你的开发机器上启动 Visual Studio 2017。
- 通过选择 调试 > 附加到进程... 并输入设备的 IP 地址以及 Visual Studio 远程调试器工具显示的端口号,连接到目标设备。
- 单击 刷新 并选择 要附加的适当 Electron 进程。
- 你可能需要确保应用程序中任何原生模块的符号都已正确加载。要配置此项,请在 Visual Studio 2017 中转到 调试 > 选项...,并在 调试 > 符号 下添加包含
.pdb
符号的文件夹。 - 附加后,设置任何适当的断点,然后使用 Chrome 的 Node 远程工具 恢复 JavaScript 执行。
获取更多帮助
如果你在使用本文档时遇到问题,或者你的应用程序在针对 x86 编译时有效,但在针对 arm64 编译时无效,请在标题中包含“ARM 上的 Windows”并在 提交问题。