parcel-bundler/parcel · critical · Error

Unsupported architecture on Android ${arch}

Error message

Unsupported architecture on Android ${arch}

What it means

Thrown by the native-binding loader in @parcel/rust when running on the Android platform with a CPU architecture that has no prebuilt .node binary. The loader enumerates platform/arch combinations and falls into the default branch only for unrecognized Android arches, so a supported list (android-arm-eabi, android-arm64, android-x64) is known but the current arch matched none.

Source

Thrown at packages/core/rust/index.js:66

          loadError = e;
        }
        break;
      case 'arm':
        localFileExisted = existsSync(
          join(__dirname, 'parcel-node-bindings.android-arm-eabi.node'),
        );
        try {
          if (localFileExisted) {
            nativeBinding = require('./parcel-node-bindings.android-arm-eabi.node');
          } else {
            nativeBinding = require('@parcel/rust-android-arm-eabi');
          }
        } catch (e) {
          loadError = e;
        }
        break;
      default:
        throw new Error(`Unsupported architecture on Android ${arch}`);
    }
    break;
  case 'win32':
    switch (arch) {
      case 'x64':
        localFileExisted = existsSync(
          join(__dirname, 'parcel-node-bindings.win32-x64-msvc.node'),
        );
        try {
          if (localFileExisted) {
            nativeBinding = require('./parcel-node-bindings.win32-x64-msvc.node');
          } else {
            nativeBinding = require('@parcel/rust-win32-x64-msvc');
          }
        } catch (e) {
          loadError = e;
        }
        break;

View on GitHub (pinned to 59484858a1)

Solutions

  1. Run Parcel on a supported Android arch (arm64, arm-eabi, or x64) — check `node -p "process.arch"`.
  2. Move the build to a desktop OS (linux/darwin/win32) where full prebuilt coverage exists.
  3. Build the native binding from source for your arch via the @parcel/rust-<platform-arch> package if available.
  4. If arch is misreported, set the environment so Node detects the correct architecture.

Example fix

// before: process.arch === 'x86' on android
// default -> throw `Unsupported architecture on Android x86`

// after: run on a supported arch
node -p process.arch // 'arm64'
Defensive patterns

Strategy: validation

Validate before calling

import { platform, arch } from 'process';
const ANDROID_SUPPORTED = new Set(['arm', 'arm64', 'x64']);
if (platform === 'android' && !ANDROID_SUPPORTED.has(arch)) {
  throw new Error(`Unsupported Android arch ${arch}; use arm64/arm/x64 or run on linux/darwin.`);
}

Type guard

const SUPPORTED_ANDROID_ARCH = ['arm','arm64','x64'];
function isSupportedAndroidArch(a: string): boolean {
  return SUPPORTED_ANDROID_ARCH.includes(a);
}

Prevention

When it happens

Trigger: Executing Parcel's Rust bindings on Android under an architecture other than arm-eabi/arm64/x64 (e.g. android-x86, android-riscv64), or where os.arch() reports an unexpected identifier.

Common situations: Cross-compiling or running Parcel inside Termux/an Android container on uncommon hardware; running under an emulation layer that misreports the architecture string; using a Node build that returns a non-standard arch name.

Related errors


AI-assisted analysis of parcel-bundler/parcel@59484858a1 (2026-08-13). Data as JSON: /api/errors/da3fbfb3a5d8ad40. Report an issue: GitHub.