由于minSdkVersion,努力使Android构建工作



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

我的错误是典型的minSdk版本不匹配:

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

tools:overrideLibrary
我不完全确定如何做到这一点,我尝试在我的/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>

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

使用最小 Sdk 最多为 16
的兼容库,这只剩下这个选项,为此我将针对有问题的包提出 PR。但是在发布新版本之前,它仍然无法帮助我构建。

谁能看到我错过了什么?或者某些缓存可能会妨碍构建之间?

问题是RN 0.64将其minSdkVersion从16增加到21。 许多 RN 库在 16 时minSdkVersion硬编码,这导致 Detox Android 构建失败。

我不确定为什么常规 Android 构建成功而 Detox 构建失败,但解决方法是编辑库的android/build.gradle并将其更改为从根项目中读取minSdkVersion

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

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

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

或者,您可以使用修补程序包在运行npm install时将修补程序应用于node_modules/<libname>/android/build.gradle

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

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

defaultConfig {
minSdkVersion 23
targetSdkVersion 30
...
}

也许这就是原因?

按如下方式修改android/app/build.gradle

defaultConfig {
minSdkVersion 23
targetSdkVersion 29
multiDexEnabled true
}

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

通过在构建命令中assembleDebugassembleAndroidTest之前添加app:来构建您的Android应用程序

=>./gradlew app:assembleDebug app:assembleAndroidTest -DtestBuildType=debug

或更改.detoxrc.js文件中的build命令,如下所示

build: 'cd android && ./gradlew app:assembleDebug app:assembleAndroidTest -DtestBuildType=Debug'

这里发生了什么:assembleRelease执行每个模块的 assembleRelease 任务,而app:assembleRelease执行app模块中的 assembleRelease 任务。

显然,两者都正确填充了任务图,这意味着Android的app:assembleRelease取决于app中用作依赖项的其他模块的组装发布。

参考 : 应用程序之间的区别:组装发布和组装发布

最新更新