diff options
| author | Danilo M. <danix@danix.xyz> | 2026-11-02 11:09:19 +0100 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-11-02 11:09:19 +0100 |
| commit | 5cb29988d8ebb4c9625af6452f7931d0e68d1cb7 (patch) | |
| tree | de206444c7c6eca3627c0cd006619770ec253052 /build-logic | |
| parent | 9eec620a4d95c4e3217f0868af0fc7f7bada5c91 (diff) | |
| download | HardenedPass-5cb29988d8ebb4c9625af6452f7931d0e68d1cb7.tar.gz HardenedPass-5cb29988d8ebb4c9625af6452f7931d0e68d1cb7.zip | |
build: update to Gradle 9.8.2, AGP 9.5.0, Kotlin 2.4.21, Hilt 2.60.1
AGP 9 migration:
- Configure the shared Android setup through the new DSL
(CommonExtension, ApplicationExtension) instead of the removed
TestedExtension and BaseAppModuleExtension; targetSdk moves to the
application extension.
- Stop applying the Kotlin Android plugin; AGP 9 compiles Kotlin itself.
- Replace kapt with KSP 2.3.13 for Hilt, which built-in Kotlin requires,
and carry the Dagger compiler options over as KSP arguments.
- AGP 9 now applies packaging excludes to unit-test resources, which
stripped the diceware word list (**/*.txt) from its tests; lift that
exclude in the diceware module.
- Use resources.directories instead of the deprecated srcDir.
Plugin updates required by Gradle 9 / AGP 9: Sentry Gradle plugin
6.25.0 (sentry-android 8.62.0), metalava plugin 0.5.1, maven-publish
0.37.0, spotless 8.10.4, version-catalog-update 1.1.2, download task
5.7.0, foojay resolver 1.0.0, with their API changes. Newer metalava
models Kotlin properties, so autofill-parser/api.txt is regenerated;
the diff is representation only, no API was added or removed.
Fix new Kotlin 2.4 and lint findings (explicit return type in a
function with an early return, UseKtx in autofill-parser), drop
deprecated Kotlin Gradle properties, and make the AGENTS.md pre-commit
command cover every task CI runs (both flavors, lint on all modules).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'build-logic')
8 files changed, 23 insertions, 92 deletions
diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts index 2bb5b6ea..dd9c0c8b 100644 --- a/build-logic/build.gradle.kts +++ b/build-logic/build.gradle.kts @@ -29,10 +29,6 @@ gradlePlugin { id = "com.github.android-password-store.kotlin-common" implementationClass = "app.passwordstore.gradle.KotlinCommonPlugin" } - register("kotlin-kapt") { - id = "com.github.android-password-store.kotlin-kapt" - implementationClass = "app.passwordstore.gradle.KotlinKaptPlugin" - } register("kotlin-jvm-library") { id = "com.github.android-password-store.kotlin-jvm-library" implementationClass = "app.passwordstore.gradle.KotlinJVMLibrary" diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index 1488630b..ea43de31 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -6,7 +6,7 @@ rootProject.name = "build-logic" -plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0" } +plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } dependencyResolutionManagement { repositories { diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/AndroidCommon.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/AndroidCommon.kt index a26faea9..94b9c112 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/AndroidCommon.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/AndroidCommon.kt @@ -8,37 +8,29 @@ package app.passwordstore.gradle import app.passwordstore.gradle.LintConfig.configureLint import app.passwordstore.gradle.flavors.configureSlimTests import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.dsl.CommonExtension import com.android.build.api.dsl.LibraryExtension -import com.android.build.gradle.TestedExtension import org.gradle.accessors.dm.LibrariesForLibs import org.gradle.api.Project import org.gradle.api.tasks.testing.Test -import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.findByType import org.gradle.kotlin.dsl.withType object AndroidCommon { fun configure(project: Project) { - project.extensions.configure<TestedExtension> { - compileSdkVersion(35) - defaultConfig { - minSdk = 26 - targetSdk = 34 - } + project.extensions.getByType(CommonExtension::class.java).apply { + compileSdk = 35 + defaultConfig.minSdk = 26 - packagingOptions { - resources.excludes.add("**/*.version") - resources.excludes.add("**/*.txt") - resources.excludes.add("**/*.kotlin_module") - resources.excludes.add("**/plugin.properties") - resources.excludes.add("**/META-INF/AL2.0") - resources.excludes.add("**/META-INF/LGPL2.1") - } + packaging.resources.excludes.add("**/*.version") + packaging.resources.excludes.add("**/*.txt") + packaging.resources.excludes.add("**/*.kotlin_module") + packaging.resources.excludes.add("**/plugin.properties") + packaging.resources.excludes.add("**/META-INF/AL2.0") + packaging.resources.excludes.add("**/META-INF/LGPL2.1") - testOptions { - animationsDisabled = true - unitTests.isReturnDefaultValues = true - } + testOptions.animationsDisabled = true + testOptions.unitTests.isReturnDefaultValues = true project.tasks.withType<Test>().configureEach { jvmArgs( @@ -49,7 +41,10 @@ object AndroidCommon { project.configureSlimTests() } - project.extensions.findByType<ApplicationExtension>()?.run { lint.configureLint(project) } + project.extensions.findByType<ApplicationExtension>()?.run { + defaultConfig.targetSdk = 34 + lint.configureLint(project) + } project.extensions.findByType<LibraryExtension>()?.run { lint.configureLint(project) } val libs = project.extensions.getByName("libs") as LibrariesForLibs project.dependencies.apply { diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/DependencyUpdatesPlugin.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/DependencyUpdatesPlugin.kt index 8dbe586f..e35a1843 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/DependencyUpdatesPlugin.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/DependencyUpdatesPlugin.kt @@ -19,7 +19,6 @@ class DependencyUpdatesPlugin : Plugin<Project> { override fun apply(project: Project) { project.pluginManager.apply(VersionCatalogUpdatePlugin::class) project.extensions.configure<VersionCatalogUpdateExtension> { - keep.keepUnusedLibraries.set(true) versionSelector { val currentVersion = Version.tryParse(it.currentVersion).getOrNull() val newVersion = Version.tryParse(it.candidate.version).getOrNull() diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinAndroidPlugin.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinAndroidPlugin.kt index 67fef255..d679abd3 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinAndroidPlugin.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinAndroidPlugin.kt @@ -11,16 +11,13 @@ import org.gradle.api.Project import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.getByType import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPluginWrapper @Suppress("Unused") class KotlinAndroidPlugin : Plugin<Project> { override fun apply(project: Project) { - project.pluginManager.run { - apply(KotlinAndroidPluginWrapper::class) - apply(KotlinCommonPlugin::class) - } + // AGP 9 compiles Kotlin itself (built-in Kotlin); only the shared compiler options remain. + project.pluginManager.apply(KotlinCommonPlugin::class) project.extensions.getByType<KotlinProjectExtension>().jvmToolchain(JVM_TOOLCHAIN_ACTION) } } diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinKaptPlugin.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinKaptPlugin.kt deleted file mode 100644 index c4d6467a..00000000 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinKaptPlugin.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright © 2014-2024 The Android Password Store Authors. All Rights Reserved. - * SPDX-License-Identifier: GPL-3.0-only - */ - -package app.passwordstore.gradle - -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.kotlin.dsl.apply -import org.gradle.kotlin.dsl.configure -import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin -import org.jetbrains.kotlin.gradle.plugin.KaptExtension - -@Suppress("Unused") -class KotlinKaptPlugin : Plugin<Project> { - - override fun apply(project: Project) { - project.pluginManager.apply(Kapt3GradleSubplugin::class) - project.afterEvaluate { - project.extensions.configure<KaptExtension> { - javacOptions { - if (hasDaggerCompilerDependency()) { - // https://dagger.dev/dev-guide/compiler-options#fastinit-mode - option("-Adagger.fastInit=enabled") - // Enable the better, experimental error messages - // https://github.com/google/dagger/commit/0d2505a727b54f47b8677f42dd4fc5c1924e37f5 - option("-Adagger.experimentalDaggerErrorMessages=enabled") - // Share test components for when we start leveraging Hilt for tests - // https://github.com/google/dagger/releases/tag/dagger-2.34 - option("-Adagger.hilt.shareTestComponents=true") - // KAPT nests errors causing real issues to be suppressed in CI logs - option("-Xmaxerrs", "500") - // Enables per-module validation for faster error detection - // https://github.com/google/dagger/commit/325b516ac6a53d3fc973d247b5231fafda9870a2 - option("-Adagger.moduleBindingValidation=ERROR") - } - } - } - } - project.tasks - .matching { it.name.startsWith("kapt") && it.name.endsWith("UnitTestKotlin") } - .configureEach { enabled = false } - } - - private fun Project.hasDaggerCompilerDependency(): Boolean { - return configurations.any { - it.dependencies.any { dependency -> dependency.name == "hilt-compiler" } - } - } -} diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/PublishedAndroidLibraryPlugin.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/PublishedAndroidLibraryPlugin.kt index 4e1ab741..055a921a 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/PublishedAndroidLibraryPlugin.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/PublishedAndroidLibraryPlugin.kt @@ -10,8 +10,6 @@ package app.passwordstore.gradle import com.vanniktech.maven.publish.AndroidMultiVariantLibrary import com.vanniktech.maven.publish.MavenPublishBaseExtension import com.vanniktech.maven.publish.MavenPublishBasePlugin -import com.vanniktech.maven.publish.SonatypeHost -import me.tylerbwong.gradle.metalava.Documentation import me.tylerbwong.gradle.metalava.extension.MetalavaExtension import org.gradle.api.Plugin import org.gradle.api.Project @@ -28,7 +26,7 @@ class PublishedAndroidLibraryPlugin : Plugin<Project> { apply("me.tylerbwong.gradle.metalava") } project.extensions.configure<MavenPublishBaseExtension> { - publishToMavenCentral(SonatypeHost.DEFAULT, true) + publishToMavenCentral(automaticRelease = true) if (project.providers.environmentVariable("CI").isPresent) { signAllPublications() } @@ -36,10 +34,7 @@ class PublishedAndroidLibraryPlugin : Plugin<Project> { pomFromGradleProperties() } project.extensions.configure<MetalavaExtension> { - documentation.set(Documentation.PUBLIC) inputKotlinNulls.set(true) - outputKotlinNulls.set(true) - reportLintsAsErrors.set(true) reportWarningsAsErrors.set(true) } } diff --git a/build-logic/src/main/kotlin/app/passwordstore/gradle/signing/AppSigning.kt b/build-logic/src/main/kotlin/app/passwordstore/gradle/signing/AppSigning.kt index f6a519c8..2a0825ed 100644 --- a/build-logic/src/main/kotlin/app/passwordstore/gradle/signing/AppSigning.kt +++ b/build-logic/src/main/kotlin/app/passwordstore/gradle/signing/AppSigning.kt @@ -5,7 +5,7 @@ package app.passwordstore.gradle.signing -import com.android.build.gradle.internal.dsl.BaseAppModuleExtension +import com.android.build.api.dsl.ApplicationExtension import java.util.Properties import org.gradle.api.Project import org.gradle.kotlin.dsl.configure @@ -17,7 +17,7 @@ private const val KEYSTORE_CONFIG_PATH = "keystore.properties" internal fun Project.configureBuildSigning() { val keystoreConfigFile = rootProject.layout.projectDirectory.file(KEYSTORE_CONFIG_PATH) if (keystoreConfigFile.asFile.exists()) { - extensions.configure<BaseAppModuleExtension> { + extensions.configure<ApplicationExtension> { val contents = providers.fileContents(keystoreConfigFile).asText val keystoreProperties = Properties() keystoreProperties.load(contents.get().byteInputStream()) @@ -30,7 +30,7 @@ internal fun Project.configureBuildSigning() { } } val signingConfig = signingConfigs.getByName("release") - buildTypes.all { setSigningConfig(signingConfig) } + buildTypes.all { this.signingConfig = signingConfig } } } } |
