Skip to content

Commit 2ea612f

Browse files
authored
Fix circular dependency for minify/dexguard (#678)
* Properly setup minify task dependencies * Update Changelog * Setup DexGuard with mergeDex<Variant> task
1 parent 20281b5 commit 2ea612f

File tree

7 files changed

+62
-51
lines changed

7 files changed

+62
-51
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Fixes
66
- Do not pollute build classpath with groovy dependencies ([#677](https://github.com/getsentry/sentry-android-gradle-plugin/pull/677))
77
- Ensure sentry-cli works well with configuration cache ([#675](https://github.com/getsentry/sentry-android-gradle-plugin/pull/675))
8+
- Fix circular task dependency in combination with DexGuard plugin ([#678](https://github.com/getsentry/sentry-android-gradle-plugin/pull/678))
89

910
### Dependencies
1011

plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import io.sentry.android.gradle.telemetry.withSentryTelemetry
3333
import io.sentry.android.gradle.transforms.MetaInfStripTransform
3434
import io.sentry.android.gradle.util.AgpVersions
3535
import io.sentry.android.gradle.util.AgpVersions.isAGP74
36+
import io.sentry.android.gradle.util.GroovyCompat
3637
import io.sentry.android.gradle.util.ReleaseInfo
3738
import io.sentry.android.gradle.util.SentryPluginUtils.isMinificationEnabled
3839
import io.sentry.android.gradle.util.SentryPluginUtils.isVariantAllowed
@@ -396,8 +397,17 @@ private fun Variant.configureProguardMappingsTasks(
396397
taskSuffix = name.capitalized,
397398
releaseInfo = releaseInfo
398399
)
399-
generateUuidTask.hookWithMinifyTasks(project, name, dexguardEnabled)
400-
uploadMappingsTask.hookWithMinifyTasks(project, name, dexguardEnabled)
400+
401+
generateUuidTask.hookWithMinifyTasks(
402+
project,
403+
name,
404+
dexguardEnabled && GroovyCompat.isDexguardEnabledForVariant(project, name)
405+
)
406+
407+
uploadMappingsTask.hookWithAssembleTasks(
408+
project,
409+
variant
410+
)
401411

402412
return generateUuidTask
403413
} else {

plugin-build/src/main/kotlin/io/sentry/android/gradle/AppConfig.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import io.sentry.android.gradle.tasks.dependencies.SentryExternalDependenciesRep
2121
import io.sentry.android.gradle.telemetry.SentryTelemetryService
2222
import io.sentry.android.gradle.util.AgpVersions
2323
import io.sentry.android.gradle.util.AgpVersions.isAGP74
24+
import io.sentry.android.gradle.util.GroovyCompat
2425
import io.sentry.android.gradle.util.ReleaseInfo
2526
import io.sentry.android.gradle.util.SentryPluginUtils.isMinificationEnabled
2627
import io.sentry.android.gradle.util.SentryPluginUtils.isVariantAllowed
@@ -339,8 +340,16 @@ private fun ApplicationVariant.configureProguardMappingsTasks(
339340
releaseInfo = releaseInfo,
340341
sentryUrl = extension.url
341342
)
342-
generateUuidTask.hookWithMinifyTasks(project, name, dexguardEnabled)
343-
uploadMappingsTask.hookWithMinifyTasks(project, name, dexguardEnabled)
343+
generateUuidTask.hookWithMinifyTasks(
344+
project,
345+
name,
346+
dexguardEnabled && GroovyCompat.isDexguardEnabledForVariant(project, name)
347+
)
348+
349+
uploadMappingsTask.hookWithAssembleTasks(
350+
project,
351+
variant
352+
)
344353

345354
return generateUuidTask
346355
} else {

plugin-build/src/main/kotlin/io/sentry/android/gradle/SentryTasksProvider.kt

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package io.sentry.android.gradle
22

33
import com.android.build.gradle.api.ApplicationVariant
44
import com.android.build.gradle.tasks.MergeSourceSetFolders
5-
import io.sentry.android.gradle.SentryTasksProvider.capitalized
65
import io.sentry.android.gradle.util.GroovyCompat.isDexguardAvailable
76
import io.sentry.android.gradle.util.SentryPluginUtils.capitalizeUS
87
import io.sentry.gradle.common.SentryVariant
@@ -17,28 +16,30 @@ import org.gradle.api.tasks.TaskProvider
1716
internal object SentryTasksProvider {
1817

1918
/**
20-
* Returns the transformer task for the given project and variant.
21-
* It could be either ProGuard or R8
19+
* Returns the minify task for the given project and variant.
20+
* It could be either ProGuard, R8 or DexGuard.
2221
*
2322
* @return the task or null otherwise
2423
*/
2524
@JvmStatic
26-
fun getTransformerTask(
25+
fun getMinifyTask(
2726
project: Project,
2827
variantName: String,
2928
dexguardEnabled: Boolean = false
3029
): TaskProvider<Task>? {
31-
val taskList = mutableListOf<String>()
32-
if (dexguardEnabled) {
30+
val tasks = if (dexguardEnabled) {
3331
// We prioritize the Guardsquare's Proguard task towards the AGP ones.
34-
taskList.add(
35-
"transformClassesAndResourcesWithProguardTransformFor${variantName.capitalized}"
32+
listOf(
33+
"transformClassesAndResourcesWithProguardTransformFor${variantName.capitalized}",
34+
"mergeDex${variantName.capitalized}"
35+
)
36+
} else {
37+
listOf(
38+
"minify${variantName.capitalized}WithR8",
39+
"minify${variantName.capitalized}WithProguard"
3640
)
3741
}
38-
// AGP 3.3 includes the R8 shrinker.
39-
taskList.add("minify${variantName.capitalized}WithR8")
40-
taskList.add("minify${variantName.capitalized}WithProguard")
41-
return project.findTask(taskList)
42+
return project.findTask(tasks)
4243
}
4344

4445
/**
@@ -174,6 +175,9 @@ internal object SentryTasksProvider {
174175
@JvmStatic
175176
fun getProcessResourcesProvider(project: Project) = project.findTask(listOf("processResources"))
176177

178+
/**
179+
* @return the first task found in the list or null
180+
*/
177181
private fun Project.findTask(taskName: List<String>): TaskProvider<Task>? =
178182
taskName
179183
.mapNotNull {

plugin-build/src/main/kotlin/io/sentry/android/gradle/util/tasks.kt

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package io.sentry.android.gradle.util
22

3-
import io.sentry.android.gradle.SentryTasksProvider.capitalized
43
import io.sentry.android.gradle.SentryTasksProvider.getAssembleTaskProvider
54
import io.sentry.android.gradle.SentryTasksProvider.getBundleTask
65
import io.sentry.android.gradle.SentryTasksProvider.getInstallTaskProvider
6+
import io.sentry.android.gradle.SentryTasksProvider.getMinifyTask
77
import io.sentry.android.gradle.SentryTasksProvider.getPackageBundleTask
88
import io.sentry.android.gradle.SentryTasksProvider.getPackageProvider
99
import io.sentry.android.gradle.SentryTasksProvider.getPreBundleTask
10-
import io.sentry.android.gradle.SentryTasksProvider.getTransformerTask
1110
import io.sentry.android.gradle.util.SentryPluginUtils.withLogging
1211
import io.sentry.gradle.common.SentryVariant
1312
import org.gradle.api.Project
@@ -22,28 +21,15 @@ fun TaskProvider<out Task>.hookWithMinifyTasks(
2221
// we need to wait for project evaluation to have all tasks available, otherwise the new
2322
// AndroidComponentsExtension is configured too early to look up for the tasks
2423
project.afterEvaluate {
25-
val transformerTaskProvider = withLogging(project.logger, "transformerTask") {
26-
getTransformerTask(
27-
project,
28-
variantName,
29-
dexguardEnabled
30-
)
31-
}
24+
val minifyTask = getMinifyTask(
25+
project,
26+
variantName,
27+
dexguardEnabled
28+
)
3229

33-
if (dexguardEnabled &&
34-
GroovyCompat.isDexguardEnabledForVariant(project, variantName)
35-
) {
36-
project.tasks.named(
37-
"dexguardApk${variantName.capitalized}"
38-
).configure { it.finalizedBy(this) }
39-
project.tasks.named(
40-
"dexguardAab${variantName.capitalized}"
41-
).configure { it.finalizedBy(this) }
42-
} else {
43-
// we just hack ourselves into the Proguard/R8 task's doLast.
44-
transformerTaskProvider?.configure {
45-
it.finalizedBy(this)
46-
}
30+
// we just hack ourselves into the Proguard/R8/DexGuard task's doLast.
31+
minifyTask?.configure {
32+
it.finalizedBy(this)
4733
}
4834
}
4935
}

plugin-build/src/test/kotlin/io/sentry/android/gradle/SentryTaskProviderTest.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import io.sentry.android.gradle.SentryTasksProvider.getInstallTaskProvider
77
import io.sentry.android.gradle.SentryTasksProvider.getLintVitalAnalyzeProvider
88
import io.sentry.android.gradle.SentryTasksProvider.getLintVitalReportProvider
99
import io.sentry.android.gradle.SentryTasksProvider.getMergeAssetsProvider
10+
import io.sentry.android.gradle.SentryTasksProvider.getMinifyTask
1011
import io.sentry.android.gradle.SentryTasksProvider.getPackageBundleTask
1112
import io.sentry.android.gradle.SentryTasksProvider.getPackageProvider
1213
import io.sentry.android.gradle.SentryTasksProvider.getPreBundleTask
1314
import io.sentry.android.gradle.SentryTasksProvider.getProcessResourcesProvider
14-
import io.sentry.android.gradle.SentryTasksProvider.getTransformerTask
1515
import io.sentry.gradle.common.SentryVariant
1616
import kotlin.test.assertEquals
1717
import kotlin.test.assertNull
@@ -32,7 +32,7 @@ class SentryTaskProviderTest {
3232
fun `getTransformerTask returns null for missing task`() {
3333
val project = ProjectBuilder.builder().build()
3434

35-
assertNull(getTransformerTask(project, "debug")?.get())
35+
assertNull(getMinifyTask(project, "debug"))
3636
}
3737

3838
@Test
@@ -43,11 +43,11 @@ class SentryTaskProviderTest {
4343

4444
assertEquals(
4545
task,
46-
getTransformerTask(
46+
getMinifyTask(
4747
project,
4848
"debug",
4949
dexguardEnabled = true
50-
)?.get()
50+
)!!.get()
5151
)
5252
}
5353

@@ -58,7 +58,7 @@ class SentryTaskProviderTest {
5858
)
5959

6060
assertNull(
61-
getTransformerTask(
61+
getMinifyTask(
6262
project,
6363
"debug",
6464
dexguardEnabled = false
@@ -70,14 +70,14 @@ class SentryTaskProviderTest {
7070
fun `getTransformerTask returns minify for R8`() {
7171
val (project, task) = getTestProjectWithTask("minifyDebugWithR8")
7272

73-
assertEquals(task, getTransformerTask(project, "debug")?.get())
73+
assertEquals(task, getMinifyTask(project, "debug")!!.get())
7474
}
7575

7676
@Test
7777
fun `getTransformerTask returns minify for embedded Proguard`() {
7878
val (project, task) = getTestProjectWithTask("minifyDebugWithProguard")
7979

80-
assertEquals(task, getTransformerTask(project, "debug")?.get())
80+
assertEquals(task, getMinifyTask(project, "debug")!!.get())
8181
}
8282

8383
@Test
@@ -87,11 +87,11 @@ class SentryTaskProviderTest {
8787

8888
assertEquals(
8989
"transformClassesAndResourcesWithProguardTransformForDebug",
90-
getTransformerTask(
90+
getMinifyTask(
9191
project,
9292
"debug",
9393
dexguardEnabled = true
94-
)?.get()?.name
94+
)!!.name
9595
)
9696
}
9797

@@ -102,11 +102,11 @@ class SentryTaskProviderTest {
102102

103103
assertEquals(
104104
r8task,
105-
getTransformerTask(
105+
getMinifyTask(
106106
project,
107107
"debug",
108108
dexguardEnabled = false
109-
)?.get()
109+
)!!.get()
110110
)
111111
}
112112

plugin-build/src/test/kotlin/io/sentry/android/gradle/integration/SentryPluginTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,9 @@ class SentryPluginTest :
202202
val uuid2 = verifyProguardUuid(testProjectDir.root)
203203

204204
assertEquals(
205+
TaskOutcome.UP_TO_DATE,
205206
build.task(":app:generateSentryProguardUuidRelease")?.outcome,
206-
TaskOutcome.UP_TO_DATE
207+
build.output
207208
)
208209

209210
assertEquals(uuid1, uuid2)

0 commit comments

Comments
 (0)