Skip to content

Commit 6a72740

Browse files
committed
Add a way to disable Compose mapping tasks from gradle plugin
Gates the feature in case of unexpected breakages. Fixes: KT-81827
1 parent a55561e commit 6a72740

File tree

5 files changed

+58
-2
lines changed

5 files changed

+58
-2
lines changed

libraries/tools/kotlin-compose-compiler/src/common/kotlin/org/jetbrains/kotlin/compose/compiler/gradle/ComposeCompilerGradlePluginExtension.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,4 +230,14 @@ abstract class ComposeCompilerGradlePluginExtension @Inject internal constructor
230230
if (nonSkippingGroupsOptimization) features + ComposeFeatureFlag.OptimizeNonSkippingGroups else features
231231
}
232232
)
233+
234+
/**
235+
* Enable addition of Compose-specific entries to the proguard mapping file
236+
* produced by optimizers (such as R8) when compiling Android applications.
237+
* These entries are used to deobfuscate group key based Compose stack traces
238+
* in minified applications.
239+
*
240+
* Enabled by default.
241+
*/
242+
val includeComposeMappingFile: Property<Boolean> = objectFactory.property(Boolean::class.java).convention(true)
233243
}

libraries/tools/kotlin-compose-compiler/src/common/kotlin/org/jetbrains/kotlin/compose/compiler/gradle/ComposeCompilerSubplugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class ComposeCompilerGradleSubplugin : KotlinCompilerPluginSupportPlugin {
3232

3333
override fun apply(target: Project) {
3434
composeExtension = target.extensions.create("composeCompiler", ComposeCompilerGradlePluginExtension::class.java)
35-
target.configureComposeMappingFile()
35+
target.configureComposeMappingFile(composeExtension)
3636
}
3737

3838
override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean {

libraries/tools/kotlin-compose-compiler/src/common/kotlin/org/jetbrains/kotlin/compose/compiler/gradle/internal/ComposeAgpMappingFile.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@ import org.gradle.work.DisableCachingByDefault
2626
import org.gradle.workers.WorkAction
2727
import org.gradle.workers.WorkParameters
2828
import org.gradle.workers.WorkerExecutor
29+
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
2930
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
3031
import java.security.MessageDigest
3132
import java.util.Locale.getDefault
3233
import java.util.zip.ZipFile
3334
import javax.inject.Inject
3435

3536

36-
internal fun Project.configureComposeMappingFile() {
37+
internal fun Project.configureComposeMappingFile(composeExtension: ComposeCompilerGradlePluginExtension) {
3738
plugins.withId("com.android.application") {
3839
val configuration = configurations.maybeCreate("composeMappingProducerClasspath")
3940
.also {
@@ -46,6 +47,7 @@ internal fun Project.configureComposeMappingFile() {
4647
}
4748

4849
extensions.findByType<ApplicationAndroidComponentsExtension>()?.onVariants { variant ->
50+
if (!composeExtension.includeComposeMappingFile.get()) return@onVariants
4951
if (!variant.isMinifyEnabled) return@onVariants
5052

5153
val name = variant.name.capitalize()

libraries/tools/kotlin-gradle-plugin-integration-tests/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ dependencies {
130130
testApi(project(":compiler:tests-mutes:mutes-junit5"))
131131

132132
testCompileOnly(libs.intellij.asm)
133+
134+
testImplementation(project(":compose-compiler-gradle-plugin"))
133135
}
134136

135137
tasks.register<Delete>("cleanTestKitCache") {

libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ComposeIT.kt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import org.gradle.api.logging.LogLevel
1010
import org.gradle.api.logging.configuration.WarningMode
1111
import org.gradle.kotlin.dsl.getByType
1212
import org.gradle.util.GradleVersion
13+
import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension
1314
import org.jetbrains.kotlin.gradle.testbase.*
1415
import org.jetbrains.kotlin.test.TestMetadata
1516
import org.junit.jupiter.api.DisplayName
@@ -717,6 +718,47 @@ class ComposeIT : KGPBaseTest() {
717718
}
718719
}
719720

721+
@DisplayName("Minified app with disabled mapping does not run Compose tasks.")
722+
@AndroidGradlePluginTests
723+
@GradleAndroidTest
724+
@DisabledOnOs(
725+
OS.WINDOWS, disabledReason = "AGP contains a bug that prevents test output files from being cleaned up on Windows. " +
726+
"See: https://issuetracker.google.com/issues/445967244"
727+
)
728+
@TestMetadata("AndroidSimpleComposeApp")
729+
fun testMinifyWithComposeDisabled(
730+
gradleVersion: GradleVersion,
731+
agpVersion: String,
732+
providedJdk: JdkVersions.ProvidedJdk
733+
) {
734+
project(
735+
projectName = "AndroidSimpleComposeApp",
736+
gradleVersion = gradleVersion,
737+
buildJdk = providedJdk.location,
738+
buildOptions = defaultBuildOptions
739+
.copy(androidVersion = agpVersion)
740+
.suppressAgpWarningSinceGradle814(gradleVersion, WarningMode.None),
741+
) {
742+
buildScriptInjection {
743+
val appExtension = project.extensions.getByType<ApplicationAndroidComponentsExtension>()
744+
appExtension.beforeVariants {
745+
if (it.name == "release") {
746+
it.isMinifyEnabled = true
747+
}
748+
}
749+
val composeExtension = project.extensions.getByType<ComposeCompilerGradlePluginExtension>()
750+
composeExtension.includeComposeMappingFile.set(false)
751+
}
752+
753+
build("assembleRelease") {
754+
assertTasksAreNotInTaskGraph(
755+
":produceReleaseComposeMapping",
756+
":mergeReleaseComposeMapping"
757+
)
758+
}
759+
}
760+
}
761+
720762
private fun Path.appendComposePlugin() {
721763
modify { originalBuildScript ->
722764
"""

0 commit comments

Comments
 (0)