react-native-reanimated icon indicating copy to clipboard operation
react-native-reanimated copied to clipboard

Build fails on subsequent ./gradlew clean build due to unreadable prefab directory

Open shiluka opened this issue 11 months ago • 8 comments

Description

When running ./gradlew clean build without --refresh-dependencies, the build fails on the second attempt with the error:

Error: invalid value for <package_path>: directory ".../node_modules/react-native-reanimated/android/build/intermediates/prefab_package/debug/prefab" is not readable

The error occurs because the prefab directory becomes corrupted or inaccessible between builds. Manually deleting directories or using --refresh-dependencies temporarily fixes the issue, but this is not sustainable for CI/CD pipelines.

Steps to reproduce

  1. Run a clean build: ./gradlew clean build # Works ✅
  2. Run the same command again without code changes: ./gradlew clean build # Fails ❌

Snack or a link to a repository

none

Reanimated version

3.17.1

React Native version

0.78.1

Platforms

Android

JavaScript runtime

None

Workflow

None

Architecture

Fabric (New Architecture)

Build type

None

Device

None

Device model

No response

Acknowledgements

Yes

shiluka avatar Mar 27 '25 18:03 shiluka

Hey! 👋

The issue doesn't seem to contain a minimal reproduction.

Could you provide a snack or a link to a GitHub repository under your username that reproduces the problem?

github-actions[bot] avatar Mar 27 '25 18:03 github-actions[bot]

Workaround Use ./gradlew clean --refresh-dependencies && ./gradlew build (slower, re-downloads dependencies).

shiluka avatar Mar 27 '25 21:03 shiluka

The same error.

React Native: v0.76.8 Reanimated: v3.16.7 OS: MacOS 15.4 (Macbook M2 Pro) JDK: v17.0.11 Android gradle plugin: 8.6.0 Gradle: 8.10.2

  Error: invalid value for <package_path>: directory "~/Documents/MyProject/node_modules/react-native-reanimated/android/build/intermediates/prefab_package/release/prefab" is not readable. : com.android.ide.common.process.ProcessException: C++ build system [prefab] failed while executing:
      "/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java" \
        --class-path \
        /~/.gradle/caches/modules-2/files-2.1/com.google.prefab/cli/2.1.0/aa32fec809c44fa531f01dcfb739b5b3304d3050/cli-2.1.0-all.jar \
        com.google.prefab.cli.AppKt \
        --build-system \
        cmake \
        --platform \
        android \
        --abi \
        arm64-v8a \
        --os-version \
        26 \
        --stl \
        c++_shared \
        --ndk-version \
        26 \
        --output \
        /var/folders/87/gksy07710nzg8pqm4zbvnz9r0000gn/T/agp-prefab-staging14784167742108831515/staged-cli-output \
        ~/.gradle/caches/8.10.2/transforms/c059c15503dc209339ef3315534f9ae6/transformed/jetified-react-android-0.76.8-release/prefab \
        ~/Documents/MyProject/node_modules/react-native-reanimated/android/build/intermediates/prefab_package/release/prefab \
        ~/.gradle/caches/8.10.2/transforms/69c9bb7c69278dae742c4b07d1d37a9b/transformed/jetified-hermes-android-0.76.8-release/prefab \
        ~/.gradle/caches/8.10.2/transforms/9cd3464e8c303c4c929d13d539fc2a34/transformed/jetified-fbjni-0.6.0/prefab
    from ~/Documents/MyProject/android/app
  Usage: prefab [<options>] <package_path>...

danilvalov avatar Apr 03 '25 20:04 danilvalov

I installed the latest version of React Native 0.78 and the latest version of Reanimated 3.17.1, but I can't generate an APK on my Macbook pro M3. #7323

ShadyElsharnoby avatar Apr 04 '25 02:04 ShadyElsharnoby

We have similar issue. rm -rf .gradle works as tmp solution. And similar to this https://github.com/facebook/react-native/issues/34871

Sky avatar May 06 '25 06:05 Sky

@Sky's suggestion to delete the .gradle directory helped me too

ayonoaduo avatar May 30 '25 06:05 ayonoaduo

currently experiencing same issues: please any help

"react-native": "0.82.1", "react-native-reanimated": "4.1.3", "react-native-worklets": "^0.6.1",

tdammy92 avatar Oct 25 '25 00:10 tdammy92

currently experiencing same issues: please any help

"react-native": "0.82.1", "react-native-reanimated": "4.1.3", "react-native-worklets": "^0.6.1",

I added these lines to the relevant places in those versions and it was solved.

android/app/build.gradle:

gradle.projectsEvaluated {
    tasks.matching { it.name.startsWith("configureCMake") }.configureEach { configureTask ->
        def isReleaseLike = configureTask.name.contains("RelWithDebInfo") || configureTask.name.toLowerCase().contains("release")
        if (isReleaseLike) {
            configureTask.dependsOn(
                rootProject.project(":react-native-reanimated").tasks.named("prefabReleasePackage"),
                rootProject.project(":react-native-worklets").tasks.named("prefabReleasePackage")
            )
        } else {
            configureTask.dependsOn(
                rootProject.project(":react-native-reanimated").tasks.named("prefabDebugPackage"),
                rootProject.project(":react-native-worklets").tasks.named("prefabDebugPackage")
            )
        }
    }
}

android/build.gradle:

subprojects { subproject ->
    if (subproject.name == "react-native-reanimated") {
        subproject.afterEvaluate {
            def workletsProject = rootProject.findProject(":react-native-worklets")
            if (workletsProject != null) {
                tasks.matching { it.name.startsWith("configureCMake") }.configureEach { configureTask ->
                    def dependencyTaskName = configureTask.name.contains("RelWithDebInfo") ? "prefabReleasePackage" : "prefabDebugPackage"
                    def dependencyTask = workletsProject.tasks.findByName(dependencyTaskName)
                    if (dependencyTask != null) {
                        configureTask.dependsOn(dependencyTask)
                    }
                }
            }
        }
    }

    if (subproject.name == "react-native-screens") {
        subproject.afterEvaluate {
            ["debug", "release"].each { variant ->
                def capitalizedVariant = variant.capitalize()
                tasks.matching { it.name == "compile${capitalizedVariant}JavaWithJavac" }.configureEach { compileTask ->
                    def preCompileTask = tasks.findByName("javaPreCompile${capitalizedVariant}")
                    if (preCompileTask != null) {
                        compileTask.dependsOn(preCompileTask)
                    }
                    compileTask.doFirst {
                        def processorsFile = new File(subproject.buildDir, "intermediates/annotation_processor_list/${variant}/javaPreCompile${capitalizedVariant}/annotationProcessors.json")
                        if (!processorsFile.exists()) {
                            processorsFile.parentFile.mkdirs()
                            processorsFile.text = "[]"
                        }
                    }
                }
            }
        }
    }
}

gradle.projectsEvaluated {
    tasks.matching { it.name.startsWith("configureCMake") }.configureEach { configureTask ->
        def reanimatedProject = rootProject.findProject(":react-native-reanimated")
        def workletsProject = rootProject.findProject(":react-native-worklets")
        if (reanimatedProject != null && workletsProject != null) {
            if (configureTask.name.contains("RelWithDebInfo")) {
                configureTask.dependsOn(
                    reanimatedProject.tasks.named("prefabReleasePackage"),
                    workletsProject.tasks.named("prefabReleasePackage")
                )
            } else {
                configureTask.dependsOn(
                    reanimatedProject.tasks.named("prefabDebugPackage"),
                    workletsProject.tasks.named("prefabDebugPackage")
                )
            }
        }
    }
}

yunusyavuz16 avatar Nov 17 '25 14:11 yunusyavuz16