Skip to content

nodejs-mobile 24.18.0-0

Choose a tag to compare

@github-actions github-actions released this 11 Aug 13:52
· 18 commits to recipe since this release
Immutable release. Only release title and notes can be modified.

2026-08-11, Version 24.18.0-0 (Current)

First release on the Node.js 24 line. The project moved from a rebased fork to a patches-only recipe — a pinned upstream tag plus a reviewable series of patches, reconstructed and verified byte-for-byte before every build. See PATCHES.md for the model.

Breaking changes

  • Engine: Node.js 18.20.4 → 24.18.0 (V8 13.6).
  • Android: minimum target SDK is now 24 (Android 7.0). Combined with the earlier v18-line floor, very old devices remain out of scope.
  • Versioning scheme changed. Releases are now <upstream-node-version>-<mobile-rev> (e.g. 24.18.0-2), tagged vX.Y.Z-R. process.version stays upstream's; the mobile revision is readable at runtime via process.versions.mobile.

Notable Changes

  • Project model: the mobile diff is now ~1.5 MB of reviewable patches and plain files instead of a long-lived rebased fork. The source tree is reconstructed from the recipe branch (upstream tag + mobile patches + fork-only files) and verified against a committed tree hash before every build.
  • Android:
    • Builds libnode.so for arm64-v8a, armeabi-v7a, and x86_64 with NDK r27d.
    • 16 KB memory-page size supported.
    • Dead-code stripping (--gc-sections), for a linker-level size reduction with no functional change.
    • Embedder-set environment variables now actually work. Because an Android app process inherits the zygote's auxiliary vector, upstream's SafeGetenv() privilege heuristic previously treated every app as setuid-privileged and silently dropped TMPDIR, NODE_OPTIONS, NODE_EXTRA_CA_CERTS, NODE_ICU_DATA, NODE_COMPILE_CACHE, OPENSSL_CONF, and NODE_PATH. Embedded (NODE_MOBILE) builds now skip that heuristic; os.tmpdir() honours TMPDIR, and NODE_OPTIONS works without command-line access to the runtime.
  • iOS:
    • Produces a NodeMobile.xcframework (arm64 device + arm64 simulator). V8 runs jitless.
    • WebAssembly is served by the polywasm JS polyfill.
    • Working fetch: fetch() now works on iOS, including TLS and HTTP/2 - Node fetch is built on undici, which relies on WASM, which requires JIT, which is not allowed on iOS. The polywasm JS polyfill is used instead. Performance is slower than native WASM.
    • Framework size cut ~38% (54.5 MB → 33.8 MB) by dropping V8's TurboFan and Maglev compiler tiers, the mksnapshot-only CSA builtin generators in libv8_initializers, and gtest from both flavors — iOS always runs jitless, so none of it ran at runtime.
  • Lite flavor: NODEJS_MOBILE_FLAVOR=lite builds a size-reduced binary for consumers that don't need the full feature set (drops ICU, inspector, sqlite, amaro TS stripping).
  • Metadata: process.versions now exposes a mobile key ("24.18.0-2", -pre-suffixed on non-release builds).
  • Build: tools/android_build.sh and tools/ios_framework_prepare.sh (Android cross-build runs on Linux only; iOS needs macOS/Xcode). See BUILDING.md.
  • Testing overhaul:
    • A curated test/parallel subset runs through a device proxy harness on an Android emulator and an iOS simulator, gating every PR.
    • A NAPI symbol smoke and a real crc-native N-API addon build+load gate.
    • Boot smokes on both platforms.
    • A real-device smoke on BrowserStack App Automate (Android arm64 Pixel 9 with 16 KB pages via Espresso; iPhone via XCUITest), covering boot plus the native addon dlopen.
    • A nightly full-device suite sweeps the remainder of test/parallel + test/sequential from upstream nodejs/node (~3,300 tests per platform).
    • See TESTING.md.
  • CI / release: new GitHub Actions workflows for the mobile build (both flavors), on-device tests, per-commit patch-stack validation, and guarded prepare-release / publish-release automation, including an optional human-approval gate before a release is tagged and published.
  • Docs: new EMBEDDING.md, describing the environment node inherits on each platform and what an embedder should set before starting the runtime.

Generated from recipe@a01faac8af.