React Native+Expo开发Android Widget遇Gradle兼容及插件失败问题求助
问题解决与方案建议
一、Gradle构建错误修复
1. "Unsupported class file major version 67" 错误
该错误表明项目使用的Gradle版本不兼容当前JDK版本(major version 67对应Java 23)。Gradle对Java版本有明确兼容规则:
- Gradle 8.7及以上版本支持Java 23
- 若使用低于8.7的Gradle版本,需降级JDK至对应支持版本(比如Gradle 8.0支持Java 17)
修复步骤:
- 检查项目Gradle版本:打开
android/gradle/wrapper/gradle-wrapper.properties,将distributionUrl升级为https\://services.gradle.org/distributions/gradle-8.7-all.zip或更高版本 - 确认JDK版本:本地环境用
java -version查看,确保与Gradle版本兼容;Expo构建环境可在eas.json中指定JDK版本:{ "build": { "preview": { "android": { "jdkVersion": "23" } } } }
2. "Failed to apply plugin 'com.facebook.react.rootproject'" 错误
此问题多因React Native版本与Gradle插件版本不匹配导致:
- 确保
android/build.gradle中com.android.tools.build:gradle版本与RN版本兼容(比如RN 0.72+对应Gradle插件7.3.1+) - 检查
settings.gradle的pluginManagement块,确保正确引入React Native插件仓库:pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() maven { url("$rootDir/../node_modules/react-native/android") } maven { url("$rootDir/../node_modules/expo-modules-core/android") } } } - 清理缓存后重建:执行
./gradlew clean,再重新运行eas build
二、复杂RN+Expo应用的Android Widget开发最优方案
针对依赖繁多的复杂应用,自定义原生Widget是最可控的方案,具体步骤:
- 预构建原生项目:执行
eas prebuild生成完整Android原生代码,方便手动修改Widget逻辑 - 编写原生Widget代码:
- 在
android/app/src/main/java/[你的包名]/widget目录下创建AppWidgetProvider子类,处理Widget创建、更新逻辑 - 在
res/layout中创建Widget布局文件,定义UI样式 - 在
AndroidManifest.xml中注册Widget组件
- 在
- RN与Widget数据交互:
- 用
SharedPreferences或Room数据库做中间层,RN端通过NativeModule写入数据,Widget端读取更新UI - 若需实时更新,通过
BroadcastReceiver触发Widget刷新,RN端发送广播通知更新
- 用
- 规避第三方库适配问题:如果
react-native-android-widget、expo-widgets无法适配项目,建议放弃依赖第三方库,自定义实现更灵活,还能避免版本冲突
三、预构建时排除不必要依赖
可通过两种方式排除冗余依赖:
- expo-build-properties插件配置:在
app.json或app.config.js中添加插件配置,指定要排除的依赖:{ "expo": { "plugins": [ [ "expo-build-properties", { "android": { "excludeDependencies": ["com.example.unused-dep", "org.unused.lib"] } } ] ] } } - Gradle手动排除:打开
android/app/build.gradle,在依赖声明中添加exclude规则:implementation(project(':react-native-some-library')) { exclude group: 'com.unused.group', module: 'unused-module' } - 先排查冗余依赖:执行
./gradlew app:dependencies生成依赖树,分析未被使用的依赖后再排除,避免误删必要依赖
内容的提问来源于stack exchange,提问作者M41b1 Donald
相关产品推荐
相关产品推荐

