由于 minSdkVersion

问题描述

我想我一定在这里遗漏了一些东西,据我所知,在阅读了许多文章后,我已经尝试了这些方法,但似乎无法使事情正常进行。我目前正在手动触发这些构建,使用 detox 将使用的命令 ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug 尽管我也尝试过直接使用 npx detox build --configuration android.emu.debug

我的错误是典型的 minSdkVersion 不匹配:

uses-sdk:minSdkVersion 16 cannot be smaller than version 21 declared in library [com.facebook.react:react-native:0.64.0] /home/iw651/.gradle/caches/transforms-2/files-2.1/354c8f3d479b5a1203bfff874da058bc/jetified-react-native-0.64.0/AndroidManifest.xml as the library might be using APIs not available in 16
        Suggestion: use a compatible library with a minSdk of at most 16,or increase this project's minSdk version to at least 21,or use tools:overrideLibrary="com.facebook.react" to force usage (may lead to runtime failures)

build.gradle
所以让我有些困惑的事情首先是我项目的 minSdkVersion 设置为至少 21...这是我的 /android/build.gradle 文件的顶部:

buildscript {
    ext {
        buildToolsversion = "29.0.3"
        minSdkVersion = 23
        compileSdkVersion = 29
        targetSdkVersion = 29
        kotlinVersion = '1.3.61'
        ndkVersion = "20.1.5948944"
    }

在我的 android/app/build.gradle 中,我有以下内容

defaultConfig {
     minSdkVersion rootProject.ext.minSdkVersion
     targetSdkVersion rootProject.ext.targetSdkVersion
     multiDexEnabled true
     ...
}

所以我真的相信以下已经完成了。但它显然仍然在抛出错误

或将此项目的 minSdk 版本增加到至少 2

工具:覆盖图书馆
我不确定如何执行此操作,我已尝试在我的 /android/app/src/debug/AndroidManifest.xml 文件中进行设置。我尝试了一些排列:

<uses-sdk minSdkVersion="16" tools:overrideLibrary="com.facebook.react"/>
<uses-sdk minSdkVersion="21" tools:overrideLibrary="com.facebook.react"/>
<uses-sdk tools:overrideLibrary="com.facebook.react"/>

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.SYstem_ALERT_WINDOW"/>
    <uses-sdk minSdkVersion="16" tools:overrideLibrary="com.facebook.react"/>
    <application
            android:usesCleartextTraffic="true"
            tools:targetApi="28"
            tools:ignore="GoogleAppIndexingWarning">
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>
</manifest>

这些排列似乎也无济于事。

使用 minSdk 最多为 16 的兼容库
这只是给我留下了这个选项,为此我将针对相关软件包提出 PR。但是在发布新版本之前它仍然无法帮助我构建。

谁能看到我遗漏了什么?或者某些缓存会妨碍构建?

解决方法

问题是 RN 0.64 将其 minSdkVersion 从 16 增加到 21。许多 RN 库将 minSdkVersion 硬编码为 16,即 causing Detox Android builds to fail

我不确定为什么常规 Android 构建成功而 Detox 构建失败,但解决方法是编辑库的 android/build.gradlechange it to read minSdkVersion from the root project

minSdkVersion rootProject.hasProperty('minSdkVersion') ? rootProject.minSdkVersion : 16

理想情况下,这将通过 PR 在核心库中修复(不要忘记制作一个)。同时,您可以自己 fork 项目,修复 bug 并通过在 package.json 中引用它来使用已修复的项目:

"<lib-name>": "github:<username>/<lib-name>"

或者,您可以在运行 node_modules/<libname>/android/build.gradle 时使用 patch-package 将修复应用到 npm install

这似乎是 RN 库中一个很常见的错误。在我们的中型 RN 项目中,我不得不修补三个库,包括 react-native-webview

,

请按照以下步骤操作。

  1. 下载 SDK 27 enter image description here

  2. minSdkVersion 通常设置在 defaultConfig 键下:

    默认配置{ minSdk 版本 27 目标SDK版本30 ... }

  3. 去 文件=> 使缓存无效/重新启动... enter image description here

然后点击“无效并重新启动”。

,

在您提供的代码中,配置是在 ext 键下设置的。 minSdkVersion 通常设置在 defaultConfig 键下:

defaultConfig {
    minSdkVersion 23
    targetSdkVersion 30
    ...
}

也许这就是原因?

,

如下修改您的 android/app/build.gradle

defaultConfig {
     minSdkVersion 23
     targetSdkVersion 29
     multiDexEnabled true
}

从清单文件中删除任何 uses-sdk