diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e5ed95de..7ff7f07f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -94,21 +94,9 @@ android { } } - buildOutputs.all { - val variantOutputImpl = this as com.android.build.gradle.internal.api.BaseVariantOutputImpl - val variantName: String = variantOutputImpl.name - - if (listOf("release", "beta").any { variantName.lowercase().contains(it) }) { - val outputFileName = projectConfig.packageName + - "-v${defaultConfig.versionName}-${defaultConfig.versionCode}" + - "-${variantName.uppercase()}.apk" - - variantOutputImpl.outputFileName = outputFileName - } - } - buildFeatures { viewBinding = true + buildConfig = true } compileOptions { @@ -141,6 +129,42 @@ android { } } +androidComponents { + onVariants { variant -> + val buildType = variant.buildType ?: return@onVariants + if (buildType != "release" && buildType != "beta") return@onVariants + + val formattedVariantName = variant.name + .replace(Regex("([a-z])([A-Z])"), "$1-$2") + .uppercase() + + val apkFolder = variant.artifacts.get(com.android.build.api.artifact.SingleArtifact.APK) + val loader = variant.artifacts.getBuiltArtifactsLoader() + val packageName = projectConfig.packageName + + val renameTask = tasks.register("rename${variant.name.replaceFirstChar { it.uppercase() }}Apk") { + inputs.files(apkFolder) + outputs.upToDateWhen { false } + + doLast { + val builtArtifacts = loader.load(apkFolder.get()) ?: return@doLast + + builtArtifacts.elements.forEach { element -> + val apkFile = File(element.outputFile) + val outputFileName = "$packageName-v${element.versionName}-${element.versionCode}-$formattedVariantName.apk" + if (apkFile.exists() && apkFile.name != outputFileName) { + apkFile.copyTo(File(apkFile.parentFile, outputFileName), overwrite = true) + } + } + } + } + + tasks.matching { it.name == "assemble${variant.name.replaceFirstChar { it.uppercase() }}" }.configureEach { + finalizedBy(renameTask) + } + } +} + dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") diff --git a/build.gradle.kts b/build.gradle.kts index 3e8186c4..dce60989 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,5 @@ plugins { - id("com.google.devtools.ksp") version "2.2.10-2.0.2" apply false + id("com.google.devtools.ksp") version "2.3.2" apply false } buildscript { @@ -8,7 +8,7 @@ buildscript { mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:8.13.0") + classpath("com.android.tools.build:gradle:9.0.0") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.Kotlin.core}") classpath("com.google.dagger:hilt-android-gradle-plugin:${Versions.Dagger.core}") classpath("androidx.navigation:navigation-safe-args-gradle-plugin:${Versions.AndroidX.Navigation.core}") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 696bb9c8..35831cb0 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -18,7 +18,7 @@ repositories { } dependencies { - implementation("com.android.tools.build:gradle:8.13.0") + implementation("com.android.tools.build:gradle:9.0.0") implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10") implementation("com.squareup:javapoet:1.13.0") } diff --git a/buildSrc/src/main/java/ProjectExtensions.kt b/buildSrc/src/main/java/ProjectExtensions.kt index 6d1ed54f..77e42a26 100644 --- a/buildSrc/src/main/java/ProjectExtensions.kt +++ b/buildSrc/src/main/java/ProjectExtensions.kt @@ -7,7 +7,6 @@ import org.gradle.api.tasks.testing.TestResult import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import java.io.File -import java.io.FileInputStream import java.util.Properties val Project.projectConfig: ProjectConfig @@ -21,23 +20,35 @@ fun SigningConfig.setupCredentials( if (keyStoreFromEnv?.exists() == true) { println("Using signing data from environment variables.") + + val missingVars = listOf("STORE_PASSWORD", "KEY_ALIAS", "KEY_PASSWORD") + .filter { System.getenv(it).isNullOrBlank() } + if (missingVars.isNotEmpty()) { + println("WARNING: STORE_PATH is set but missing env vars: ${missingVars.joinToString()}") + } + storeFile = keyStoreFromEnv storePassword = System.getenv("STORE_PASSWORD") keyAlias = System.getenv("KEY_ALIAS") keyPassword = System.getenv("KEY_PASSWORD") } else { - println("Using signing data from properties file.") + println("Trying signing data from properties file: $signingPropsPath") val props = Properties().apply { - signingPropsPath?.takeIf { it.canRead() }?.let { load(FileInputStream(it)) } + signingPropsPath?.takeIf { it.canRead() }?.let { file -> + file.inputStream().use { stream -> load(stream) } + } } val keyStorePath = props.getProperty("release.storePath")?.let { File(it) } if (keyStorePath?.exists() == true) { + println("Using signing data from properties file: $signingPropsPath") storeFile = keyStorePath storePassword = props.getProperty("release.storePassword") keyAlias = props.getProperty("release.keyAlias") keyPassword = props.getProperty("release.keyPassword") + } else { + println("WARNING: No valid signing configuration found (no env vars or properties file)") } } } diff --git a/gradle.properties b/gradle.properties index 436fdad1..be057f41 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,7 +17,16 @@ org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8 android.useAndroidX=true # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official -android.defaults.buildfeatures.buildconfig=true android.nonTransitiveRClass=true android.nonFinalResIds=true -org.gradle.unsafe.configuration-cache=false \ No newline at end of file +org.gradle.unsafe.configuration-cache=false +android.defaults.buildfeatures.resvalues=true +android.sdk.defaultTargetSdkToCompileSdkIfUnset=false +android.enableAppCompileTimeRClass=false +android.usesSdkInManifest.disallowed=false +android.uniquePackageNames=false +android.dependency.useConstraints=true +android.r8.strictFullModeForKeepRules=false +android.r8.optimizedResourceShrinking=false +android.builtInKotlin=false +android.newDsl=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 57a36b5e..004bf580 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue May 16 07:17:06 CEST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists