产物转换 (Artifact Transforms)
Artifact Transform 是 Gradle 中一种非常强大的机制,它允许你定义一种“转换规则”,在依赖项从仓库下载下来、提供给某个 Task 之前,自动对其进行处理。
1. 为什么需要它?
普通的 Task 只能处理项目内部的源码。但如果你想处理第三方依赖 (AAR/Jar) 内部的内容(比如:在编译前把所有第三方库里的图片都转成 WebP),传统的做法非常困难。
Artifact Transform 完美解决了这个问题:它按需执行,且具有完美的缓存支持。
2. 实现一个 Transform
假设我们要实现一个将所有 .jar 文件解压为目录的转换器。
kotlin
abstract class UnzipTransform : TransformAction<TransformParameters.None> {
@get:InputArtifact
abstract val inputArtifact: Provider<FileSystemLocation>
override fun transform(outputs: TransformOutputs) {
val inputFile = inputArtifact.get().asFile
val outputDir = outputs.dir(inputFile.nameWithoutExtension)
// 执行解压逻辑...
unzip(inputFile, outputDir)
}
}kotlin
// 在插件或 build.gradle.kts 中
dependencies {
registerTransform(UnzipTransform::class) {
from.attribute(Attribute.of("artifactType", String::class.java), "jar")
to.attribute(Attribute.of("artifactType", String::class.java), "unzipped-jar")
}
}3. 典型应用场景
- 脱糖 (Desugaring): AGP 内部大量使用此技术处理 Java 8 特性。
- 资源处理: 自动压缩 AAR 中的 WebP 资源。
- 代码分析: 在依赖库被引用前,提取其内部的混淆映射表。
4. 优势:极致的性能
Transform 是由 Gradle 运行时管理的。如果两项任务都需要某个转换后的产物,它们会共享同一个转换结果(缓存),而不需要重复计算。