The plugin's own source is licensed under the Mozilla Public License 2.0. Third-party components retain their own copyright notices and licenses. The README license badge refers to the plugin source license.
The plugin builds libnode.so from official Node.js 24.21.0, source commit 955266bfdd854cd280dffd47548673914484e4c0, with the Android patches described in runtime-build/README.md. The Android port patch is derived from degaso/nodejs-mobile commit 116bad1dc919702d4a701d49df26d960403ee4a4; a separate local patch supplies Linux host trap-handler sources for the cross-build tools. A third Android-only patch disables OpenSSL STORE key URLs after a device regression demonstrated that the new loader bypassed the existing filesystem policy; callers can pass key bytes read through node:fs instead. The complete official Node.js LICENSE is preserved in nodejs-mobile-LICENSE.txt and bundled in every APK under assets/licenses/. The existing asset filename is retained.
The following table summarizes major components. The bundled license file contains the full terms and notices, including the additional third-party components listed by upstream; this table does not replace them.
| Component | License |
|---|---|
| Node.js | MIT |
| V8 | BSD-style; additional third-party notices in the upstream license |
ICU 78 (linked since 1.5.1 as small-icu, English-only locale data) |
Unicode/ICU licenses and third-party data notices retained in the complete upstream license |
| OpenSSL | Apache License 2.0 |
| zlib | zlib license |
| libuv | MIT and incorporated third-party notices |
| c-ares | MIT-style |
| nghttp2 / nghttp3 / ngtcp2 | MIT |
| simdjson / simdutf | Apache License 2.0 / MIT |
| llhttp / undici / ada / uvwasi | MIT / MIT / Apache License 2.0 or MIT / MIT |
| Brotli / Zstandard | MIT / BSD and GPL alternatives as described upstream |
Binary provenance is recorded in runtime-build.lock.json, including the official node-v24.21.0.tar.xz archive (SHA-256 a6f54defb6fd7c84f41dba13d61e78e9b4e0961712cf61f29715c05f5ced94fc), the three patch hashes, and the exact Docker image and NDK used. The original Node 24.5 Android archive is retained in the lock as historical provenance and for reconstruction of that version.
| ABI | libnode.so SHA-256 |
|---|---|
| arm64-v8a | c48da9b772635e8e76ce0a06de09e71dbd70efe602903f1f5c9042672e629b2d |
| armeabi-v7a | 8e9f6c326ac3fdaac114cc37323e2d12dba96894fb306423c1426c1a7cd8c99d |
| x86_64 | ef576b2958de84b6cd641c18f684f42d00f4e97da09c4be3ebfb8bff4dd722b5 |
The 24.21.0 bridge headers come from the official Node.js header archive, with its complete upstream license preserved alongside them. All three runtime libraries are built from the same official source and patch set; since 1.5.1 they link ICU 78 as small-icu (English-only locale data) and retain the Inspector backend for explicit Debug use.
libc++_shared.so is supplied by the Android NDK selected by the Android Gradle Plugin. The runtime and bridge builds use NDK 28.2.13676358 (r28c). LLVM/libc++ uses Apache License 2.0 with LLVM exceptions and includes additional upstream notices. The installed NDK's toolchains/llvm/prebuilt/windows-x86_64/NOTICE is preserved in android-ndk-llvm-NOTICE.txt and bundled in every APK. This complete toolchain notice includes components beyond the shared C++ runtime; inclusion does not imply every toolchain component ships in the APK.
Kotlin standard library and JetBrains annotations use Apache License 2.0. AndroidX components use Apache License 2.0. The common plugin API is the AutoJs6 common-plugin-api.aar, whose source is maintained in the AutoJs6 repository under that project's MPL 2.0 license. The Node plugin API is maintained in this repository. npm ecosystem fixtures and their individual license files are Android test assets, not application runtime dependencies.
ELF segment alignment, APK ZIP alignment and execution on a device with 16 KB pages are separate checks. This plugin uses jniLibs.useLegacyPackaging = true, so native libraries are compressed in the APK and extracted on installation. Direct memory mapping of uncompressed ZIP entries does not apply; ELF alignment still matters after extraction. Release APKs must nevertheless pass zipalign -c -P 16 -v 4 for their actual entries.
Use the selected NDK's llvm-readelf -lW <library.so> for each ABI's libnode.so, libautojs6-node.so and libc++_shared.so, and inspect every LOAD segment's alignment. Runtime validation must first confirm adb -s <serial> shell getconf PAGE_SIZE returns 16384, and check KernelPageSize/MMUPageSize in /proc/self/smaps to distinguish native 16 KB pages from userspace simulation, then run SimpleRunSmokeTest and NpmEcosystemSmokeTest. Current source-runtime validation is recorded in Roadmap M17.1/M17.2/M17.2a; the historical Node 24.5 checks below are from M11.6; ELF checks alone do not establish coverage of all 16 KB devices.
On 2026-09-08 the Node 24.5 Debug build was checked with NDK r28c llvm-readelf -lW:
| ABI | libnode.so | libautojs6-node.so | libc++_shared.so |
|---|---|---|---|
| arm64-v8a | 0x4000 | 0x4000 | 0x4000 |
| x86_64 | 0x4000 | 0x4000 | 0x4000 |
| armeabi-v7a | 0x4000 | 0x1000 | 0x1000 |
This corrects the earlier Roadmap assumption that every library across all three ABIs had 0x4000 alignment. The Android 16 KB guidance identifies arm64-v8a and x86_64 as the ABIs to check for 16 KB alignment. The 32-bit artifacts are retained with their actual values, without a 16 KB support claim.
The API 36 x86_64 AVD reported PAGE_SIZE=16384 and passed 25/25 instrumentation cases, including SimpleRunSmokeTest, the 15-package NpmEcosystemSmokeTest and all 11 conformance cases. A Xiaomi 23046RP50C on API 35 reported PAGE_SIZE=4096 and passed the same 25/25 cases. These results establish tested x86_64 userspace 16 KB behavior and arm64 4 KB behavior; arm64 execution on a 16 KB device had not been tested at that point.
The signed Release APKs (versionCode 105) were subsequently checked with apksigner verify --verbose and zipalign -c -P 16 -v 4, all four passing. The extracted Release ELF libraries have the same alignment values shown above, and all native ZIP entries are compressed. The arm64 APK on the Xiaomi device, armeabi-v7a APK on a Sony G8441 (API 28), x86_64 APK on the 16 KB AVD, and universal APK on the Xiaomi device each passed SimpleRunSmokeTest, NpmEcosystemSmokeTest, PluginInfoContractTest and PluginManifestContractTest: 16/16 Release cases in total. Both complete notice files were also verified byte-for-byte inside every Release APK.
On 2026-09-09 the Node 24.21 source runtime and both Debug/Release bridges were checked again: all nine native libraries have the same alignment matrix above. The three physical devices (Xiaomi API 35, Sony XQ-AT72 API 31 and Sony G8441 API 28) and the API 36 x86_64 AVD passed the 52-case Debug and Release suites; the API 28 reports each include one existing SDK requirement skip. Each also passed the separate Debug Inspector and cold-start tests. The final four signed v1.3.0 / versionCode 145 APKs passed signature, ZIP alignment, native payload, license and metadata checks, then each passed the four Release installation checks listed above, for 16/16 final cases with no skips.
The x86_64 AVD reports getconf PAGE_SIZE=16384 but
/proc/self/smaps reports KernelPageSize: 4 kB. This is the Android x86_64
16 KB userspace simulation on a 4 KB kernel, as described by the
AOSP page-size test helpers.
It does not establish coverage on a physical arm64 device with a 16 KB kernel;
that environment remained untested in the 2026-09-09 run. The temporary AVD was
closed after testing.
On 2026-09-10 the current 1.4.0 development build completed validation on a
physical Samsung SM-A566B, Android 16 / API 36, arm64-v8a, through the
user-provided RDB connection. getconf PAGE_SIZE=16384 and both shell and actual
Node worker native-library mappings reported KernelPageSize: 16 kB and
MMUPageSize: 16 kB. Debug build152 passed 53 regular cases plus separate
Inspector and cold-start cases; paired, minified Release build153 passed the
same 53 regular cases. Host media/image integration passed 9 cases with each
Node build, including 1080p RGBA Buffer transfers over JNI and file transports.
The universal Release APK passed four installation/runtime/contract cases on
the same device. These final groups total 130 passing cases with no skips.
Initial host integration had three dependency-configuration failures: OpenCV
was absent and MediaInfo 2.0 did not advertise snapshot v2. Installing OpenCV
1.1.0 and the existing MediaInfo 2.1.0 development APK resolved these failures;
the first run remains recorded. All four collected Release APKs passed signature
and ZIP-alignment checks; every LOAD in the arm64 Debug/Release Node, bridge and
C++ runtime libraries has 0x4000 alignment. This adds native arm64 16 KB
execution evidence for the tested device and artifacts. Details, APK hashes,
scope and remaining manual acceptance are in the
Samsung acceptance record.