由于发布了React Native 0.71.0-rc.0版本,在过去的几天里,React Native Android构建失败,出现了不同的错误,而代码没有任何变化。

回答 4 浏览 1.5万 2022-11-06

注意:错误可能是不同的,但如果你在过去两天内没有对代码进行任何修改的情况下进行安卓构建时,会得到任何错误。

我的错误 - 安装应用程序失败。Error: Command failed: ./gradlew app:installDebug -PreactNativeDevServerPort=8081

error Failed to install the app. Make sure you have the Android development environment set up:

Error: Command failed: ./gradlew app:installDebug
-PreactNativeDevServerPort=8081

FAILURE: Build failed with an exception.

* Where: Build file '/Users/....../node_modules/react-native-month-year-picker/android/build.gradle' line: 115

* What went wrong: A problem occurred configuring project ':react-native-month-year-picker'.

> Could not resolve all files for configuration ':react-native-month-year-picker:implementation'.
   > Could not resolve com.facebook.react:react-native:+.
     Required by:
         project :react-native-month-year-picker
      > Cannot choose between the following variants of com.facebook.react:react-native:0.71.0-rc.0:
          - debugVariantDefaultRuntimePublication
          - releaseVariantDefaultRuntimePublication
        All of them match the consumer attributes:
          - Variant 'debugVariantDefaultRuntimePublication' capability com.facebook.react:react-native:0.71.0-rc.0:
ZFloc Technologies 提问于2022-11-06
4 个回答
#1楼 已采纳
得票数 74

安卓系统的构建失败是由于React Native版本的发布0.71.0-rc0造成的。

注意:错误可能是不同的,但如果你在过去两天里没有对代码进行任何修改,就会出现安卓构建失败的情况,这将是一个解决方案。

在尝试这些方法之前,请恢复你所做的每一个改动:https://stackoverflow.com/a/74371195/10657559

办法一

在你的android -> build.gradle文件中添加这个修正,如下所示。

buildscript {
    // ...
}


allprojects {
    repositories {
       exclusiveContent {
           filter {
               includeGroup "com.facebook.react"
           }
           forRepository {
               maven {
                   url "$rootDir/../node_modules/react-native/android"
               }
           }
       }
        // ...
    }
}

这个修正所要做的是应用一个exclusiveContent的解析规则,强制解析React Native Android库,以使用node_modules里面的那个库。

办法二

如果你的gradle不支持上述内容,那么就把这个添加到你的android -> build.gradle文件中,如下所示。

def REACT_NATIVE_VERSION = new File(['node', '--print',"JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim())


buildscript {
     // ...
}
    
    
allprojects {
    configurations.all {
          resolutionStrategy {
            force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
          }
    }
    // ...  
}

Ref: Fix and updates on Android build failures happening since Nov 4th 2022 #35210

ZFloc Technologies 提问于2022-11-06
ZFloc Technologies 修改于2022-11-09
好的,再次感谢。但是伙计,你知道为什么吗?这是由于此行 implementation "com.facebook.react:react-native:+" 末尾的 + 造成的吗?在android/app/build.gradleMathias Bradiceanu 2022-11-06
原因和这里提到的所有:github.com/facebook/react-native/issues/35210ZFloc Technologies 2022-11-06
stackoverflow.com/questions/74336482/…也解决了这一问题。woodpecker 2022-11-07
我使用的是react native 0.66.3,我按照react native的最新修复建议更新为0.66.5。但不幸的是,它仍然无法工作,我得到了任务':app:checkDebugAarMetadata'. > A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction > The minCompileSdk (31) specified in a dependency's AAR metadata (META-INF/com/android/build/gradle/aar-metadata.properties) is greater than this module's compileSdkVersion (android-30)Ravis Farooq 2022-11-08
@RavisFarooq 请尝试重建,将build.gradle文件中的compileSdkVersion改为31.....如果不成功的话,请恢复修改,将react-native降级为0.66.3,这在以前是可以正常工作的,并应用这里提到的解决方案,再试一下。ZFloc Technologies 2022-11-08
#2楼
得票数 3

在已投票的答案基础上补充,做一些知识分享。

重申一下,正如@Thanhal所发布的,解决方案和官方解释可以在这里找到。Android build failures No matching variant of com.facebook.react:react-native:0.71.0-rc.0 was found.

错误发生后,我需要回答的最大问题是:

在package.json中指定了我的react-native版本后,为什么我的项目还是会下载另一个react-native版本呢?

我甚至用npm install --save-exact来确保我得到的是正确的版本。

我得到的错误信息让我更加迷惑不解:

The class is loaded from ~/.gradle/caches/transforms-3/9a8c596b7e1788d5bad7c80991eefff1/transformed/jetified-kotlin-stdlib-1.6.10.jar!/kotlin/Unit.class e: .../node_modules/expo-modules-core/android/src/main/java/expo/modules/adapters/react/permissions/PermissionsService.kt: (351, 32): Class 'kotlin.Unit' was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.1.

不知何故,Kotlin对我来说也成了一个问题。

谁/什么人在要求最新的react-native?

对于我来说,这里的问题不是关于我的项目所使用的 react-native 的版本。它是关于我的库所使用的东西。

直到0.71.0-rc.0,react-native团队一直在NPM包(node_modules/react-native/android/)中提供一个Maven仓库。大多数库的build.gradle都被配置为引用这个目录。这是通过在libraries build.gradle中声明一个自定义仓库完成的。

maven {
    url "$rootDir/../node_modules/react-native/android"
}

但在库的build.gradle文件中,声明了更多的存储库,可能会是这样的:

repositories {
  maven {
    url "$rootDir/../node_modules/react-native/android"
  }
  google()
  mavenLocal()
  mavenCentral()
}

然后,该库的依赖性被如此声明:

dependencies {
  implementation 'com.facebook.react:react-native:+'
}

因为"+"作为 react-native 依赖关系的版本,Gradle 会从各种声明的仓库中获取最新的 react-native 版本。

由于过去react-native是与npm包一起发布的,所以Gradle总是将react-native放在node_modules。然而,现在react-native团队将库发布到包括MavenCentral在内的公共仓库,Gradle会尊重"+",而采用MavenCentral上的版本。

为什么我得到了Kotlin的错误?

我的项目使用的是 react-native 的旧版本,从 0.68 版开始, react-native 开始使用 Kotlin 1.6.10 版本(查看更改历史)。所以是的,react-native版本的差异也会导致Kotlin错误。

Emmanuel Ang 提问于2022-11-08
Sunderam Dubey 修改于2022-11-15
#3楼
得票数 1

Facebook已经发布了>=0.63的错误修复版本。你也可以升级而不是应用热修复。

https://github.com/facebook/react-native/issues/35210

bennyman008 提问于2022-11-08
#4楼
得票数 -1

这个修复方法是有效的。

失败的原因:Android的构建失败是由于向Maven发布了0.71.0-rc0版本的React Native,因此当gradle同步时,它选择了0.71.0-rc0版本的react-native,而不是你当前版本的react-native。

在没有升级react-native版本的情况下,通过在build.gradle中添加这个,这就可以了(无论是否启用hermes,连同flipper也是如此)

 exclusiveContent {
            // We get React Native's Android binaries exclusively through npm,
            // from a local Maven repo inside node_modules/react-native/.
            // (The use of exclusiveContent prevents looking elsewhere like Maven Central
            // and potentially getting a wrong version.)
            filter {
                includeGroup "com.facebook.react"
            }
            forRepository {
                maven {
                    url "$rootDir/../node_modules/react-native/android"
                }
            }
        }

最后的片段看起来是这样的

allprojects {
    repositories {
        exclusiveContent {
            // We get React Native's Android binaries exclusively through npm,
            // from a local Maven repo inside node_modules/react-native/.
            // (The use of exclusiveContent prevents looking elsewhere like Maven Central
            // and potentially getting a wrong version.)
            filter {
                includeGroup "com.facebook.react"
            }
            forRepository {
                maven {
                    url "$rootDir/../node_modules/react-native/android"
                }
            }
        }
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url("$rootDir/../node_modules/react-native/android")

在此修复后,gradle clean 并重建。然后你就可以成功地在本地运行react native的安卓系统。

这个修正所要做的是应用一个exclusiveContent的解析规则,强制解析React Native Android库,以使用node_modules里面的解析规则。

现在。

不同版本的react native有一些补丁版本如果你不想进行此修复,你可以将你当前的react native版本更新到这里提到的react native补丁版本上。

https://github.com/facebook/react-native/issues/35210

HarshitMadhav 提问于2022-11-08