Expo React Native生产构建失败:Gradle资源编译错误求助
问题描述
我在尝试为Expo React Native应用打包生产版本时遇到Gradle构建错误,应用未使用任何Android或iOS原生组件,核心错误如下:
错误日志
Task :app:processReleaseMainManifest
/home/expo/workingdir/build/android/app/src/main/AndroidManifest.xml Warning:
provider#expo.modules.filesystem.FileSystemFileProvider@android:authorities was tagged at AndroidManifest.xml:0 to replace other declarations but no other declaration present
Task :app:mergeReleaseResources FAILED
Task :expo-asset:compileReleaseJavaWithJavac
Task :expo-constants:compileReleaseKotlin
Task :app:processReleaseManifest
FAILURE: Build failed with an exception.
A failure occurred while executing com.android.build.gradle.internal.res.ResourceCompilerRunnable
Resource compilation failed (Failed to compile values resource file /home/expo/workingdir/build/android/app/build/intermediates/incremental/release/mergeReleaseResources/merged.dir/values/values.xml. Cause: java.lang.IllegalStateException: Can not extract resource from com.android.aaptcompiler.ParsedResource@36d79d7c.,Can not extract resource from com.android.aaptcompiler.ParsedResource@2c08c75f.). Check logs for more details.
Run with --stacktrace option to get the stack trace.
Run with --info or --debug option to get more log output.
Run with --scan to get full insights.
BUILD FAILED in 7m 14s
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.
410 actionable tasks: 410 executed
Error: Gradle build failed with unknown error. See logs for the "Run gradlew" phase for more information.
The full error log points to issues with resource compilation in Gradle, but the root cause is not immediately clear.
环境信息
- Expo SDK版本:~51.0.22
- React Native版本:^0.74.3
- 依赖:包含expo、react、react-native及多个社区包在内的大量依赖
已尝试操作
- 更新所有依赖至最新版本
- 清理Expo及npm/yarn缓存
- 验证依赖与Expo SDK版本兼容性
疑问
- 捆绑资源的多属性定义警告由何导致?如何解决或抑制?
- 应采取哪些步骤解决Gradle资源编译错误?需检查哪些配置区域?
- 无Android相关文件时,还有哪些调试步骤可诊断修复问题?
解决方案建议
1. FileSystemFileProvider警告处理
- 原因:
expo-file-system模块的AndroidManifest配置中声明了tools:replace="android:authorities",但实际没有其他同名的Provider声明,导致Gradle抛出冗余警告。 - 解决/抑制方案:
- 升级
expo-file-system到SDK 51兼容的最新版本,部分版本已修复该冗余配置问题。 - 若升级无效,安装
expo-build-properties插件,通过app.json/app.config.js添加配置禁用该类警告:{ "expo": { "plugins": [ [ "expo-build-properties", { "android": { "buildGradleProps": { "android.lintOptions.disable": ["ManifestResource"] } } } ] ] } }
- 升级
2. Gradle资源编译错误(mergeReleaseResources)排查步骤
资源编译失败多因values.xml存在重复资源、非法命名或格式错误,按以下顺序排查:
- 获取详细错误日志:
本地执行eas build --local生成Android项目文件,进入android目录后运行./gradlew assembleRelease --stacktrace --info,日志会明确指出出错的资源行和具体问题。 - 排查依赖冲突:
用npx expo doctor检查依赖冲突,重点关注涉及资源的包(如UI组件库、expo-asset相关依赖);若发现冲突,通过package.json的overrides(npm)或resolutions(Yarn)字段强制指定兼容版本。 - 检查资源文件合规性:
确认项目assets目录下的文件命名符合Android规则(仅小写字母、数字、下划线,无空格/特殊字符);排查是否有重复名称的资源(如不同目录下同名图片)。
3. 无原生文件时的调试技巧
- 本地构建调试:
使用eas build --local在本地生成完整Android项目,直接操作原生文件并执行Gradle命令,比远程构建更易定位问题。 - 精简依赖排查:
临时移除非核心社区依赖,逐个重新添加并构建,定位到引发错误的具体包。 - 清除构建缓存:
执行eas build --clear-cache彻底清除远程构建缓存,避免旧资源残留导致冲突。 - 检查app.json配置:
确认app.json中android配置项(如package、versionCode)无特殊字符;assets数组路径正确,无重复或无效条目。 - 预构建原生文件:
执行npx expo prebuild --platform android生成原生项目,手动检查android/app/src/main/res/values/values.xml,修复重复或错误的资源定义后重新构建。
内容的提问来源于stack exchange,提问作者yves

