diff --git a/CHANGELOG.md b/CHANGELOG.md index 28d32d73..ca7372cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ - [changelog](https://github.com/getsentry/sentry-cli/blob/master/CHANGELOG.md#230) - [diff](https://github.com/getsentry/sentry-cli/compare/1.72.0...2.3.0) +### Fixes + +- Skip jar processing on AGP < 7.1.2 for signed multi release jars ([#334](https://github.com/getsentry/sentry-android-gradle-plugin/pull/334)) + ## 3.1.2 ### Features diff --git a/plugin-build/src/main/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransform.kt b/plugin-build/src/main/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransform.kt index 734fa278..b508824f 100644 --- a/plugin-build/src/main/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransform.kt +++ b/plugin-build/src/main/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransform.kt @@ -1,6 +1,9 @@ package io.sentry.android.gradle.transforms +import io.sentry.android.gradle.SentryPlugin +import io.sentry.android.gradle.util.warn import java.io.File +import java.nio.file.Files import java.util.jar.Attributes import java.util.jar.JarEntry import java.util.jar.JarFile @@ -50,9 +53,13 @@ abstract class MetaInfStripTransform : TransformAction + tmpOutputFile.jarOutputStream().use { outStream -> val entries = jarFile.entries() // copy each .jar entry, except those that are under META-INF/versions/${unsupported_java_version} while (entries.hasMoreElements()) { @@ -63,6 +70,19 @@ abstract class MetaInfStripTransform : TransformAction= 7.1.2 (https://developer.android.com/studio/releases/gradle-plugin) in order to keep using `autoInstrumentation` option. + """.trimIndent() + } + tmpOutputFile.delete() + outputs.file(inputArtifact) + return + } + if (jarEntry.name.startsWith(versionsDir, ignoreCase = true)) { val javaVersion = jarEntry.javaVersion if (javaVersion > MIN_SUPPORTED_JAVA_VERSION) { @@ -88,17 +108,23 @@ abstract class MetaInfStripTransform : TransformAction= 7.1.2" in result.output } + assertTrue { "BUILD SUCCESSFUL" in result.output } + } + override val additionalRootProjectConfig: String = "" } diff --git a/plugin-build/src/test/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransformTest.kt b/plugin-build/src/test/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransformTest.kt index 0d0456ba..f9b2f058 100644 --- a/plugin-build/src/test/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransformTest.kt +++ b/plugin-build/src/test/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransformTest.kt @@ -31,12 +31,14 @@ class MetaInfStripTransformTest { tmpDir: TemporaryFolder, jarName: String = "test.jar", multiRelease: Boolean = true, - includeSupportedVersion: Boolean = false + includeSupportedVersion: Boolean = false, + signed: Boolean = false ): MetaInfStripTransform { val file = tmpDir.newFile(jarName) val jar = file.toJar( multiRelease = multiRelease, - includeSupportedVersion = includeSupportedVersion + includeSupportedVersion = includeSupportedVersion, + signed = signed ) whenever(provider.get()).thenReturn(RegularFile { jar }) @@ -44,7 +46,11 @@ class MetaInfStripTransformTest { return TestMetaInfStripTransform(provider) } - private fun File.toJar(multiRelease: Boolean, includeSupportedVersion: Boolean): File { + private fun File.toJar( + multiRelease: Boolean, + includeSupportedVersion: Boolean, + signed: Boolean + ): File { JarOutputStream(outputStream()).use { // normal classpath it.putNextEntry(ZipEntry("com/squareup/moshi/Types.class")) @@ -100,6 +106,11 @@ class MetaInfStripTransformTest { ) it.closeEntry() } + + if (signed) { + it.putNextEntry(ZipEntry("META-INF/SIGNING_FILE.SF")) + it.putNextEntry(ZipEntry("META-INF/SIGNING_FILE.DSA")) + } } // manifest @@ -154,6 +165,7 @@ class MetaInfStripTransformTest { val outputs = FakeTransformOutputs(tmp) val sut = fixture.getSut(tmp) + sut.transform(outputs) val jar = JarFile(outputs.outputFile) @@ -218,4 +230,17 @@ class MetaInfStripTransformTest { } return entries } + + @Test + fun `when multi-release signed-jar, skip transform`() { + val outputs = FakeTransformOutputs(tmp) + + val sut = fixture.getSut(tmp, includeSupportedVersion = true, signed = true) + sut.transform(outputs) + + val jar = JarFile(outputs.outputFile) + + assertTrue { jar.read().any { it.key.startsWith("META-INF/versions/16") } } + assertTrue { outputs.outputFile.name == "test.jar" } + } }