From d1b1c8a2b8d9b56c203fe98e8a6ec0d572fbcab4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Oct 2026 18:47:00 +0000 Subject: [PATCH 1/2] chore(deps): update dependency com.android.tools.build:gradle to v9.5.0 --- .../kotlin/io/github/cdsap/projectgenerator/model/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt index cd1c02e9..0b6b99d0 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt @@ -64,7 +64,7 @@ data class Kotlin( ) data class Android( - val agp: String = "9.4.1", + val agp: String = "9.5.0", val agp9: String = "9.0.0-rc02", val androidxCore: String = "1.19.1", val appcompat: String = "1.8.0", From 508f08a1b493117df875ba5d1cbf8076442c6255 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Wed, 28 Oct 2026 19:24:26 -0700 Subject: [PATCH 2/2] fix: pin Lint to the project JDK for AGP 9.5+ AGP 9.5 cannot store the configuration cache when Gradle runs on an older JVM than the generated Android target compatibility. Point Lint at the project toolchain so JDK 17 can still assemble JDK 21 projects. --- .../generator/extension/FileExtension.kt | 7 +++ .../android/CompositeBuildPluginAndroidApp.kt | 1 + .../android/CompositeBuildPluginAndroidLib.kt | 2 + .../plugins/android/LintToolchainDsl.kt | 24 ++++++++++ ...siteBuildPluginAndroidLintToolchainTest.kt | 48 +++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt create mode 100644 project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt index 726844ca..9f4d78ca 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/extension/FileExtension.kt @@ -10,3 +10,10 @@ fun File.projectFile(content: String) { fun String.isAgp9(): Boolean { return this.startsWith("9.") } + +fun String.supportsLintToolchain(): Boolean { + val parts = split('.') + val major = parts.getOrNull(0)?.toIntOrNull() ?: return false + val minor = parts.getOrNull(1)?.toIntOrNull() ?: return false + return major > 9 || (major == 9 && minor >= 5) +} diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt index 71554895..bbc21c96 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidApp.kt @@ -55,6 +55,7 @@ class CompositeBuildPluginAndroidApp { | sourceCompatibility = JavaVersion.VERSION_${versions.project.jdk} | targetCompatibility = JavaVersion.VERSION_${versions.project.jdk} | } +${lintToolchainDsl(versions)} | } | target.extensions.getByType(JavaPluginExtension::class.java).apply { | toolchain.languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(${versions.project.jdk})) diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt index edc18506..26b6d00f 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLib.kt @@ -15,6 +15,7 @@ class CompositeBuildPluginAndroidLib { |import org.gradle.api.plugins.JavaPluginExtension |import org.gradle.kotlin.dsl.configure |import org.gradle.kotlin.dsl.dependencies +${lintToolchainImport(versions)} | |class CompositeBuildPluginAndroidLib : Plugin { | override fun apply(target: Project) { @@ -44,6 +45,7 @@ class CompositeBuildPluginAndroidLib { | sourceCompatibility = JavaVersion.VERSION_${versions.project.jdk} | targetCompatibility = JavaVersion.VERSION_${versions.project.jdk} | } +${lintToolchainDsl(versions)} | buildFeatures { | compose = true | } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt new file mode 100644 index 00000000..6b635962 --- /dev/null +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/LintToolchainDsl.kt @@ -0,0 +1,24 @@ +package io.github.cdsap.projectgenerator.generator.plugins.android + +import io.github.cdsap.projectgenerator.generator.extension.supportsLintToolchain +import io.github.cdsap.projectgenerator.model.Versions + +internal fun lintToolchainImport(versions: Versions): String { + if (!versions.android.agp.supportsLintToolchain()) { + return "" + } + return " |import org.gradle.jvm.toolchain.JavaLanguageVersion\n" +} + +internal fun lintToolchainDsl(versions: Versions): String { + if (!versions.android.agp.supportsLintToolchain()) { + return "" + } + return """ + lint { + toolchain { + languageVersion.set(JavaLanguageVersion.of(${versions.project.jdk})) + } + } + """.trimStart('\n').trimEnd() + "\n" +} diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt new file mode 100644 index 00000000..d1fbfbba --- /dev/null +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/plugins/android/CompositeBuildPluginAndroidLintToolchainTest.kt @@ -0,0 +1,48 @@ +package io.github.cdsap.projectgenerator.generator.plugins.android + +import io.github.cdsap.projectgenerator.model.Android +import io.github.cdsap.projectgenerator.model.DependencyInjection +import io.github.cdsap.projectgenerator.model.Project +import io.github.cdsap.projectgenerator.model.Versions +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class CompositeBuildPluginAndroidLintToolchainTest { + + @Test + fun `agp 9_5 app and lib plugins pin lint to the project jdk`() { + val versions = Versions( + project = Project(jdk = "21"), + android = Android(agp = "9.5.0") + ) + + val app = CompositeBuildPluginAndroidApp().get(versions, DependencyInjection.NONE) + val lib = CompositeBuildPluginAndroidLib().get(versions, DependencyInjection.NONE) + + listOf(app, lib).forEach { content -> + assertTrue( + content.contains("languageVersion.set(JavaLanguageVersion.of(21))"), + "Expected lint toolchain to use project JDK 21:\n$content" + ) + assertTrue(content.contains("lint {"), content) + assertTrue(content.contains("toolchain {"), content) + } + } + + @Test + fun `agp 9_4 app and lib plugins do not emit lint toolchain dsl`() { + val versions = Versions( + project = Project(jdk = "21"), + android = Android(agp = "9.4.1") + ) + + val app = CompositeBuildPluginAndroidApp().get(versions, DependencyInjection.NONE) + val lib = CompositeBuildPluginAndroidLib().get(versions, DependencyInjection.NONE) + + listOf(app, lib).forEach { content -> + assertFalse(content.contains("lint {"), content) + assertFalse(content.contains("toolchain {"), content) + } + } +}