• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
3  */
4 
5 import org.gradle.api.*
6 import org.gradle.api.artifacts.transform.InputArtifact
7 import org.gradle.api.artifacts.transform.TransformAction
8 import org.gradle.api.artifacts.transform.TransformOutputs
9 import org.gradle.api.artifacts.transform.TransformParameters
10 import org.gradle.api.attributes.*
11 import org.gradle.api.file.FileSystemLocation
12 import org.gradle.api.provider.Provider
13 import org.gradle.kotlin.dsl.*
14 import java.io.File
15 import java.nio.file.Files
16 import java.util.zip.ZipEntry
17 import java.util.zip.ZipFile
18 
19 // Attributes used by aar dependencies
20 val artifactType = Attribute.of("artifactType", String::class.java)
21 val unpackedAar = Attribute.of("unpackedAar", Boolean::class.javaObjectType)
22 
23 fun Project.configureAar() = configurations.configureEach {
24     afterEvaluate {
25         if (isCanBeResolved && !isCanBeConsumed) {
26             attributes.attribute(unpackedAar, true) // request all AARs to be unpacked
27         }
28     }
29 }
30 
configureAarUnpackingnull31 fun DependencyHandlerScope.configureAarUnpacking() {
32     attributesSchema {
33         attribute(unpackedAar)
34     }
35 
36     artifactTypes {
37         create("aar") {
38             attributes.attribute(unpackedAar, false)
39         }
40     }
41 
42     registerTransform(UnpackAar::class.java) {
43         from.attribute(unpackedAar, false).attribute(artifactType, "aar")
44         to.attribute(unpackedAar, true).attribute(artifactType, "jar")
45     }
46 }
47 
48 @Suppress("UnstableApiUsage")
49 abstract class UnpackAar : TransformAction<TransformParameters.None> {
50     @get:InputArtifact
51     abstract val inputArtifact: Provider<FileSystemLocation>
52 
transformnull53     override fun transform(outputs: TransformOutputs) {
54         ZipFile(inputArtifact.get().asFile).use { zip ->
55             zip.entries().asSequence()
56                 .filter { !it.isDirectory }
57                 .filter { it.name.endsWith(".jar") }
58                 .forEach { zip.unzip(it, outputs.file(it.name)) }
59         }
60     }
61 }
62 
ZipFilenull63 private fun ZipFile.unzip(entry: ZipEntry, output: File) {
64     getInputStream(entry).use {
65         Files.copy(it, output.toPath())
66     }
67 }
68