blob: dd4e10c900e78b82f81b77cb9584316e61f7fffa [file] [log] [blame]
// Copyright (c) 2019, 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.
package smali;
import static java.util.stream.Collectors.toList;
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;
import javax.inject.Inject;
import org.gradle.api.DefaultTask;
import org.gradle.api.file.FileTree;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import org.gradle.workers.WorkAction;
import org.gradle.workers.WorkParameters;
import org.gradle.workers.WorkerExecutor;
import org.jf.smali.Smali;
import org.jf.smali.SmaliOptions;
public class SmaliTask extends DefaultTask {
private final WorkerExecutor workerExecutor;
private FileTree source;
private File destination;
@Inject
public SmaliTask(WorkerExecutor workerExecutor) {
this.workerExecutor = workerExecutor;
}
@InputFiles
public FileTree getSource() {
return source;
}
public void setSource(FileTree source) {
this.source = source;
}
@OutputFile
public File getDestination() {
return destination;
}
public void setDestination(File destination) {
this.destination = destination;
}
@TaskAction
void exec() {
workerExecutor
.noIsolation()
.submit(
RunSmali.class,
parameters -> {
parameters.getSources().set(source.getFiles());
parameters.getDestination().set(destination);
});
}
public interface RunSmaliParameters extends WorkParameters {
SetProperty<File> getSources();
RegularFileProperty getDestination();
}
public abstract static class RunSmali implements WorkAction<RunSmaliParameters> {
@Override
public void execute() {
try {
RunSmaliParameters parameters = getParameters();
List<String> fileNames =
parameters.getSources().get().stream().map(File::toString).collect(toList());
SmaliOptions options = new SmaliOptions();
options.outputDexFile = parameters.getDestination().getAsFile().get().getCanonicalPath();
Smali.assemble(options, fileNames);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
}