From e5875cd8fe80e9704d0b507fee10cc1f29123eb2 Mon Sep 17 00:00:00 2001 From: David Perez Date: Wed, 11 Feb 2026 09:55:33 -0600 Subject: [PATCH] PM-31922: Remove deprecated Android block where possible (#6512) --- annotation/build.gradle.kts | 14 ++-- app/build.gradle.kts | 111 +++++++++++++++------------ authenticator/build.gradle.kts | 97 +++++++++++++---------- authenticatorbridge/build.gradle.kts | 35 +++++---- core/build.gradle.kts | 14 ++-- cxf/build.gradle.kts | 14 ++-- data/build.gradle.kts | 14 ++-- network/build.gradle.kts | 14 ++-- testharness/build.gradle.kts | 46 ++++++----- ui/build.gradle.kts | 14 ++-- 10 files changed, 225 insertions(+), 148 deletions(-) diff --git a/annotation/build.gradle.kts b/annotation/build.gradle.kts index 2c7e490d28..35a2ea67b7 100644 --- a/annotation/build.gradle.kts +++ b/annotation/build.gradle.kts @@ -1,16 +1,20 @@ +import com.android.build.api.dsl.LibraryExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { alias(libs.plugins.android.library) } -android { +configure { namespace = "com.bitwarden.annotation" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -36,6 +40,6 @@ android { kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 92ca82acaa..363e10746e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,9 +1,10 @@ -import com.android.build.gradle.internal.api.BaseVariantOutputImpl +import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.variant.impl.VariantOutputImpl import com.android.utils.cxx.io.removeExtensionIfPresent import com.google.firebase.crashlytics.buildtools.gradle.tasks.InjectMappingFileIdTask import com.google.firebase.crashlytics.buildtools.gradle.tasks.UploadMappingFileTask import com.google.gms.googleservices.GoogleServicesTask -import dagger.hilt.android.plugin.util.capitalize +import org.gradle.kotlin.dsl.support.uppercaseFirstChar import org.jetbrains.kotlin.gradle.dsl.JvmTarget import java.io.FileInputStream import java.util.Properties @@ -42,27 +43,35 @@ val ciProperties = Properties().apply { } } -android { - namespace = "com.x8bit.bitwarden" - compileSdk = libs.versions.compileSdk.get().toInt() +base { + // Set the base archive name for publishing purposes. This is used to derive the + // APK and AAB artifact names when uploading to Firebase and Play Store. + archivesName.set("com.x8bit.bitwarden") +} - room { - schemaDirectory("$projectDir/schemas") +room { + schemaDirectory("$projectDir/schemas") +} + +configure { + namespace = "com.x8bit.bitwarden" + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) } defaultConfig { applicationId = "com.x8bit.bitwarden" - minSdk = libs.versions.minSdk.get().toInt() - targetSdk = libs.versions.targetSdk.get().toInt() + minSdk { + version = release(libs.versions.minSdk.get().toInt()) + } + targetSdk { + version = release(libs.versions.targetSdk.get().toInt()) + } versionCode = libs.versions.appVersionCode.get().toInt() versionName = libs.versions.appVersionName.get() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - // Set the base archive name for publishing purposes. This is used to derive the APK and AAB - // artifact names when uploading to Firebase and Play Store. - base.archivesName = "com.x8bit.bitwarden" - buildConfigField( type = "String", name = "CI_INFO", @@ -140,39 +149,6 @@ android { } } - applicationVariants.all { - val bundlesDir = "${layout.buildDirectory.get()}/outputs/bundle" - outputs - .mapNotNull { it as? BaseVariantOutputImpl } - .forEach { output -> - val fileNameWithoutExtension = when (flavorName) { - "fdroid" -> "$applicationId-$flavorName" - "standard" -> "$applicationId" - else -> output.outputFileName.removeExtensionIfPresent(".apk") - } - - // Set the APK output filename. - output.outputFileName = "$fileNameWithoutExtension.apk" - - val variantName = name - val renameTaskName = "rename${variantName.capitalize()}AabFiles" - tasks.register(renameTaskName) { - group = "build" - description = "Renames the bundle files for $variantName variant" - doLast { - renameFile( - "$bundlesDir/$variantName/$namespace-$flavorName-${buildType.name}.aab", - "$fileNameWithoutExtension.aab", - ) - } - } - // Force renaming task to execute after the variant is built. - tasks - .getByName("bundle${variantName.capitalize()}") - .finalizedBy(renameTaskName) - } - } - compileOptions { sourceCompatibility(libs.versions.jvmTarget.get()) targetCompatibility(libs.versions.jvmTarget.get()) @@ -199,9 +175,50 @@ android { } } +androidComponents { + onVariants { appVariant -> + val bundlesDir = "${layout.buildDirectory.get()}/outputs/bundle" + val applicationId = appVariant.applicationId.get() + val flavorName = appVariant.flavorName + val variantName = appVariant.name + val buildType = appVariant.buildType + appVariant + .outputs + .mapNotNull { it as? VariantOutputImpl } + .forEach { output -> + val fileNameWithoutExtension = when (flavorName) { + "fdroid" -> "$applicationId-$flavorName" + "standard" -> applicationId + else -> output.outputFileName.get().removeExtensionIfPresent(".apk") + } + + // Set the APK output filename. + output.outputFileName.set("$fileNameWithoutExtension.apk") + + val renameTaskName = "rename${variantName.uppercaseFirstChar()}AabFiles" + tasks.register(renameTaskName) { + group = "build" + description = "Renames the bundle files for $variantName variant" + doLast { + val namespace = appVariant.namespace.get() + renameFile( + "$bundlesDir/$variantName/$namespace-$flavorName-$buildType.aab", + "$fileNameWithoutExtension.aab", + ) + } + } + // Force renaming task to execute after the variant is built. + val bundleTaskName = "bundle${variantName.uppercaseFirstChar()}" + tasks + .named { it == bundleTaskName } + .configureEach { finalizedBy(renameTaskName) } + } + } +} + kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/authenticator/build.gradle.kts b/authenticator/build.gradle.kts index 62381e0a97..7d32a53abc 100644 --- a/authenticator/build.gradle.kts +++ b/authenticator/build.gradle.kts @@ -1,6 +1,7 @@ -import com.android.build.gradle.internal.api.BaseVariantOutputImpl +import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.variant.impl.VariantOutputImpl import com.google.protobuf.gradle.proto -import dagger.hilt.android.plugin.util.capitalize +import org.gradle.kotlin.dsl.support.uppercaseFirstChar import org.jetbrains.kotlin.gradle.dsl.JvmTarget import java.io.FileInputStream import java.util.Properties @@ -29,27 +30,35 @@ val ciProperties = Properties().apply { } } -android { - namespace = "com.bitwarden.authenticator" - compileSdk = libs.versions.compileSdk.get().toInt() +base { + // Set the base archive name for publishing purposes. This is used to derive the + // APK and AAB artifact names when uploading to Firebase and Play Store. + archivesName.set("com.bitwarden.authenticator") +} - room { - schemaDirectory("$projectDir/schemas") +room { + schemaDirectory("$projectDir/schemas") +} + +configure { + namespace = "com.bitwarden.authenticator" + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) } defaultConfig { applicationId = "com.bitwarden.authenticator" - minSdk = libs.versions.minSdkBwa.get().toInt() - targetSdk = libs.versions.targetSdk.get().toInt() + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } + targetSdk { + version = release(libs.versions.targetSdk.get().toInt()) + } versionCode = libs.versions.appVersionCode.get().toInt() versionName = libs.versions.appVersionName.get() testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - // Set the base archive name for publishing purposes. This is used to derive the APK and AAB - // artifact names when uploading to Firebase and Play Store. - base.archivesName = "com.bitwarden.authenticator" - buildConfigField( type = "String", name = "CI_INFO", @@ -108,32 +117,6 @@ android { buildConfigField(type = "boolean", name = "HAS_DEBUG_MENU", value = "false") } } - applicationVariants.all { - val bundlesDir = "${layout.buildDirectory.get()}/outputs/bundle" - outputs - .mapNotNull { it as? BaseVariantOutputImpl } - .forEach { output -> - // Set the APK output filename. - output.outputFileName = "$applicationId.apk" - - val variantName = name - val renameTaskName = "rename${variantName.capitalize()}AabFiles" - tasks.register(renameTaskName) { - group = "build" - description = "Renames the bundle files for $variantName variant" - doLast { - renameFile( - "$bundlesDir/$variantName/$namespace-${buildType.name}.aab", - "$applicationId.aab", - ) - } - } - // Force renaming task to execute after the variant is built. - tasks - .getByName("bundle${variantName.capitalize()}") - .finalizedBy(renameTaskName) - } - } compileOptions { sourceCompatibility(libs.versions.jvmTarget.get()) targetCompatibility(libs.versions.jvmTarget.get()) @@ -167,9 +150,43 @@ android { } } +androidComponents { + onVariants { appVariant -> + val bundlesDir = "${layout.buildDirectory.get()}/outputs/bundle" + val applicationId = appVariant.applicationId.get() + val variantName = appVariant.name + val buildType = appVariant.buildType + appVariant + .outputs + .mapNotNull { it as? VariantOutputImpl } + .forEach { output -> + // Set the APK output filename. + output.outputFileName.set("$applicationId.apk") + + val renameTaskName = "rename${variantName.uppercaseFirstChar()}AabFiles" + tasks.register(renameTaskName) { + group = "build" + description = "Renames the bundle files for $variantName variant" + doLast { + val namespace = appVariant.namespace.get() + renameFile( + "$bundlesDir/$variantName/$namespace-$buildType.aab", + "$applicationId.aab", + ) + } + } + // Force renaming task to execute after the variant is built. + val bundleTaskName = "bundle${variantName.uppercaseFirstChar()}" + tasks + .named { it == bundleTaskName } + .configureEach { finalizedBy(renameTaskName) } + } + } +} + kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/authenticatorbridge/build.gradle.kts b/authenticatorbridge/build.gradle.kts index 9146020b1b..086891020f 100644 --- a/authenticatorbridge/build.gradle.kts +++ b/authenticatorbridge/build.gradle.kts @@ -1,3 +1,6 @@ +import com.android.build.api.dsl.LibraryExtension +import com.android.build.gradle.tasks.BundleAar +import org.gradle.kotlin.dsl.support.uppercaseFirstChar import org.jetbrains.kotlin.gradle.dsl.JvmTarget // For more info on versioning, see the README. @@ -9,14 +12,18 @@ plugins { alias(libs.plugins.kotlin.serialization) } -android { +configure { namespace = "com.bitwarden.authenticatorbridge" - compileSdk = libs.versions.compileSdk.get().toInt() + setVersion(version) + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { // This min value is selected to accommodate known consumers - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") buildConfigField("String", "VERSION", "\"$version\"") @@ -39,21 +46,23 @@ android { buildConfig = true aidl = true } - // Add version name to the output .aar file: - libraryVariants.all { - val variant = this - outputs - .map { it as com.android.build.gradle.internal.api.BaseVariantOutputImpl } - .forEach { output -> - val outputFileName = "authenticatorbridge-$version-${variant.baseName}.aar" - output.outputFileName = outputFileName +} + +androidComponents { + onVariants { libVariant -> + val bundleTaskName = "bundle${libVariant.name.uppercaseFirstChar()}Aar" + tasks + .withType() + .named { it == bundleTaskName } + .configureEach { + archiveFileName.set("authenticatorbridge-$version-${libVariant.name}.aar") } } } kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/core/build.gradle.kts b/core/build.gradle.kts index bcb821c88e..6a82c3b521 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,3 +1,4 @@ +import com.android.build.api.dsl.LibraryExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -7,15 +8,18 @@ plugins { alias(libs.plugins.ksp) } -android { +configure { namespace = "com.bitwarden.core" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { // Set the minimum SDK version to the SDK version used by Authenticator, which is the lowest // universally supported SDK version. - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -64,6 +68,6 @@ dependencies { kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/cxf/build.gradle.kts b/cxf/build.gradle.kts index 075523dfc0..0eda94a723 100644 --- a/cxf/build.gradle.kts +++ b/cxf/build.gradle.kts @@ -1,3 +1,4 @@ +import com.android.build.api.dsl.LibraryExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -7,13 +8,16 @@ plugins { alias(libs.plugins.kotlin.serialization) } -android { +configure { namespace = "com.bitwarden.cxf" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -35,7 +39,7 @@ android { kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 6b287deabf..5f7d82e743 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -1,3 +1,4 @@ +import com.android.build.api.dsl.LibraryExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -7,13 +8,16 @@ plugins { alias(libs.plugins.ksp) } -android { +configure { namespace = "com.bitwarden.data" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -39,7 +43,7 @@ android { kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/network/build.gradle.kts b/network/build.gradle.kts index 56dce52b9a..02f78ca548 100644 --- a/network/build.gradle.kts +++ b/network/build.gradle.kts @@ -1,3 +1,4 @@ +import com.android.build.api.dsl.LibraryExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -6,13 +7,16 @@ plugins { alias(libs.plugins.ksp) } -android { +configure { namespace = "com.bitwarden.network" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -38,7 +42,7 @@ android { kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/testharness/build.gradle.kts b/testharness/build.gradle.kts index ba806a7374..28d6359d8b 100644 --- a/testharness/build.gradle.kts +++ b/testharness/build.gradle.kts @@ -1,4 +1,5 @@ -import com.android.build.gradle.internal.api.BaseVariantOutputImpl +import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.variant.impl.VariantOutputImpl import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -10,15 +11,21 @@ plugins { alias(libs.plugins.ksp) } -android { +configure { namespace = "com.bitwarden.testharness" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { applicationId = "com.bitwarden.testharness" // API 28 - CredentialManager with Play Services support - minSdk = libs.versions.minSdkBwa.get().toInt() - targetSdk = libs.versions.targetSdk.get().toInt() + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } + targetSdk { + version = release(libs.versions.targetSdk.get().toInt()) + } versionCode = libs.versions.appVersionCode.get().toInt() versionName = libs.versions.appVersionName.get() @@ -39,15 +46,6 @@ android { } } - applicationVariants.all { - outputs - .mapNotNull { it as? BaseVariantOutputImpl } - .forEach { output -> - // Set the APK output filename. - output.outputFileName = "$applicationId.apk" - } - } - buildFeatures { compose = true buildConfig = true @@ -63,11 +61,23 @@ android { sourceCompatibility(libs.versions.jvmTarget.get()) targetCompatibility(libs.versions.jvmTarget.get()) } +} - kotlin { - compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) - } +androidComponents { + onVariants { appVariant -> + appVariant + .outputs + .mapNotNull { it as? VariantOutputImpl } + .forEach { output -> + // Set the APK output filename. + output.outputFileName.set("${appVariant.applicationId.get()}.apk") + } + } +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } } diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index b4b6f3978c..2f74e65b16 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -1,3 +1,4 @@ +import com.android.build.api.dsl.LibraryExtension import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { @@ -7,13 +8,16 @@ plugins { alias(libs.plugins.ksp) } -android { +configure { namespace = "com.bitwarden.ui" - compileSdk = libs.versions.compileSdk.get().toInt() + compileSdk { + version = release(libs.versions.compileSdk.get().toInt()) + } defaultConfig { - minSdk = libs.versions.minSdkBwa.get().toInt() - + minSdk { + version = release(libs.versions.minSdkBwa.get().toInt()) + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -109,7 +113,7 @@ dependencies { kotlin { compilerOptions { - jvmTarget = JvmTarget.fromTarget(libs.versions.jvmTarget.get()) + jvmTarget.set(JvmTarget.fromTarget(libs.versions.jvmTarget.get())) } }