You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非传递性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:01:16