# ArtifactTransformationRequest

[View Source](https://cs.android.com/search?q=file:com/android/build/api/artifact/ArtifactTransformationRequest.kt+class:com.android.build.api.artifact.ArtifactTransformationRequest) Added in 4.2.0


```
interface ArtifactTransformationRequest<TaskT : Task>
```

<br />

*** ** * ** ***

When a `https://docs.gradle.org/current/javadoc/org/gradle/api/file/Directory.html` contains more than one artifact (for example, consider `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/artifact/SingleArtifact.APK` with multiple APKs for different screen densities), this object will abstract away having to deal with `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifacts` and manually load and write the metadata files.

Instead, users can focus on writing transformation code that transform one file at at time into a newer version. It will also provide the ability to use Gradle's `https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkQueue.html` to multi-thread the transformations.

Here is an example of a `https://docs.gradle.org/current/javadoc/org/gradle/api/Task.html` copying (unchanged) the APK files from one location to another.

```
// parameter interface to pass to work items.
interface WorkItemParameters: WorkParameters, Serializable {
   val inputApkFile: RegularFileProperty
   val outputApkFile: RegularFileProperty
}
```

```
// work item that copies one file at a time.
abstract class WorkItem @Inject constructor(
     private val workItemParameters: WorkItemParameters
): WorkAction<WorkItemParameters> {

   override fun execute() {
     workItemParameters.inputApkFile.asFile.get().copyTo(
     workItemParameters.outputApkFile.get().asFile)
   }
}
```

And the task that wires things together:

```
abstract class CopyApksTask @Inject constructor(private val workers: WorkerExecutor): DefaultTask() {

@get:InputFiles
abstract val apkFolder: DirectoryProperty

@get:OutputDirectory
abstract val outFolder: DirectoryProperty

@get:Internal
abstract val transformationRequest: Property<ArtifactTransformationRequest<CopyApksTask>>

@TaskAction
fun taskAction() {
 transformationRequest.get().submit(
    this,
    workers.noIsolation(),
    WorkItem::class.java) {
    builtArtifact: BuiltArtifact,
    outputLocation: Directory,
    param: WorkItemParameters ->
      val inputFile = File(builtArtifact.outputFile)
      param.inputApkFile.set(inputFile)
      param.outputApkFile.set(File(outputLocation.asFile, inputFile.name))
      param.outputApkFile.get().asFile
    }
  }
}
```

## Summary

| ### Public functions |
|---|---|
| `https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/artifact/ArtifactTransformationRequest#submit(org.gradle.api.Task,kotlin.Function1)(task: TaskT, transformer: (input: https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact) -> https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/File.html)` Submit a lambda to process each input `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact` object synchronously. |
| `java.util.function.Supplier<https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifacts>` | `<ParamT : https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkParameters.html> https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/artifact/ArtifactTransformationRequest#submit(org.gradle.api.Task,org.gradle.workers.WorkQueue,java.lang.Class,kotlin.Function3)( task: TaskT, workQueue: https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkQueue.html, actionType: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Class.html<https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkAction.html<ParamT>>, parameterConfigurator: (builtArtifact: https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact, outputLocation: https://docs.gradle.org/current/javadoc/org/gradle/api/file/Directory.html, parameters) -> https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/File.html )` Submit a `org.gradle.workers` style of `https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkAction.html` to process each input `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact`. |

## Public functions

### submit

```
fun submit(task: TaskT, transformer: (input: BuiltArtifact) -> File): Unit
```

Submit a lambda to process each input `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact` object synchronously.

### submit

```
fun <ParamT : WorkParameters> submit(
    task: TaskT,
    workQueue: WorkQueue,
    actionType: Class<WorkAction<ParamT>>,
    parameterConfigurator: (builtArtifact: BuiltArtifact, outputLocation: Directory, parameters) -> File
): java.util.function.Supplier<BuiltArtifacts>
```

Submit a `org.gradle.workers` style of `https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkAction.html` to process each input `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact`.

| Parameters |
|---|---|
| `task: TaskT` | The Task initiating the `https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkQueue.html` requests. |
| `workQueue: https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkQueue.html` | The Gradle `https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkQueue.html` instance to use to spawn worker items with. |
| `actionType: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Class.html<https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkAction.html<ParamT>>` | The type of the `https://docs.gradle.org/current/javadoc/org/gradle/workers/WorkAction.html` subclass that process that input `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact`. |
| `parameterConfigurator: (builtArtifact: https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact, outputLocation: https://docs.gradle.org/current/javadoc/org/gradle/api/file/Directory.html, parameters) -> https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/File.html` | The lambda to configure instances of parameterType for each `https://developer.android.com/reference/tools/gradle-api/9.6/com/android/build/api/variant/BuiltArtifact`. |