非传递性R类迁移问题:React Native依赖致CI/CD构建失败
非传递性R类迁移:命令行方案与模块范围控制
一、命令行执行迁移的方法
Android Gradle Plugin(AGP)提供了命令行任务完成非传递性R类迁移,无需依赖Android Studio的GUI操作:
- 全项目迁移命令:
./gradlew migrateToNonTransitiveRClasses - 仅针对特定模块迁移(比如只处理app模块):
./gradlew :app:migrateToNonTransitiveRClasses
二、解决React Native依赖库的构建失败问题
node_modules中的第三方RN库(如react-native-screens)仍使用传递性R类引用,直接开启非传递性R会导致构建失败,可通过以下两种方式处理:
1. 针对第三方库禁用非传递性R
在项目根目录的build.gradle中,给特定RN库单独配置允许传递性R:
android { ... dependencies { // 给react-native-screens关闭非传递性R implementation(project(":react-native-screens")) { android { nonTransitiveRClass = false } } // 其他依赖配置... } }
如果有多个RN第三方库,也可以用全局匹配的方式批量配置:
subprojects { if (name.startsWith("react-native-")) { android { nonTransitiveRClass = false } } }
2. 给第三方库打补丁(临时方案)
如果上述配置不生效,可使用patch-package工具给react-native-screens修改R类引用格式:
- 安装工具:
npm install patch-package --save-dev - 修改
node_modules/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt中的R类引用,补全完整包名(比如把R.xxx改成com.swmansion.rnscreens.R.xxx) - 生成补丁文件:
npx patch-package react-native-screens - 后续执行
npm ci时,patch-package会自动将补丁应用到依赖库中
三、仅迁移特定模块的注意事项
如果只迁移部分模块,需要注意:
- 被迁移模块内部的R类引用会被命令行任务自动修正为非传递性格式
- 依赖该模块的其他模块若也开启了非传递性R,需手动导入被迁移模块的R类(比如
import com.yourapp.app.R) - 第三方依赖模块需保持非传递性R关闭,避免引用冲突
内容的提问来源于stack exchange,提问作者Dharsam1990
相关产品推荐
相关产品推荐

