Saltar al contenido principal

Windows en ARM

Si tu aplicación funciona con Electron 6.0.8 o posterior, ahora puedes construirla para Windows 10 en Arm. Esto aumenta considerablemente el rendimiento, pero necesitará recopilar cualquier módulo nativo usado en tu app. Podría requerir también pequeñas correcciones en tus scripts de construcción y empaquetado.

Ejecutando una aplicación básica

Si tu aplicación no utiliza ningún módulo nativo, entonces es muy fácil crear una versión de tu aplicación para Arm.

  1. Asegúrate de que el directorio node_modules de tu aplicación esté vacío.
  2. Usando el Símbolo del sistema, ejecuta el comando set npm_config_arch=arm64 antes de ejecutar el comando npm install/yarn install como de costumbre.
  3. Si tienes Electron instalado como una dependencia de desarrollo, npm descargará y descomprimirá la versión arm64. Luego puedes empaquetar y distribuir tu aplicación de manera normal.

Consideraciones generales

Código específico de arquitectura

Mucho del código específico de Windows contiene lógica if... else que selecciona entre arquitecturas x64 o x86.

if (process.arch === 'x64') {
// Do 64-bit thing...
} else {
// Do 32-bit thing...
}

Si deseas apuntar a arm64, la lógica como esta seleccionará la arquitectura incorrecta, por lo que debes verificar cuidadosamente tu aplicación y scripts de compilación para detectar condiciones como esta. En scripts personalizados de construcción y empaquetado, siempre debes comprobar el valor de npm_config_arch en el entorno, en lugar de depender de la arquitectura del proceso actual.

Módulos nativos

Si utiliza módulos nativos, debe asegurarse de que se compilen con la v142 del compilador MSVC (que se encuentra en Visual Studio 2017). Debes verificar también que cualquier archivo precompilado .dll o .lib proporcionado o referenciado por el módulo nativo esté disponible para Windows en Arm.

Probar tu app

Para probar tu aplicación, utiliza un dispositivo con Windows en Arm que ejecute Windows 10 (versión 1903 o posterior). Asegúrate de copiar tu aplicación en el dispositivo de destino, la protección de Chromium no funcionará correctamente cuando se carguen los recursos de tu aplicación desde una ubicación de red.

Prerrequisitos de desarrollo

Node.js/node-gyp

Se recomienda Node.js v12.9.0 o posterior. Si no se desea actualizar a una nueva versión de Node, se puede actualizar manualmente la copia de node-gyp de npm a la versión 5.0.2 o posterior, que contiene los cambios necesarios para compilar módulos nativos para Arm.

Visual Studio 2017

Visual Studio 2017 (cualquier edición) es requerido para la compilación cruzada de módulos nativos. Puedes descargar Visual Studio Community 2017 a través del programa Visual Studio Dev Essentials de Microsoft. Después de la instalación, puede agregar los componentes específicos de Arm ejecutando lo siguiente desde un Símbolo del sistema:

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

Creando un indicador de comando para la compilación cruzada

Establecer npm_config_arch=arm64 en el entorno crea los archivos .obj correctos para arm64, pero el Command Prompt de Desarrollador para VS 2017 estándar utilizará el enlazador x64. Para solucionar esto:

  1. Duplica el acceso directo x64_x86 Cross Tools Command Prompt for VS 2017 (por ejemplo, buscándolo en el menú de inicio, haciendo clic derecho, seleccionando Abrir ubicación de archivo, copiando y pegando) en un lugar conveniente.
  2. Right click the new shortcut and choose Properties.
  3. Change the Target field to read vcvarsamd64_arm64.bat at the end instead of vcvarsamd64_x86.bat.

If done successfully, the command prompt should print something similar to this on startup:

**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.15
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64_arm64'

If you want to develop your application directly on a Windows on Arm device, substitute vcvarsx86_arm64.bat in Target so that cross-compilation can happen with the device's x86 emulation.

Linking against the correct node.lib

By default, node-gyp unpacks Electron's node headers and downloads the x86 and x64 versions of node.lib into %APPDATA%\..\Local\node-gyp\Cache, but it does not download the arm64 version (a fix for this is in development.) Para solucionar esto:

  1. Download the arm64 node.lib from https://electronjs.org/headers/v6.0.9/win-arm64/node.lib
  2. Move it to %APPDATA%\..\Local\node-gyp\Cache\6.0.9\arm64\node.lib

Substitute 6.0.9 for the version you're using.

Cross-compiling native modules

After completing all of the above, open your cross-compilation command prompt and run set npm_config_arch=arm64. Then use npm install to build your project as normal. As with cross-compiling x86 modules, you may need to remove node_modules to force recompilation of native modules if they were previously compiled for another architecture.

Debugging native modules

Debugging native modules can be done with Visual Studio 2017 (running on your development machine) and corresponding Visual Studio Remote Debugger running on the target device. To debug:

  1. Launch your app .exe on the target device via the Command Prompt (passing --inspect-brk to pause it before any native modules are loaded).
  2. Launch Visual Studio 2017 on your development machine.
  3. Connect to the target device by selecting Debug > Attach to Process... and enter the device's IP address and the port number displayed by the Visual Studio Remote Debugger tool.
  4. Click Refresh and select the appropriate Electron process to attach.
  5. You may need to make sure that any symbols for native modules in your app are loaded correctly. To configure this, head to Debug > Options... in Visual Studio 2017, and add the folders containing your .pdb symbols under Debugging > Symbols.
  6. Once attached, set any appropriate breakpoints and resume JavaScript execution using Chrome's remote tools for Node.

Getting additional help

If you encounter a problem with this documentation, or if your app works when compiled for x86 but not for arm64, please file an issue with "Windows on Arm" in the title.