Build fails on subsequent ./gradlew clean build due to unreadable prefab directory
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
- Run a clean build:
./gradlew clean build # Works ✅ - 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
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?
Workaround
Use ./gradlew clean --refresh-dependencies && ./gradlew build (slower, re-downloads dependencies).
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>...
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
We have similar issue. rm -rf .gradle works as tmp solution. And similar to this https://github.com/facebook/react-native/issues/34871
@Sky's suggestion to delete the .gradle directory helped me too
currently experiencing same issues: please any help
"react-native": "0.82.1", "react-native-reanimated": "4.1.3", "react-native-worklets": "^0.6.1",
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")
)
}
}
}
}