react / react/react-native

[Android] ReactRootProjectPlugin drops :app:preBuild -> library preBuild dependency under --configure-on-demand, breaking codegen before CMake

Offen
#58,149 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Needs: Author Feedback Needs: Repro
Vorherrschende Sprache
C++
Sterne
127k
Forks
25.3k
Ø Merge
1 T. 23 Std.
Gemergte PRs (30 T.)
4

Beschreibung

Description

ReactRootProjectPlugin makes :app:preBuild depend on every library's preBuild so that library codegen runs before the app's CMake configure:

project.gradle.projectsEvaluated {
  val appProject = project.rootProject.subprojects.find { it.name == "app" }
  val appPreBuild = appProject?.tasks?.findByName("preBuild")
  if (appPreBuild != null) {
    val otherPreBuildTasks =
        project.rootProject.subprojects
            .filter { it != appProject }
            .mapNotNull { it.tasks.findByName("preBuild") }
    appPreBuild.dependsOn(otherPreBuildTasks)
  }
}

When Gradle runs with --configure-on-demand (Expo CLI passes it unconditionally in expo run:android), a library project that has not been evaluated by the time projectsEvaluated fires has no preBuild task yet, so findByName returns null and the dependency is silently dropped. The app's configureCMake<Variant> then runs before that library's generateCodegenArtifactsFromSchema, and the autolinking CMake file fails with:

CMake Error at android/app/build/generated/autolinking/src/main/jni/Android-autolinking.cmake:19 (add_subdirectory):
  add_subdirectory given source
  ".../node_modules/react-native-sherpa-onnx/android/build/generated/source/codegen/jni/"
  which is not an existing directory.
CMake Error at .../ReactAndroid/cmake-utils/ReactNative-application.cmake:97 (target_link_libraries):
  Cannot specify link libraries for target "react_codegen_SherpaOnnxSpec"
  which is not built by this project.

Which libraries are affected depends on evaluation order, so it looks flaky per project. In my project @stripe/stripe-react-native (also a codegen TurboModule library) happened to be evaluated in time and worked, while react-native-sherpa-onnx was not. The same failure was reported independently against that library (XDcobra/react-native-sherpa-onnx#63) and closed as not reproducible, which fits an ordering-dependent bug.

Running the identical build without --configure-on-demand (./gradlew :app:assembleDebug -PreactNativeArchitectures=arm64-v8a) succeeds; the task log shows :react-native-sherpa-onnx:generateCodegenArtifactsFromSchema:app:preBuild:app:configureCMakeDebug[arm64-v8a].

Workaround (verified): in the app's build.gradle, add an explicit task-path dependency, which forces on-demand configuration of that project:

preBuild.dependsOn(':react-native-sherpa-onnx:preBuild')

A robust fix would be to wire the dependency per subproject as each one is evaluated (e.g. subproject.afterEvaluate { appPreBuild.dependsOn(subproject.tasks.named("preBuild")) }, or dependsOn("${subproject.path}:preBuild") by task path) instead of snapshotting subprojects at projectsEvaluated.

Steps to reproduce
  1. npx create-expo-app repro && cd repro
  2. npx expo install react-native-sherpa-onnx @dr.pogodin/react-native-fs (any third-party library with codegenConfig and a JNI target that Gradle happens to evaluate late)
  3. npx expo run:android (Expo CLI runs Gradle with --configure-on-demand)
  4. Build fails in :app:configureCMakeDebug[<abi>] as above.
  5. cd android && ./gradlew :app:assembleDebug succeeds.
React Native Version

0.86.0

Affected Platforms

Build - Android

Output of npx @react-native-community/cli info
System:
  OS: macOS 26.6.2
  CPU: (14) arm64 Apple M4 Pro
Binaries:
  Node: 24.12.0
  npm: 11.6.2
  Watchman: Not Found
Managers:
  CocoaPods: 1.17.0
IDEs:
  Android Studio: 2025.3
  Xcode: 26.2/17C52
Languages:
  Java: 17.0.12
Expo SDK 57 (expo 57.0.8), Gradle 9.3.1, AGP as shipped with RN 0.86.0, NDK 27.1.12297006, CMake 3.22.1
Stacktrace or Logs
> Task :stripe_stripe-react-native:generateCodegenArtifactsFromSchema
> Task :app:preBuild
...
> Task :react-native-sherpa-onnx:downloadNativeLibsIfNeeded
> Task :app:configureCMakeDebug[arm64-v8a] FAILED
(no :react-native-sherpa-onnx:generateCodegenArtifactsFromSchema before the failure)

Execution failed for task ':app:configureCMakeDebug[arm64-v8a]'.
> [CXX1429] error when building with cmake using .../ReactAndroid/cmake-utils/default-app-setup/CMakeLists.txt
  CMake Error at .../Android-autolinking.cmake:19 (add_subdirectory):
    add_subdirectory given source ".../react-native-sherpa-onnx/android/build/generated/source/codegen/jni/" which is not an existing directory.
MANDATORY Reproducer

Steps above (create-expo-app + react-native-sherpa-onnx + expo run:android). The failure depends on Gradle's on-demand evaluation order, so the library that gets skipped may differ by project.

Screenshots and Videos

N/A

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, ReactRootProjectPlugin zu finden und nachzuverfolgen, wie projectsEvaluated die preBuild-Tasks von Bibliotheken entdeckt. Reproduziere das mit den obligatorischen Schritten für Expo und react-native-sherpa-onnx und vergleiche anschließend die Reihenfolge der Gradle-Tasks mit --configure-on-demand und ohne diese Option. Als erledigt gilt die Aufgabe, wenn der library codegen vor app configureCMake ausgeführt wird und die CMake-Generierung für autolinking erfolgreich ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
android, cmake, kotlin, react-native
Bereich
build-system, mobile
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Aktiv
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.