I want to get a class graph (including jars in dependencies) to build full classes hierarchy. The hierarchy help to do some bytecode operation by ASM in my custom TransformAction. I tried ArtifactView but it will lead Cannot change attributes of dependency configuration ':app:releaseRuntime' after it has been resolved
val minified = Attribute.of("minified", Boolean::class.javaObjectType)
val keepPatterns = mapOf(
"guava" to setOf(
"com.google.common.base.Optional",
"com.google.common.base.AbstractIterator"
)
)
project.dependencies.attributesSchema {
it.attribute(minified)
}
project.dependencies.artifactTypes.getByName("jar") {
it.attributes.attribute(minified, false)
}
project.configurations.all { conf ->
project.afterEvaluate {
if (conf.isCanBeResolved) {
conf.attributes.attribute(minified, true)
}
}
}
project.dependencies.registerTransform(Minify::class.java) { spec ->
spec.from.attribute(minified, false)
.attribute(ARTIFACT_FORMAT, "jar")
spec.to.attribute(minified, true).attribute(
ARTIFACT_FORMAT,
"jar"
)
spec.parameters {
it.keepClassesByArtifact = keepPatterns
}
}
project.afterEvaluate {
project.extensions.getByType(AppExtension::class.java).applicationVariants.all { variant ->
getArtifactCollection(variant.runtimeConfiguration).forEach {
println("=== artifact:" + it)
}
}
}
private fun getArtifactCollection(configuration: Configuration): FileCollection =
configuration.incoming.artifactView { config ->
config.attributes {
it.attribute(
ArtifactAttributes.ARTIFACT_FORMAT,
ArtifactTypeDefinition.JAR_TYPE
)
}
}.artifacts.artifactFiles