Skip to content

产物转换 (Artifact Transforms)

源: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. 典型应用场景

  1. 脱糖 (Desugaring): AGP 内部大量使用此技术处理 Java 8 特性。
  2. 资源处理: 自动压缩 AAR 中的 WebP 资源。
  3. 代码分析: 在依赖库被引用前,提取其内部的混淆映射表。

4. 优势:极致的性能

Transform 是由 Gradle 运行时管理的。如果两项任务都需要某个转换后的产物,它们会共享同一个转换结果(缓存),而不需要重复计算。