Expo React Native构建报错:expo-camera未指定compileSdkVersion
问题重现
构建Expo RN应用时触发Gradle报错:
脚本'/DELIBERATELY_HIDDEN/node_modules/expo-modules-autolinking/scripts/android/autolinking_implementation.gradle'第377行出现问题,评估项目':expo'失败,具体为配置':expo-camera'项目时出错,提示未指定compileSdkVersion,且无法获取'release'属性。
环境:expo-camera 14.1.3、react 18.2.0、react native 0.73.6、expo 50.0.0,此前可正常构建,未改动版本,所有相关build.gradle已指定compileSdkVersion,不想修改node_modules内容。
解决方案
1. 彻底清理缓存
执行以下命令清除各类缓存,避免旧配置干扰:
# 清理Android Gradle缓存 cd android && ./gradlew clean && cd .. # 清理Expo预构建缓存 npx expo prebuild --clean # 重置依赖 rm -rf node_modules package-lock.json npm install
2. 强制统一子模块compileSdkVersion(无需修改node_modules)
在项目级android/build.gradle中添加全局子项目配置,强制所有依赖模块使用项目定义的compileSdkVersion:
buildscript { ext { // 确保这些版本与Expo 50兼容(Expo 50对应compileSdk 34) compileSdkVersion = 34 buildToolsVersion = "34.0.0" minSdkVersion = 21 targetSdkVersion = 34 } // ... 其他buildscript配置 } // 新增:强制子模块使用全局版本 subprojects { afterEvaluate { project -> if (project.hasProperty('android')) { android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion // 可选:统一minSdk和targetSdk defaultConfig { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion } } } } }
3. 验证Expo插件配置
检查app.json/app.config.js中expo-camera插件是否正确配置:
{ "expo": { "plugins": [ [ "expo-camera", { "cameraPermission": "Allow $(PRODUCT_NAME) to access your camera", "microphonePermission": "Allow $(PRODUCT_NAME) to access your microphone" } ] ], // ... 其他Expo配置 } }
4. 确认Gradle版本兼容性
Expo 50要求特定的Gradle和AGP版本,检查android/gradle/wrapper/gradle-wrapper.properties:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
同时确认android/build.gradle中的AGP版本:
dependencies { classpath("com.android.tools.build:gradle:8.2.0") // ... 其他依赖(如expo、kotlin插件) }
5. 处理VS Code的.settings提示(可选)
如果VS Code提示Missing Gradle project configuration folder: .settings,可以:
- 用Android Studio打开项目,它会自动生成
.settings目录并同步Gradle - 或手动在
android目录下创建.settings空文件夹
问题原因分析
该报错通常是缓存导致的配置不一致,或是autolinking脚本读取模块配置时出现异常。通过强制统一子模块的compileSdkVersion,既能覆盖可能存在的模块配置冲突,又无需修改node_modules内的文件,避免重新安装依赖后配置失效。
内容的提问来源于stack exchange,提问作者Tycho Systems

