Почему версия транзитивной зависимости Gradle не применяется?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему версия транзитивной зависимости Gradle не применяется?

Сообщение Anonymous »

Я создаю библиотеку, созданную с использованием com.google.android.gms:play-services-tasks версии 17.2.1, и ее pom.xml:


4.0.0
com.example.group
my-artifact
1.2.3
aar


com.google.android.gms
play-services-tasks
[17.2,17.3)

... other dependencies ...



Я намерен, чтобы любое приложение, использующее эту библиотеку, использовало версию play-services-tasks между 17.2 (включительно) и 17.3 (эксклюзивно). (На данный момент меня не интересуют крайние случаи, такие как 17.3-rc1.)
Однако, когда я создаю приложение, использующее эту библиотеку, оно использует play-services-tasks версия 18.1.0.
Вывод ./gradlew :app:dependent включает следующее:
+--- com.example.group:my-artifact:1.2.3
| \--- com.google.android.gms:play-services-tasks:[17.2,17.3) -> 18.1.0 (*)

поэтому зависимость play-services-tasks поднимается выше установленного мной диапазона. Никаких ошибок сборки не сообщается, а анализ APK показывает, что используется версия 18.1.0.
Что я делаю не так? Или я неправильно понял, как работают транзитивные зависимости, и библиотека не может таким образом ограничивать версии зависимостей?
ИЗМЕНИТЬ
Приложение Файл build.gradle.kts:
import com.google.firebase.perf.plugin.FirebasePerfExtension
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

//noinspection GradleDependency
plugins {
id("com.android.application")
id("kotlin-parcelize")
id("kotlin-allopen")
id("kotlin-kapt")
id("kotlinx-serialization")
id("com.google.firebase.crashlytics")
id("com.google.firebase.appdistribution")
id("androidx.navigation.safeargs")
}

private val isDevBuild = project.hasProperty("devBuild")

apply(plugin = "com.google.firebase.firebase-perf")

android {
@Suppress("UnstableApiUsage")
bundle {
density.enableSplit = true
abi.enableSplit = true
language.enableSplit = true
}

defaultConfig {
applicationId = "com.example.appid"
testApplicationId = "com.example.appid.test"
vectorDrawables.useSupportLibrary = true
manifestPlaceholders["crashlyticsCollectionEnabled"] = !isDevBuild
}

apply(from = "${project.property("signingConfigs.signing")}.gradle")
apply(from = rootProject.file("buildscripts/flavors.gradle"))

buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro", "proguard-rules-remove-logs.pro")
testProguardFile("proguard-test-rules.pro")
buildConfigField(type = "Boolean", name = "DEV", value = "false")

firebaseAppDistribution {
releaseNotes = project.findProperty("firebaseChangelog").toString()
groups = project.findProperty("appDistributionGroup").toString()
serviceCredentialsFile = System.getenv("FIREBASE_APPDISTRIBUTION_CREDENTIALS")
}
}
getByName("debug") {
signingConfig = null
isMinifyEnabled = false
buildConfigField(type = "Boolean", name = "DEV", value = "true")
ext.set("enableCrashlytics", false)

configure {
setInstrumentationEnabled(false)
}
}
}
packaging {
jniLibs.excludes.add("META-INF/**/*")
}

configurations.configureEach {
resolutionStrategy {
force(libs.android.test.monitor.get())
}
}

buildFeatures {
viewBinding = true
dataBinding = true
compose = true
buildConfig = true
}

composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
lint {
abortOnError = false
checkReleaseBuilds = false
}
namespace = "com.example.namespace"
testNamespace = "com.example.namespace.test"

@Suppress("UnstableApiUsage")
testOptions {
unitTests.all {
it.useJUnitPlatform()
}
}
}

tasks.withType(Test::class.java).configureEach {
testLogging {
exceptionFormat = TestExceptionFormat.FULL
events(TestLogEvent.STARTED, TestLogEvent.SKIPPED, TestLogEvent.PASSED, TestLogEvent.FAILED)
showStandardStreams = true
}
}

if (isDevBuild) {
androidComponents {
beforeVariants(selector().withBuildType("release")) { builder ->
builder.enable = false
}
}
} else {
apply(from = rootProject.file("buildscripts/google-play-publishing.gradle"))
}

dependencies {
implementation(libs.firebase.crashlytics)
implementation(libs.firebase.performance)

// Google AndroidX
implementation(libs.google.material)
implementation(libs.cardview)
implementation(libs.webkit)
implementation(libs.gridlayout)
implementation(libs.constraintlayout)
implementation(libs.paging.ktx)
implementation(libs.google.flexbox)
implementation(libs.datastore.core)
implementation(libs.datastore.preferences)

// Google lifecycle
implementation(libs.lifecycle.runtime.ktx)
implementation(libs.lifecycle.runtime.compose)
implementation(libs.lifecycle.livedata.ktx)
implementation(libs.lifecycle.viewmodel.ktx)
implementation(libs.lifecycle.viewmodel.compose)

// Google play services
implementation(libs.gms.identity)
implementation(libs.gms.ads)
implementation(libs.gms.analytics)
implementation(libs.gms.basement)
implementation(libs.gms.maps)
implementation(libs.gms.location)
implementation(libs.gms.tasks)

// Firebase
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.messaging)
implementation(libs.firebase.analytics)
implementation(libs.firebase.config)

// Kotlin
implementation(libs.kotlin.serialization.json)
implementation(libs.retrofit.serialization) {
exclude(group = "com.squareup.retrofit2", module = "retrofit")
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}

implementation(libs.example.myartifact)

implementation(libs.google.play.appupdate)
implementation(libs.espresso.idling)
implementation(libs.okhttp.logging.interceptor)

// Navigation
implementation(libs.navigation.fragment.ktx)
implementation(libs.navigation.runtime.ktx)
implementation(libs.navigation.ui.ktx)

implementation(libs.activity.compose)

// Compose
implementation(libs.compose.foundation)
implementation(libs.compose.foundation.layout)
implementation(libs.compose.material)
implementation(libs.compose.runtime.livedata)
implementation(libs.compose.ui)
implementation(libs.compose.ui.util)
implementation(libs.accompanist.permissions)
debugImplementation(libs.compose.ui.tooling)
debugImplementation(libs.compose.runtime.tracing)
implementation(libs.compose.ui.tooling.preview)
debugImplementation(libs.compose.ui.test.manifest)

testImplementation(libs.junit5.api)
testImplementation(libs.junit5.params)
testRuntimeOnly(libs.junit5.engine)
testImplementation(libs.test.hamcrest)
testImplementation(libs.test.truth)
testImplementation(libs.okhttp.mockserver)
testImplementation(libs.retrofit.serialization) {
exclude(group = "com.squareup.retrofit2", module = "retrofit")
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}
testImplementation(libs.test.core)
testImplementation(libs.mockito.core)
testImplementation(libs.mockito.kotlin)
testImplementation(libs.coroutines.test)
testImplementation(libs.mockk.core)
testImplementation(libs.test.turbine)

debugImplementation(libs.fragment.testing)
testImplementation(libs.android.test.runner)
testImplementation(libs.android.test.ext.junit)
testImplementation(libs.espresso.core)
testImplementation(libs.espresso.contrib) {
exclude(group = "org.checkerframework", module = "checker")
}

androidTestImplementation(libs.compose.material)
androidTestImplementation(libs.compose.material.get3())
}

// must be at the bottom
apply(plugin = "com.google.gms.google-services")

Примечание: я получу тот же результат, если удалю эту строку:
implementation(libs.gms.tasks)
РЕДАКТИРОВАНИЕ 2
Вот часть вывода ./gradlew :app:dependent, которая показывает `зависимость play-services-tasks в более высокой версии:
+--- com.google.firebase:firebase-crashlytics -> 18.6.4
| +--- com.google.firebase:firebase-common:20.4.2 -> 20.4.3
| | +--- org.jetbrains.kotlin:kotlin-stdlib:1.7.10 -> 1.9.23 (*)
| | +--- com.google.android.gms:play-services-basement:18.3.0 (*)
| | \--- com.google.android.gms:play-services-tasks:18.1.0 (*)


Подробнее здесь: https://stackoverflow.com/questions/784 ... g-enforced
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»