import org.gradle.api.* import org.gradle.api.artifacts.transform.InputArtifact import org.gradle.api.artifacts.transform.TransformAction import org.gradle.api.artifacts.transform.TransformOutputs import org.gradle.api.artifacts.transform.TransformParameters import org.gradle.api.attributes.* import org.gradle.api.file.FileSystemLocation import org.gradle.api.provider.Provider import org.gradle.kotlin.dsl.* import java.io.File import java.nio.file.Files import java.util.zip.ZipEntry import java.util.zip.ZipFile // Attributes used by aar dependencies val artifactType = Attribute.of("artifactType", String::class.java) val unpackedAar = Attribute.of("unpackedAar", Boolean::class.javaObjectType) fun Project.configureAar() = configurations.configureEach { afterEvaluate { if (isCanBeResolved && !isCanBeConsumed) { attributes.attribute(unpackedAar, true) // request all AARs to be unpacked } } } fun DependencyHandlerScope.configureAarUnpacking() { attributesSchema { attribute(unpackedAar) } artifactTypes { create("aar") { attributes.attribute(unpackedAar, false) } } registerTransform(UnpackAar::class.java) { from.attribute(unpackedAar, false).attribute(artifactType, "aar") to.attribute(unpackedAar, true).attribute(artifactType, "jar") } } @Suppress("UnstableApiUsage") abstract class UnpackAar : TransformAction { @get:InputArtifact abstract val inputArtifact: Provider override fun transform(outputs: TransformOutputs) { ZipFile(inputArtifact.get().asFile).use { zip -> zip.entries().asSequence() .filter { !it.isDirectory } .filter { it.name.endsWith(".jar") } .forEach { zip.unzip(it, outputs.file(it.name)) } } } } private fun ZipFile.unzip(entry: ZipEntry, output: File) { getInputStream(entry).use { Files.copy(it, output.toPath()) } }