aboutsummaryrefslogtreecommitdiffstats
path: root/build-logic/src
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-11-02 11:09:19 +0100
committerDanilo M. <danix@danix.xyz>2026-11-02 11:09:19 +0100
commit5cb29988d8ebb4c9625af6452f7931d0e68d1cb7 (patch)
treede206444c7c6eca3627c0cd006619770ec253052 /build-logic/src
parent9eec620a4d95c4e3217f0868af0fc7f7bada5c91 (diff)
downloadHardenedPass-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/src')
-rw-r--r--build-logic/src/main/kotlin/app/passwordstore/gradle/AndroidCommon.kt37
-rw-r--r--build-logic/src/main/kotlin/app/passwordstore/gradle/DependencyUpdatesPlugin.kt1
-rw-r--r--build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinAndroidPlugin.kt7
-rw-r--r--build-logic/src/main/kotlin/app/passwordstore/gradle/KotlinKaptPlugin.kt51
-rw-r--r--build-logic/src/main/kotlin/app/passwordstore/gradle/PublishedAndroidLibraryPlugin.kt7
-rw-r--r--build-logic/src/main/kotlin/app/passwordstore/gradle/signing/AppSigning.kt6
6 files changed, 22 insertions, 87 deletions
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 }
}
}
}