返回

React Native 0.76.7: "com.facebook.react"找不到? 终极排查

Android

React Native安卓构建报错 "Could not find com.facebook.react:react-native:0.76.7" 终极排查指南

嘿,伙计们!升级 React Native 版本有时候就像探险,总能遇到些意想不到的“惊喜”。最近就有朋友在升级到 RN 0.76.7 后,执行 ./gradlew build 时碰到了这个头疼的错误:"Could not find com.facebook.react:react-native:0.76.7"。具体报错信息指向了 @react-native-async-storage/async-storage 这个库,提示它依赖的 com.facebook.react:react-native:0.76.7 找不着了。

Could not determine the dependencies of task ':react-native-async-storage_async-storage:extractDebugAnnotations'.
> Could not resolve all dependencies for configuration ':react-native-async-storage_async-storage:debugCompileClasspath'.
   > Could not find com.facebook.react:react-native:0.76.7.
     Required by:
         project :react-native-async-storage_async-storage

这问题说白了就是 Gradle 在它配置的仓库里,扒拉了半天也没找到 com.facebook.react:react-native 这个版本号为 0.76.7 的依赖。别急,咱一步步来分析,把它搞定。

一、 问题根源分析:Gradle 为啥找不到 React Native?

在 React Native 项目中,Android 端的 react-native 依赖通常不是从远程 Maven 仓库(像 Maven Central 或 JCenter——虽然 JCenter 已经凉了)下载的,而是直接引用本地 node_modules/react-native/android 目录下的 AAR 文件或者源码。

当 Gradle 报 "Could not find..." 时,通常意味着以下几种可能:

  1. settings.gradle 配置不当 :这个文件负责告诉 Gradle 你的项目里有哪些模块,以及这些模块(尤其是 react-native 本身)的实际路径。如果这里没配对,Gradle 就会傻乎乎地去远程仓库找,那自然是找不到的。
  2. React Native Gradle Plugin (RN GP) 未正确应用或配置 :新版本的 React Native 引入了 react-native-gradle-plugin 来统一和简化 Android 端的构建配置。如果这个插件没起作用,或者配置有误,也可能导致 react-native 依赖解析出问题。
  3. android/build.gradle 中的仓库配置或强制版本策略问题 :虽然 react-native 主要依赖本地,但其他第三方库可能需要远程仓库。如果仓库列表不全,或者 force 版本策略用得不当,也可能引发连锁反应。用户提供的配置中 configurations.all { resolutionStrategy { force ... } } 尝试强制版本,但如果依赖本身都找不到,强制也无济于事。
  4. 缓存作祟 :Gradle 和 Android Studio 的缓存有时候会出点幺蛾子,导致一些本该正常的解析失败。
  5. android/app/build.gradle 问题 :应用模块的 build.gradle 文件中,应用 React Native 相关插件的方式也可能影响。

从提问者提供的 android/build.gradle 文件看,他尝试手动定义 REACT_NATIVE_VERSIONforce 这个版本,这通常是在处理传递性依赖冲突时使用,但对于 react-native 这个核心依赖,更重要的是确保 Gradle 知道从哪里加载它(本地 node_modules)。
他还提到了尝试使用 apply plugin: "com.facebook.react.rootproject" 导致报错,这说明他可能混淆了新旧版本的 RN Gradle 配置方式。新版本不再使用这种方式在根 build.gradle 中应用插件。

二、 解决方案大盘点

好,咱们庖丁解牛,一条条来看怎么解决。

方案一:检查并修正 android/settings.gradle (核心步骤)

这是最常见的原因。settings.gradle 文件需要明确告诉 Gradle,:react-native 这个项目应该从本地 node_modules 目录加载。

原理与作用:
settings.gradle 在 Gradle 构建的初始化阶段执行。它通过 include 指令声明项目包含的模块,并通过 project(':module-name').projectDir 指定模块的物理路径。对于 React Native,我们需要把 react-native 自身作为一个 Gradle 项目包含进来。

操作步骤:
打开你项目中的 android/settings.gradle 文件,确保它看起来像下面这样:

// android/settings.gradle

pluginManagement { // Gradle 7.0+
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement { // Gradle 7.0+
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) // 推荐做法,但如果遇到老库问题可以注释掉或改为PREFER_SETTINGS
    repositories {
        google()
        mavenCentral()
        // 如果你的 react-native 版本在 mavenLocal(),确保它在这里。通常不需要为 RN 本身。
        // mavenLocal()
        // 某些第三方库可能在 JitPack
        maven { url 'https://www.jitpack.io' }
    }
}

rootProject.name = 'YourAppName' // 替换成你的应用名
apply from: file("../node_modules/@react-native/gradle-plugin/src/main/java/com/facebook/react/react.gradle") // RN 0.71+

// 根据你的项目结构和RN版本,通常会看到类似下面的内容
// apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../android/settings.gradle.kts") // 这是另一种动态方式,不常用在settings.gradle
// 或者更常见的是直接通过 RN Gradle Plugin 内部处理,或者类似下面这样:
// includeBuild('../node_modules/react-native-gradle-plugin') // 旧版本RN GP的方式

// 核心部分:确保 React Native 和其他本地模块被正确引入
// react.gradle 脚本 (上面 apply from 的那行) 通常会处理 :react-native 的引入。
// 你可能需要确保你的第三方原生模块也在这里被正确 include,例如:
// include ':@react-native-async-storage_async-storage'
// project(':@react-native-async-storage_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-async-storage/async-storage/android')

// 关键:React Native Gradle Plugin 会动态添加 React Native 作为项目依赖。
// 你应该在 `android/app/build.gradle` 中看到 `implementation project(':react-native')`
// 如果你的RN版本较老,或者`react.gradle`脚本没有自动处理,你可能需要手动添加,但这很少见:
// include ':react-native'
// project(':react-native').projectDir = new File(rootProject.projectDir, '../node_modules/react-native/android')

注意: 对于 React Native 0.71 及以上版本,主要是通过 apply from: file("../node_modules/@react-native/gradle-plugin/src/main/java/com/facebook/react/react.gradle") 这行来让 RN Gradle 插件帮你处理这些事情,包括正确设置 react-native 模块的路径。

代码示例 (android/settings.gradle 关键部分):
对于 RN 0.76.7,react.gradle 脚本应该能正确处理。你的 settings.gradle 核心部分应包含:

// android/settings.gradle
// ... (pluginManagement 和 dependencyResolutionManagement 部分如上)

rootProject.name = 'YourProjectName' // 确保这里是你的项目名
apply from: file("../node_modules/@react-native/gradle-plugin/src/main/java/com/facebook/react/react.gradle")

// 其他由 autolinking 添加的第三方原生模块
// 例如:
// include ':@react-native-community_geolocation'
// project(':@react-native-community_geolocation').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/geolocation/android')
// (这些通常由 npx react-native autolink-android 生成或更新,但理解其原理有助排查)

最重要的是 apply from: file("../node_modules/@react-native/gradle-plugin/src/main/java/com/facebook/react/react.gradle") 这行。它会负责找到本地的 react-native 包。

安全建议:
无直接安全建议,但保持 settings.gradle 文件整洁、遵循官方指导能减少很多不必要的麻烦。

方案二:审视 android/build.gradle (项目根目录的 build.gradle)

这个文件定义了整个 Android 项目的构建脚本依赖和全局配置。

原理与作用:
它配置了构建工具的版本、Kotlin 版本、以及 Gradle 插件的仓库和依赖。重要的是 allprojects { repositories { ... } } 部分,它定义了所有子项目(包括 app 模块和所有原生依赖模块)查找依赖的仓库列表。

操作步骤:
用户提供的 android/build.gradle 文件内容基本是标准的。主要关注 allprojects { repositories { ... } }configurations.all

// android/build.gradle
buildscript {
    ext {
        buildToolsVersion = "35.0.0" // 确保与你的 Android Studio SDK Manager 中的版本匹配或兼容
        minSdkVersion = 24
        compileSdkVersion = 35 // RN 0.76 通常用 API 34 (compileSdkVersion = 34, targetSdkVersion = 34)
        targetSdkVersion = 34 // 建议与 compileSdkVersion 保持一致或接近
        kotlinVersion = "1.9.23" // RN 0.74+ 推荐1.9.22+, RN 0.73.x 用 1.8.20
                               // RN 0.76.7 项目模板使用的 kotlinVersion 可能是 1.9.23
                               // 根据你的 `react-native-gradle-plugin` 版本选择
    }
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        // 检查版本兼容性, classpath("com.android.tools.build:gradle") 版本与 Gradle 版本要匹配
        classpath("com.android.tools.build:gradle:8.2.1") // 示例版本,根据你使用的Gradle Wrapper版本选择
        classpath('com.facebook.react:react-native-gradle-plugin') // 这个由 RN 自动管理
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${project.ext.kotlinVersion}")
    }
}

// 移除或注释掉这俩废弃的插件应用方式,新版RN不需要在这里 apply
// apply plugin: "com.facebook.react.rootproject"
// apply plugin: "com.facebook.react"

allprojects {
    repositories {
        // react-native 核心依赖通常来自 node_modules,由 settings.gradle 和 RN GP 处理
        // mavenLocal() // 本地 Maven 仓库,可以保留
        google()
        mavenCentral()
        maven { url 'https://www.jitpack.io' }
    }

    // 这段 `configurations.all` 对于核心 react-native 依赖可能不是必需的,
    // 甚至可能引起问题,因为它试图强制一个 Gradle 可能根本找不到的依赖。
    // 如果问题依旧,可以先注释掉这个 `configurations.all` 块试试。
    // def REACT_NATIVE_VERSION = "0.76.7" // 手动指定版本在这里不一定有效,因为RN的源是本地
    // configurations.all {
    //     resolutionStrategy {
    //         force "com.facebook.react:react-native:$REACT_NATIVE_VERSION" // 这通常用于解决第三方库带来的传递依赖版本冲突
    //     }
    // }
}

建议修改:

  1. 更新 SDK 版本和 Kotlin 版本: React Native 0.76 官方推荐 compileSdkVersion = 34targetSdkVersion = 34kotlinVersion 应与 react-native-gradle-plugin (RN GP) 兼容。可以参考新创建的 RN 0.76.7 项目的默认配置。通常 kotlinVersion 会在 node_modules/@react-native/gradle-plugin/gradle.properties 中找到推荐值 (例如 kotlinVersion=1.9.23)。
  2. compileSdkVersionbuildToolsVersion: RN 0.76 使用 compileSdkVersion = 34targetSdkVersion = 34buildToolsVersion 需要是 Android Gradle Plugin (AGP) 兼容的版本,如 "34.0.0"。 如果 compileSdkVersion 是35,这可能太新了,除非你有特定理由,一般建议跟随 RN 的推荐版本。
  3. 移除 configurations.all 中的 force 策略 (针对 react-native 本身)react-native 这个依赖应该由 settings.gradle 指向本地 node_modules,而不是通过 force 从远程仓库拉取。如果需要强制版本,通常是在 android/app/build.gradle 内部对某些传递依赖进行。可以先将用户 build.gradle 中的 configurations.all 整个注释掉,看是否是它导致了问题。

方案三:检查 android/app/build.gradle

这个文件负责应用模块的具体构建配置。

原理与作用:
这里会应用 com.android.application 插件和 React Native 提供的插件,声明依赖项(包括 implementation project(':react-native')),以及配置签名、构建类型等。

操作步骤:
确保文件顶部正确应用了 React Native 的 Gradle 插件,并且有对 react-native 项目的依赖。

代码示例 (android/app/build.gradle 关键部分):

// android/app/build.gradle

// ... 其他插件,如 com.android.application
apply plugin: 'com.android.application'
// 确保这一行存在并且路径正确。这是应用 RN Gradle 插件的方式
apply from: file("../../node_modules/@react-native/gradle-plugin/src/main/kotlin/com/facebook/react/react-native-gradle-plugin.gradle")

android {
    // ...
    compileSdkVersion rootProject.ext.compileSdkVersion
    // ...

    defaultConfig {
        // ...
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        // ...
    }
    // ...
}

dependencies {
    // ...
    implementation project(':react-native') // 关键:这表示依赖于 settings.gradle 中配置的本地 react-native 模块
    // 你不应该看到 implementation "com.facebook.react:react-native:0.76.7" 这样的写法,除非你有特殊构建流程

    // 其他依赖,例如 AsyncStorage
    implementation project(':@react-native-async-storage_async-storage') // 这个名字是 autolinking 生成的
    // ...
}

确保 apply from: file("../../node_modules/@react-native/gradle-plugin/src/main/kotlin/com/facebook/react/react-native-gradle-plugin.gradle") 这行存在并且路径正确。
并且在 dependencies 代码块中有 implementation project(':react-native')

方案四:彻底清理和同步

有时候,陈旧的缓存或状态会导致 Gradle 行为异常。

原理与作用:
清理操作会删除之前构建生成的中间文件和缓存,强制 Gradle 在下次构建时重新解析所有依赖和配置。

命令行指令/操作步骤:

  1. 清理 Gradle 缓存:
    在你的项目根目录(不是 android 目录)执行:

    cd android
    ./gradlew clean
    cd ..
    

    或者更彻底地,删除 Gradle 的全局缓存(谨慎操作,会影响所有项目,下次构建变慢):

    rm -rf ~/.gradle/caches/
    

    以及项目内的 .gradle 文件夹:

    rm -rf android/.gradle/
    
  2. 删除 node_modules 并重新安装:

    rm -rf node_modules/
    yarn install # 或者 npm install
    
  3. Android Studio 操作 (如果使用 IDE):

    • File -> Invalidate Caches / Restart... -> 选择 "Invalidate and Restart"。
    • Build -> Clean Project
    • Build -> Rebuild Project
    • 点击 Android Studio 右上角的 "Sync Project with Gradle Files" 按钮。

方案五:检查 Android SDK 和构建工具

虽然错误信息直接指向依赖找不到,但确保构建环境本身是健康的也很重要。

原理与作用:
Gradle 构建依赖于正确的 Android SDK 版本、构建工具版本。这些不匹配可能间接导致问题。

操作步骤:

  1. 打开 Android Studio -> SDK Manager。
  2. 确保 android/build.gradleext 代码块里 buildToolsVersion (例如 "34.0.0")、compileSdkVersion (例如 34)、targetSdkVersion (例如 34) 对应的 SDK Platforms 和 SDK Build-Tools 已经安装。
    • React Native 0.76.x 一般使用 compileSdkVersion = 34, targetSdkVersion = 34。用户配置中的 35 可能偏高,可以尝试降至 34
    • buildToolsVersion 需要与 AGP (Android Gradle Plugin) 版本兼容。AGP 8.x 通常对应 Build Tools 34.x.x。

方案六:深入排查:Gradle 依赖树

如果以上都无效,可以尝试查看 Gradle 的依赖解析报告,看它到底尝试从哪里找这个包。

原理与作用:
dependencies 任务会打印出指定配置的完整依赖树,以及 Gradle 尝试解析它们的过程。

命令行指令:
android 目录下运行:

./gradlew :app:dependencies --configuration debugCompileClasspath > dependencies.txt

然后打开 dependencies.txt 文件,搜索 com.facebook.react:react-native,看看它是如何被解析的,有没有出现版本冲突或者解析失败的详细信息。

进阶使用技巧:
如果你怀疑是某个特定的库(比如 react-native-async-storage)错误地声明了对 com.facebook.react:react-native 的远程依赖,依赖树能帮你确认这一点。react-native-async-storage 自身不应直接依赖特定版本的 com.facebook.react:react-native Maven artifact,它应该依赖 react-native 本地项目。

三、额外安全建议

虽然此问题主要不是安全漏洞,但在配置 Gradle 时:

  • 谨慎添加第三方 Maven 仓库 :只添加可信的仓库。mavenCentral()google() 是标准的。jitpack.io 也很常用,但要确保添加的 JitPack 依赖是来自你信任的 GitHub 仓库。
  • 依赖版本管理 :对于第三方库,尽量使用稳定版本,并留意安全更新。

希望这些步骤能帮你解决 "Could not find com.facebook.react:react-native" 的问题。升级 React Native 的路途可能有点小坎坷,但理清 Gradle 的逻辑,问题大多能迎刃而解。