From 05822c59b516b6d252bd6d27e9032e660e15b625 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Sun, 31 Oct 2021 18:56:49 +0400 Subject: [PATCH] Fix Android Lint dependency resolution issues (KT-49483) Android Gradle plugin resolves the *Classpath configurations in an artifact view with an artifactType attribute set, which should give a resolved variant with a different `org.gradle.category` attribute. With `org.gradle.category=library` set by the Kotlin Gradle plugin, that couldn't work. To fix this, don't set the `org.gradle.category` attribute on the Android resolvable configurations. TODO: Add integration tests! --- .../AbstractKotlinAndroidGradleTests.kt | 49 ++++++++++++++++++- .../AndroidProject/settings.gradle | 5 +- .../gradle/plugin/KotlinTargetConfigurator.kt | 8 ++- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt index 6be626d4faf..e03933e8f43 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.gradle import org.gradle.api.logging.LogLevel import org.gradle.api.logging.configuration.WarningMode import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask import org.jetbrains.kotlin.gradle.util.* import org.jetbrains.kotlin.test.util.KtTestUtil @@ -466,7 +467,7 @@ open class KotlinAndroid70GradleIT : KotlinAndroid36GradleIT() { get() = GradleVersionRequired.AtLeast("7.0") override fun defaultBuildOptions(): BuildOptions { - val javaHome = File("/opt/openjdk-bin-11") + val javaHome = File(System.getProperty("jdk11Home") ?: error("jdk11Home not specified")) Assume.assumeTrue("JDK 11 should be available", javaHome.isDirectory) return super.defaultBuildOptions().copy(javaHome = javaHome, warningMode = WarningMode.Summary) } @@ -1043,6 +1044,52 @@ fun getSomething() = 10 } } + @Test + fun testLintDependencyResolutionKt49483() = with(Project("AndroidProject")) { + setupWorkingDir() + + gradleBuildScript().modify { + """ + plugins { + id("com.android.lint") + } + + """.trimIndent() + it + } + + gradleBuildScript("Lib").appendText("\n" + """ + android { + lintOptions.checkDependencies = true + } + dependencies { + implementation(project(":java-lib")) + } + """.trimIndent()) + + gradleSettingsScript().appendText( + "\n" + """ + include("java-lib") + """.trimIndent() + ) + + with(projectDir.resolve("java-lib/build.gradle.kts")) { + ensureParentDirsCreated() + writeText( + """ + plugins { + id("java-library") + id("com.android.lint") + } + """.trimIndent() + ) + } + + build(":Lib:lintFlavor1Debug") { + assertSuccessful() + assertNotContains("as an external dependency and not analyze it.") + } + } + private fun jvmToAndroidModifier( appendKotlinVersion: Boolean = false ): (String) -> CharSequence = { line -> diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidProject/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidProject/settings.gradle index 457173910a0..1e74d615df6 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidProject/settings.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/AndroidProject/settings.gradle @@ -14,10 +14,7 @@ pluginManagement { resolutionStrategy { eachPlugin { - if (requested.id.id == "com.android.application" || - requested.id.id == "com.android.library" || - requested.id.id == "com.android.feature" || - requested.id.id == "com.android.test") { + if (requested.id.id.startsWith("com.android.")) { useModule("com.android.tools.build:gradle:$android_tools_version") } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index 4509da428b1..bf31b1dc4c3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -329,7 +329,9 @@ abstract class AbstractKotlinTargetConfigurator isVisible = false isCanBeConsumed = false attributes.attribute(USAGE_ATTRIBUTE, KotlinUsages.consumerApiUsage(compilation.target)) - attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + if (compilation.platformType != KotlinPlatformType.androidJvm) { + attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + } description = "Compile classpath for $compilation." } @@ -359,7 +361,9 @@ abstract class AbstractKotlinTargetConfigurator isCanBeConsumed = false isCanBeResolved = true attributes.attribute(USAGE_ATTRIBUTE, KotlinUsages.consumerRuntimeUsage(compilation.target)) - attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + if (compilation.platformType != KotlinPlatformType.androidJvm) { + attributes.attribute(Category.CATEGORY_ATTRIBUTE, project.categoryByName(Category.LIBRARY)) + } description = "Runtime classpath of $compilation." } }