[RNE Rewrite] feat: on-demand native lib download and backend splitting#1283
Open
msluszniak wants to merge 6 commits into
Open
[RNE Rewrite] feat: on-demand native lib download and backend splitting#1283msluszniak wants to merge 6 commits into
msluszniak wants to merge 6 commits into
Conversation
Port PR #1039's on-demand native-lib mechanism into the rewrite. Apps opt in via a `react-native-executorch` block (`backends`/`libs`/`features`) in their package.json; the postinstall `scripts/download-libs.js` expands `features` via the full forward-looking FEATURE_MAP, writes `rne-build-config.json`, and downloads only the requested per-backend artifacts from GitHub Releases into third-party/. The podspec and android/build.gradle.kts read that config to gate `RNE_ENABLE_*` and link backends as separate libs (Xnnpack/CoreML/MLX xcframeworks, lib*_executorch_backend.so) — MLX device-slice only. Adapted to the rewrite: cpp/ layout (opencv gated as an extensible source list, guarded in RnExecutorch.cpp), Kotlin-DSL gradle config read, single android/CMakeLists.txt. scripts + FEATURE_MAP + artifact contract kept identical to #1039 so future rewrite work is code-only. CI (TS-only) skips the download via RNET_SKIP_DOWNLOAD in the setup action. Verified: config expansion, download/extract/checksum (local server), and CI gates (lint, bob build, typecheck). Release artifacts (executorch fork build) + committed headers/jar/ExecutorchLib wrapper are provisioned separately.
94f8547 to
ab793e1
Compare
Rebased onto rne-rewrite incl. #1280 keypoint detection. Rename the poseEstimation FEATURE_MAP entry to keypointDetection (tracks the useKeypointDetector hook) and set backends to xnnpack+coreml+mlx (RF-DETR keypoint ships CoreML + MLX variants) + opencv. Declare it in the computer-vision demo app.
Drop the committed third-party/include header set (~200K LOC of vendored ExecuTorch/c10/torch/opencv headers). Headers are now downloaded like the binaries: a platform-independent headers.tar.gz fetched by download-libs.js and produced by package-release-artifacts.sh. Keeps the rewrite's 'no third-party in git' philosophy and avoids churn on ExecuTorch bumps.
ab793e1 to
45ec2cb
Compare
core-android/core-ios drop the separately-shipped pthreadpool+cpuinfo (statically linked into libexecutorch.so / libthreadpool_*.a for the rewrite), and the ABI-independent executorch.jar rides in the core-android-arm64 artifact (downloaded to third-party, not committed).
Two gaps surfaced building apps/computer-vision on a physical device: - libexecutorch.so references OpenMP runtime symbols (optimized kernels), so link -fopenmp -static-openmp into libRnExecutorch.so (matches main #1039). - abiFilters was hardcoded to both ABIs, ignoring the app's reactNativeArchitectures; read it (filtered to arm64-v8a/x86_64) so device builds only compile + need the ABI they target. Build now succeeds, installs, and launches on device (arm64-v8a).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Ports PR #1039's on-demand native-lib mechanism into the rewrite flow. Apps declare what they need via a
react-native-executorchblock (backends/libs/features) inpackage.json; the postinstallscripts/download-libs.jsexpandsfeaturesvia the forward-lookingFEATURE_MAP, writesrne-build-config.json, and downloads only the requested per-backend artifacts from GitHub Releases intothird-party/. The podspec andandroid/build.gradle.ktsread that config to gateRNE_ENABLE_*and link backends as separate libs (Xnnpack/CoreML/MLXxcframeworks,lib*_executorch_backend.so); MLX is the iOS device slice only.Adapted to the rewrite:
cpp/layout (opencv kept as an extensible source list, guarded inRnExecutorch.cpp), Kotlin-DSL gradle config read, singleandroid/CMakeLists.txt. The scripts,FEATURE_MAP, and artifact contract are kept identical to #1039 so future rewrite work stays code-only. CI (TS-only) skips the download viaRNET_SKIP_DOWNLOADin the setup action.Backed by
software-mansion-labs/executorch@ms/separate-backends(already ET 1.3.1). Release artifacts (device-only MLX) are built/uploaded separately; committed headers /executorch.jar/ExecutorchLibwrapper are provisioned alongside.Introduces a breaking change?
Type of change
Tested on
Testing instructions
react-native-executorch.features(e.g.["llm"]), runyarn install, and checkrne-build-config.jsonreflects it (enableOpencv:false, enableCoreml:false, enableXnnpack:true). Setting legacyextraserrors.RNET_BASE_URL=https://github.com/software-mansion/react-native-executorch/releases/download/v0.0.0-rewrite-libs-test RNET_TARGET=android-arm64-v8a INIT_CWD=<app> node scripts/download-libs.js— tarballs extract (checksum-verified) intothird-party/android/libs/...exactly whereCMakeLists.txt/podspec expect.yarn lint,yarn workspace react-native-executorch prepare,yarn typecheck(all green; install withRNET_SKIP_DOWNLOAD=1).Test artifacts uploaded to the
v0.0.0-rewrite-libs-testpre-release: Android freshly built from@ms/separate-backends(ET 1.3.1, split backends, arm64-v8a + x86_64); iOS reused from the same separate-backends 1.3.1 lineage (#1039) with MLX stripped to the device slice only. Full download/extract/checksum flow verified across iOS + both Android ABIs. On-device app build still to be run.Related issues
#1208
Checklist
Additional notes
Draft: all of third-party/ (headers + binaries) is downloaded on demand, not committed — headers ship as a platform-independent headers.tar.gz alongside the binary artifacts (built with device-only MLX), uploaded separately.
Header provenance:
headers.tar.gzis assembled from the@ms/separate-backendsExecuTorch CMake install include tree (cmake-out*/include/:executorch,pytorch/{c10,torch,headeronly}, the tokenizer third-party headersabsl/re2/nlohmann, andcpuinfo/pthreadpool— all platform-independent, identical across ABIs/SDKs) plus theopencv2headers from the OpenCV prebuilt (same source as theopencv-rnepod / Android staticlibopencv_*.a, not built from executorch).Docs getting-started is deferred (no rewrite getting-started page exists yet).