Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Skip jar processing on AGP < 7.1.2 if it is a signed multi release jaโ€ฆ #334

Merged
merged 11 commits into from Jul 5, 2022
4 changes: 4 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### 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
Expand Down
Expand Up @@ -20,6 +20,7 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import java.util.logging.Logger

/**
* Gradle's [TransformAction] that strips out unsupported Java classes from
Expand Down Expand Up @@ -63,6 +64,13 @@ abstract class MetaInfStripTransform : TransformAction<MetaInfStripTransform.Par
continue
}

if (jarEntry.isSignatureEntry) {
logger.warning("Signed Multirelease Jar (${jarFile.name}) found, skipping transform. This might lead to duplicate class errors due to a bug in AGP (https://issuetracker.google.com/issues/206655905). Please update to AGP >= 7.1.2 (https://developer.android.com/studio/releases/gradle-plugin)")
romtsn marked this conversation as resolved.
Show resolved Hide resolved
output.delete()
outputs.file(inputArtifact)
return
}

if (jarEntry.name.startsWith(versionsDir, ignoreCase = true)) {
val javaVersion = jarEntry.javaVersion
if (javaVersion > MIN_SUPPORTED_JAVA_VERSION) {
Expand Down Expand Up @@ -93,12 +101,16 @@ abstract class MetaInfStripTransform : TransformAction<MetaInfStripTransform.Par
}
}

private val JarEntry.isSignatureEntry get() = signatureRelevantFileRegex.matches(name)

private val JarEntry.javaVersion: Int get() = regex.find(name)?.value?.toIntOrNull() ?: 0

private fun File.jarOutputStream(): JarOutputStream = JarOutputStream(outputStream())

companion object {
private val regex = "(?<=/)([0-9]*)(?=/)".toRegex()
private val signatureRelevantFileRegex = "^META-INF/.*.SF|^META-INF/.*.DSA|^META-INF/.*.RSA|^META-INF/.*.EC|^META-INF/SIG-.*".toRegex()
private val logger = Logger.getLogger(MetaInfStripTransform::class.java.simpleName)
private const val versionsDir = "META-INF/versions/"
private const val MIN_SUPPORTED_JAVA_VERSION = 11

Expand Down
Expand Up @@ -31,20 +31,22 @@ class MetaInfStripTransformTest {
tmpDir: TemporaryFolder,
jarName: String = "test.jar",
multiRelease: Boolean = true,
includeSupportedVersion: Boolean = false
includeSupportedVersion: Boolean = false,
mimicSignedJar: Boolean = false
): MetaInfStripTransform {
val file = tmpDir.newFile(jarName)
val jar = file.toJar(
multiRelease = multiRelease,
includeSupportedVersion = includeSupportedVersion
includeSupportedVersion = includeSupportedVersion,
mimicSignedJar = mimicSignedJar
)

whenever(provider.get()).thenReturn(RegularFile { jar })

return TestMetaInfStripTransform(provider)
}

private fun File.toJar(multiRelease: Boolean, includeSupportedVersion: Boolean): File {
private fun File.toJar(multiRelease: Boolean, includeSupportedVersion: Boolean, mimicSignedJar: Boolean): File {
romtsn marked this conversation as resolved.
Show resolved Hide resolved
JarOutputStream(outputStream()).use {
// normal classpath
it.putNextEntry(ZipEntry("com/squareup/moshi/Types.class"))
Expand Down Expand Up @@ -100,6 +102,11 @@ class MetaInfStripTransformTest {
)
it.closeEntry()
}

if (mimicSignedJar) {
it.putNextEntry(ZipEntry("META-INF/SIGNING_FILE.SF"))
it.putNextEntry(ZipEntry("META-INF/SIGNING_FILE.DSA"))
}
}

// manifest
Expand Down Expand Up @@ -154,6 +161,7 @@ class MetaInfStripTransformTest {
val outputs = FakeTransformOutputs(tmp)

val sut = fixture.getSut(tmp)

sut.transform(outputs)

val jar = JarFile(outputs.outputFile)
Expand Down Expand Up @@ -218,4 +226,18 @@ class MetaInfStripTransformTest {
}
return entries
}

@Test
fun `when multi-release signed-jar, skip transform`() {

val outputs = FakeTransformOutputs(tmp)

val sut = fixture.getSut(tmp, includeSupportedVersion = true, mimicSignedJar = 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" }
}
}