From 6b5bcd9efcc6fd077e9b5ff0fdf7f3cda8e0c4e4 Mon Sep 17 00:00:00 2001 From: Lukas Bloder Date: Tue, 5 Jul 2022 11:53:24 +0200 Subject: [PATCH] =?UTF-8?q?Skip=20jar=20processing=20on=20AGP=20<=207.1.2?= =?UTF-8?q?=20if=20it=20is=20a=20signed=20multi=20release=20ja=E2=80=A6=20?= =?UTF-8?q?(#334)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Skip jar processing on AGP < 7.1.2 if it is a signed multi release jar, show warning to the user with hint to upgrade AGP * revert wrong test name * add changelog entry * fix formatting issues * fix build error when used in actual build pipeline. add testcase to SentryPluginMRJarTest * Update plugin-build/src/main/kotlin/io/sentry/android/gradle/transforms/MetaInfStripTransform.kt * fix formatting Co-authored-by: Roman Zavarnitsyn --- CHANGELOG.md | 4 +++ .../transforms/MetaInfStripTransform.kt | 30 ++++++++++++++++-- .../android/gradle/SentryPluginMRJarTest.kt | 28 +++++++++++++++++ .../transforms/MetaInfStripTransformTest.kt | 31 +++++++++++++++++-- 4 files changed, 88 insertions(+), 5 deletions(-) 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" } + } }