# React Native Firebase Android Build Issue Report ## Summary Systemic Gradle task dependency validation errors in React Native Firebase v22.4.0 causing build failures due to implicit task dependencies not being properly declared. ## Environment - **React Native Firebase**: v22.4.0 - **Firebase SDK**: v11.10.0 - **Firebase BOM**: v33.16.0 - **React Native**: 0.78.0 - **Node**: 18.x - **Gradle**: 8.x - **Android Gradle Plugin**: 8.7.0 - **Kotlin**: 2.0.21 ## Error Details ### Primary Error ``` Task ':react-native-firebase_app:packageDebugResources' uses this output of task ':@react-native-firebase_app:generateDebugResValues' without declaring an explicit or implicit dependency. This can lead to incorrect results being produced, depending on what order the tasks are executed. ``` ### Cascading Errors - `checkAarMetadata` β `packageDebugResources` β `mapDebugSourceSetPaths` - Similar errors occur across all Firebase packages (`auth`, `messaging`, `app`) - Affects both Debug and Release build variants ### Build Output Example ``` > Task :react-native-firebase_auth:packageDebugResources FAILED > Task :react-native-firebase_messaging:packageDebugResources FAILED > Task :react-native-firebase_app:mapDebugSourceSetPaths FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':react-native-firebase_app:packageDebugResources'. ``` ## Root Cause Analysis The issue stems from **missing explicit task dependencies** in React Native Firebase's Android Gradle build configuration. Gradle's strict dependency validation (introduced in newer versions) detects that tasks are consuming outputs from other tasks without proper dependency declarations. ### Affected Task Chain 1. `generateDebugResValues` β generates resource values 2. `packageDebugResources` β packages resources (consumes output from #1) 3. `mapDebugSourceSetPaths` β maps source paths (depends on #2) 4. `checkAarMetadata` β validates AAR metadata (depends on previous tasks) ## Current Workarounds ### 1. Disable Validation Tasks (Temporary) ```gradle // android/build.gradle allprojects { tasks.whenTaskAdded { task -> if (task.name.contains("checkAarMetadata") || task.name.contains("checkDebugAarMetadata") || task.name.contains("checkReleaseAarMetadata")) { task.enabled = false } } } ``` ### 2. Force Task Dependencies (Reactive) ```gradle // android/app/build.gradle tasks.whenTaskAdded { task -> if (task.name == 'checkReleaseAarMetadata') { task.dependsOn(':@react-native-firebase_auth:writeReleaseAarMetadata') task.dependsOn(':react-native-firebase_app:writeReleaseAarMetadata') task.dependsOn(':react-native-firebase_messaging:writeReleaseAarMetadata') } // Similar for debug variants and resource packaging tasks } ``` ### 3. Gradle Properties Configuration ```properties # android/gradle.properties org.gradle.dependency.verification.console=ignore org.gradle.dependency.verification=off org.gradle.unsafe.configuration-cache=false android.suppressUnsupportedOptionWarnings=true ``` ## Issues with Current Workarounds 1. **Maintenance Overhead**: Requires manual configuration for each Firebase package 2. **Build Performance**: Disabling validation reduces build safety 3. **Scalability**: New Firebase packages require additional workaround updates 4. **Brittleness**: Workarounds may break with Gradle/AGP updates ## Proposed Solution ### For React Native Firebase Maintainers **Fix the source Android Gradle configuration in each Firebase package:** 1. **Update `android/build.gradle` in each package** to properly declare task dependencies: ```gradle // In @react-native-firebase/app/android/build.gradle android.libraryVariants.all { variant -> def packageResourcesTask = tasks.findByName("package${variant.name.capitalize()}Resources") def generateResValuesTask = tasks.findByName("generate${variant.name.capitalize()}ResValues") if (packageResourcesTask && generateResValuesTask) { packageResourcesTask.dependsOn(generateResValuesTask) } } ``` 2. **Add explicit task ordering** for AAR metadata tasks: ```gradle tasks.whenTaskAdded { task -> if (task.name.startsWith('write') && task.name.endsWith('AarMetadata')) { def checkTask = tasks.findByName(task.name.replace('write', 'check')) if (checkTask) { checkTask.dependsOn(task) } } } ``` 3. **Update build templates** to include proper dependency declarations by default ### Benefits of This Approach - β Fixes the root cause rather than symptoms - β Eliminates need for user workarounds - β Maintains Gradle build safety and performance - β Future-proof against Gradle updates - β Consistent across all Firebase packages ## Reproduction Steps 1. Create new React Native project with React Native 0.78+ 2. Install React Native Firebase packages: ```bash npm install @react-native-firebase/app@22.4.0 npm install @react-native-firebase/auth@22.4.0 npm install @react-native-firebase/messaging@22.4.0 ``` 3. Configure Android as per official documentation 4. Run `cd android && ./gradlew assembleDebug` 5. Observe task dependency validation errors ## Impact This issue affects: - **All React Native Firebase users** on recent RN/Gradle versions - **Build reliability** and developer experience - **CI/CD pipelines** requiring workarounds - **New project setup** difficulty ## References - [GitHub Issue #8114](https://github.com/invertase/react-native-firebase/issues/8114) - [Gradle Task Dependencies Documentation](https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:task_dependencies) - [React Native Firebase Android Installation](https://rnfirebase.io/firestore/usage/installation/android) ## Additional Context This issue has been reported multiple times but often closed due to lack of reproducible examples. The problem is **architectural** - it exists in the Firebase package build configurations themselves, not in user project setup. The workarounds demonstrate that the solution is well-understood: **explicit task dependency declarations**. What's needed is implementing this fix in the source packages rather than requiring every user to apply workarounds.