blob: 69c93ca8253e464b5f449149cfd137d0ca96ee4a [file] [log] [blame]
package com.android.build.gradle.tasks.factory;
import static com.android.builder.core.VariantType.LIBRARY;
import static com.android.builder.core.VariantType.UNIT_TEST;
import com.android.build.gradle.internal.CompileOptions;
import com.android.build.gradle.internal.scope.ConventionMappingHelper;
import com.android.build.gradle.internal.scope.TaskConfigAction;
import com.android.build.gradle.internal.scope.VariantScope;
import com.android.build.gradle.internal.variant.BaseVariantData;
import com.android.builder.dependency.LibraryDependency;
import com.google.common.base.Joiner;
import org.gradle.api.Project;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.compile.JavaCompile;
import java.io.File;
import java.util.concurrent.Callable;
/**
* Configuration Action for a JavaCompile task.
*/
public class JavaCompileConfigAction implements TaskConfigAction<JavaCompile> {
private VariantScope scope;
public JavaCompileConfigAction(VariantScope scope) {
this.scope = scope;
}
@Override
public String getName() {
return scope.getTaskName("compile", "JavaWithJavac");
}
@Override
public Class<JavaCompile> getType() {
return JavaCompile.class;
}
@Override
public void execute(final JavaCompile javacTask) {
final BaseVariantData testedVariantData = scope.getTestedVariantData();
scope.getVariantData().javacTask = javacTask;
javacTask.setSource(scope.getVariantData().getJavaSources());
ConventionMappingHelper.map(javacTask, "classpath", new Callable<FileCollection>() {
@Override
public FileCollection call() {
FileCollection classpath = scope.getJavaClasspath();
Project project = scope.getGlobalScope().getProject();
if (testedVariantData != null) {
// For libraries, the classpath from androidBuilder includes the library
// output (bundle/classes.jar) as a normal dependency. In unit tests we
// don't want to package the jar at every run, so we use the *.class
// files instead.
if (!testedVariantData.getType().equals(LIBRARY)
|| scope.getVariantData().getType().equals(UNIT_TEST)) {
classpath = classpath.plus(project.files(
testedVariantData.getScope().getJavaClasspath(),
testedVariantData.getScope().getJavaOutputDir(),
testedVariantData.getScope().getJavaDependencyCache()));
}
if (scope.getVariantData().getType().equals(UNIT_TEST)
&& testedVariantData.getType().equals(LIBRARY)) {
// The bundled classes.jar may exist, but it's probably old. Don't
// use it, we already have the *.class files in the classpath.
LibraryDependency libraryDependency =
testedVariantData.getVariantConfiguration().getOutput();
if (libraryDependency != null) {
File jarFile = libraryDependency.getJarFile();
classpath = classpath.minus(project.files(jarFile));
}
}
}
return classpath;
}
});
javacTask.setDestinationDir(scope.getJavaOutputDir());
javacTask.setDependencyCacheDir(scope.getJavaDependencyCache());
CompileOptions compileOptions = scope.getGlobalScope().getExtension().getCompileOptions();
AbstractCompilesUtil.configureLanguageLevel(
javacTask,
compileOptions,
scope.getGlobalScope().getExtension().getCompileSdkVersion()
);
javacTask.getOptions().setEncoding(compileOptions.getEncoding());
javacTask.getOptions().setBootClasspath(
Joiner.on(File.pathSeparator).join(
scope.getGlobalScope().getAndroidBuilder().getBootClasspathAsStrings()));
}
}