From fea6620c3fc86837d8711eb99acf7eef2a5675a7 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Mon, 23 Mar 2026 18:08:39 +0100 Subject: [PATCH 1/2] fix(android): Wire dependencies report through asset transform task Instead of using `addGeneratedSourceDirectory` to add the dependencies report to the asset source set, wire it through the existing `InjectSentryMetaPropertiesIntoAssetsTask` which already transforms `SingleArtifact.ASSETS`. This avoids exposing a task-backed `Provider` via `variant.sources.assets?.all`, which causes errors when other plugins (like Paparazzi) try to resolve it during configuration. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../android/gradle/AndroidComponentsConfig.kt | 9 ++++++--- ...njectSentryMetaPropertiesIntoAssetsTask.kt | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt index 711097cb8..759e274ba 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/AndroidComponentsConfig.kt @@ -83,7 +83,8 @@ fun ApplicationAndroidComponentsExtension.configure( val sentryTelemetryProvider = variant.configureTelemetry(project, extension, cliExecutable, sentryOrg, buildEvents) - variant.configureDependenciesTask(project, extension, sentryTelemetryProvider) + val reportDependenciesTask = + variant.configureDependenciesTask(project, extension, sentryTelemetryProvider) // TODO: do this only once, and all other tasks should be SentryVariant.configureSomething val sentryVariant = AndroidVariant74(variant) @@ -164,6 +165,7 @@ fun ApplicationAndroidComponentsExtension.configure( sentryTelemetryProvider, tasksGeneratingProperties, variant.name.capitalized, + reportDependenciesTask, ) assetsWiredWithDirectories( @@ -338,7 +340,7 @@ private fun Variant.configureDependenciesTask( project: Project, extension: SentryPluginExtension, sentryTelemetryProvider: Provider, -) { +): TaskProvider? { if (extension.includeDependenciesReport.get()) { val reportDependenciesTask = SentryExternalDependenciesReportTaskV2.register( @@ -350,8 +352,9 @@ private fun Variant.configureDependenciesTask( includeReport = extension.includeDependenciesReport, taskSuffix = name.capitalized, ) - sources.assets?.addGeneratedSourceDirectory(reportDependenciesTask) { task -> task.output } + return reportDependenciesTask } + return null } private fun ApplicationVariant.configureProguardMappingsTasks( diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/InjectSentryMetaPropertiesIntoAssetsTask.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/InjectSentryMetaPropertiesIntoAssetsTask.kt index f06cdb108..689345330 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/InjectSentryMetaPropertiesIntoAssetsTask.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/InjectSentryMetaPropertiesIntoAssetsTask.kt @@ -20,6 +20,7 @@ package io.sentry.android.gradle.tasks import io.sentry.android.gradle.extensions.SentryPluginExtension import io.sentry.android.gradle.sourcecontext.getAndDelete +import io.sentry.android.gradle.tasks.dependencies.SentryExternalDependenciesReportTaskV2 import io.sentry.android.gradle.telemetry.SentryTelemetryService import io.sentry.android.gradle.telemetry.withSentryTelemetry import io.sentry.android.gradle.util.PropertiesUtil @@ -33,6 +34,7 @@ import org.gradle.api.file.RegularFile import org.gradle.api.provider.Provider import org.gradle.api.tasks.CacheableTask import org.gradle.api.tasks.InputFiles +import org.gradle.api.tasks.Optional import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.PathSensitive import org.gradle.api.tasks.PathSensitivity @@ -72,6 +74,11 @@ abstract class InjectSentryMetaPropertiesIntoAssetsTask : DefaultTask() { @get:InputFiles abstract val inputPropertyFiles: ConfigurableFileCollection + @get:PathSensitive(PathSensitivity.NONE) + @get:InputFiles + @get:Optional + abstract val dependenciesReportDir: DirectoryProperty + @TaskAction fun taskAction() { val input = inputDir.get().asFile @@ -80,6 +87,14 @@ abstract class InjectSentryMetaPropertiesIntoAssetsTask : DefaultTask() { input.copyRecursively(output, overwrite = true) + // Copy the dependencies report if present + val depReportDir = dependenciesReportDir.orNull?.asFile + if (depReportDir != null && depReportDir.exists()) { + depReportDir.listFiles()?.forEach { file -> + file.copyTo(File(output, file.name), overwrite = true) + } + } + // skip writing the properties file if there are no input property files // this avoids generating an empty properties file when all Sentry features are disabled if (inputPropertyFiles.isEmpty) { @@ -108,6 +123,7 @@ abstract class InjectSentryMetaPropertiesIntoAssetsTask : DefaultTask() { sentryTelemetryProvider: Provider?, tasksGeneratingProperties: List>, taskSuffix: String = "", + reportDependenciesTask: TaskProvider? = null, ): TaskProvider { val inputFiles: List> = tasksGeneratingProperties.mapNotNull { it.flatMap { task -> task.outputFile } } @@ -116,6 +132,9 @@ abstract class InjectSentryMetaPropertiesIntoAssetsTask : DefaultTask() { InjectSentryMetaPropertiesIntoAssetsTask::class.java, ) { task -> task.inputPropertyFiles.setFrom(inputFiles) + reportDependenciesTask?.let { depTask -> + task.dependenciesReportDir.set(depTask.flatMap { it.output }) + } task.withSentryTelemetry(extension, sentryTelemetryProvider) } From 941c8ae2042025d8ffa5540a5e5d586310ab7219 Mon Sep 17 00:00:00 2001 From: Nelson Osacky Date: Tue, 24 Mar 2026 10:33:46 +0100 Subject: [PATCH 2/2] fix(android): Set default output directory for dependencies report task The removal of `addGeneratedSourceDirectory` left the `output` DirectoryProperty unset when no explicit output was provided, causing a `MissingValueException` at task execution time. Co-Authored-By: Claude Opus 4.6 (1M context) --- CHANGELOG.md | 4 ++++ .../SentryExternalDependenciesReportTaskV2.kt | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cc8d852d..a201ce6cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - (Experimental) Wire VCS info extension to snapshot uploads for git metadata support ([#1102](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1102)) +### Fixes + +- Fix `includeDependenciesReport` failing with `MissingValueException` due to unset output directory ([#1115](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1115)) + ### Dependencies - Bump CLI from v3.3.2 to v3.3.3 ([#1101](https://github.com/getsentry/sentry-android-gradle-plugin/pull/1101)) diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/dependencies/SentryExternalDependenciesReportTaskV2.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/dependencies/SentryExternalDependenciesReportTaskV2.kt index 42c09db5d..4057d9981 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/dependencies/SentryExternalDependenciesReportTaskV2.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/tasks/dependencies/SentryExternalDependenciesReportTaskV2.kt @@ -72,7 +72,15 @@ abstract class SentryExternalDependenciesReportTaskV2 : DirectoryOutputTask() { } task.artifactIds.set(artifactIds) task.includeReport.set(includeReport) - output?.let { task.output.set(it) } + if (output != null) { + task.output.set(output) + } else { + task.output.set( + project.layout.buildDirectory.dir( + "generated${File.separator}sentry${File.separator}dependencies$taskSuffix" + ) + ) + } task.withSentryTelemetry(extension, sentryTelemetryProvider) } }