blob: cb722dc6013a16c1f615c113d28e47c1952d7891 [file] [edit]
// Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import javax.inject.Inject
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations
@CacheableTask
public abstract class SwissArmyKnifeTask : DefaultTask() {
@get:Inject public abstract val execOperations: ExecOperations
@get:Classpath public abstract val swissArmyKnifeClasspath: ConfigurableFileCollection
@get:Input public abstract val compiler: Property<String>
@get:[Optional Classpath]
public abstract val inputFiles: ConfigurableFileCollection
@get:[Optional Classpath]
public abstract val inputNoResFiles: ConfigurableFileCollection
@get:[Optional Classpath]
public abstract val libs: ConfigurableFileCollection
@get:[Optional Classpath]
public abstract val targets: ConfigurableFileCollection
@get:[Optional Classpath]
public abstract val sources: ConfigurableFileCollection
@get:[Optional Classpath]
public abstract val classpath: ConfigurableFileCollection
@get:[Optional InputFiles PathSensitive(PathSensitivity.NONE)]
public abstract val pgConfigs: ConfigurableFileCollection
@get:[Optional Classpath]
public abstract val jar: RegularFileProperty
@get:Input
public val obfuscateAllEnums: Property<Boolean> =
project.objects.property(Boolean::class.java).convention(false)
@get:OutputFile public abstract val outputFile: RegularFileProperty
@get:Input public abstract val extraArgs: ListProperty<String>
@TaskAction
public fun relocate() {
execOperations.javaexec {
classpath = swissArmyKnifeClasspath
jvmArgs = listOf("-Xmx8g", "-ea")
mainClass.set("com.android.tools.r8.SwissArmyKnife")
if (obfuscateAllEnums.get()) {
systemProperty("com.android.tools.r8.tracereferences.obfuscateAllEnums", true)
}
val myArgs = mutableListOf(compiler.get())
myArgs.addAll(inputFiles.flatMap { listOf("--input", it.absolutePath) })
myArgs.addAll(inputNoResFiles.flatMap { listOf("--input-no-res", it.absolutePath) })
myArgs.addAll(libs.flatMap { listOf("--lib", it.absolutePath) })
myArgs.addAll(targets.flatMap { listOf("--target", it.absolutePath) })
myArgs.addAll(sources.flatMap { listOf("--source", it.absolutePath) })
myArgs.addAll(
this@SwissArmyKnifeTask.classpath.flatMap { listOf("--classpath", it.absolutePath) }
)
myArgs.addAll(pgConfigs.flatMap { listOf("--pg-conf", it.absolutePath) })
myArgs.add("--output")
myArgs.add(outputFile.get().asFile.absolutePath)
myArgs.addAll(extraArgs.get())
if (jar.isPresent) {
myArgs.add(jar.get().asFile.absolutePath)
}
args = myArgs
}
}
}